001    /*
002     * $Id: GFGenPolynomialTest.java 1888 2008-07-12 13:37:34Z kredel $
003     */
004    
005    package edu.jas.poly;
006    
007    import junit.framework.Test;
008    import junit.framework.TestCase;
009    import junit.framework.TestSuite;
010    
011    //import edu.jas.structure.RingElem;
012    
013    //import edu.jas.arith.BigRational;
014    import edu.jas.arith.ModInteger;
015    import edu.jas.arith.ModIntegerRing;
016    
017    import edu.jas.poly.GenPolynomial;
018    import edu.jas.poly.AlgebraicNumber;
019    import edu.jas.poly.AlgebraicNumberRing;
020    
021    
022    /**
023     * Galois field coefficients GenPolynomial tests with JUnit.
024     * @author Heinz Kredel.
025     */
026    
027    public class GFGenPolynomialTest extends TestCase {
028    
029    /**
030     * main.
031     */
032       public static void main (String[] args) {
033              junit.textui.TestRunner.run( suite() );
034       }
035    
036    /**
037     * Constructs a <CODE>GFGenPolynomialTest</CODE> object.
038     * @param name String.
039     */
040       public GFGenPolynomialTest(String name) {
041              super(name);
042       }
043    
044    /**
045     * suite.
046     */ 
047     public static Test suite() {
048         TestSuite suite= new TestSuite(GFGenPolynomialTest.class);
049         return suite;
050       }
051    
052       //private final static int bitlen = 100;
053    
054       GenPolynomialRing<AlgebraicNumber<ModInteger>> fac;
055       AlgebraicNumberRing<ModInteger> cfac;
056    
057       GenPolynomial<AlgebraicNumber<ModInteger>> a;
058       GenPolynomial<AlgebraicNumber<ModInteger>> b;
059       GenPolynomial<AlgebraicNumber<ModInteger>> c;
060       GenPolynomial<AlgebraicNumber<ModInteger>> d;
061       GenPolynomial<AlgebraicNumber<ModInteger>> e;
062    
063       int rl = 7; 
064       int kl = 10;
065       int ll = 8;
066       int el = 5;
067       float q = 0.5f;
068    
069       protected long getPrime() {
070           long prime = 2; //2^60-93; // 2^30-35; //19; knuth (2,390)
071           for ( int i = 1; i < 60; i++ ) {
072               prime *= 2;
073           }
074           prime -= 93;
075           //System.out.println("prime = " + prime);
076           return prime;
077       }
078    
079       protected void setUp() {
080           a = b = c = d = e = null;
081           long prime = getPrime();
082           ModIntegerRing r = new ModIntegerRing(prime);
083           // univariate minimal polynomial
084           GenPolynomialRing<ModInteger> mfac =  
085               new GenPolynomialRing<ModInteger>(r,1);
086           GenPolynomial<ModInteger> modul = mfac.random(5); 
087           while ( modul.isZERO() || modul.isUnit() || modul.isConstant() ) {
088                 modul = mfac.random(5); 
089           }
090           cfac = new AlgebraicNumberRing<ModInteger>( modul.monic() );
091           fac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(cfac,rl);
092       }
093    
094       protected void tearDown() {
095           a = b = c = d = e = null;
096           fac = null;
097       }
098    
099    
100    /**
101     * Test constructor and toString.
102     * 
103     */
104     public void testConstruction() {
105         c = fac.getONE();
106         //System.out.println("c = " + c);
107         assertTrue("length( c ) = 1", c.length() == 1);
108         assertTrue("isZERO( c )c"+c, !c.isZERO() );
109         assertTrue("isONE( c ) "+c, c.isONE() );
110    
111         d = fac.getZERO();
112         //System.out.println("d = " + d);
113         assertTrue("length( d ) = 0", d.length() == 0);
114         assertTrue("isZERO( d )", d.isZERO() );
115         assertTrue("isONE( d )", !d.isONE() );
116     }
117    
118    
119    /**
120     * Test random polynomial.
121     * 
122     */
123     public void testRandom() {
124         for (int i = 0; i < 7; i++) {
125             a = fac.random(ll+i);
126             //System.out.println("a = " + a);
127    
128                 // fac.random(rl+i, kl*(i+1), ll+2*i, el+i, q );
129             assertTrue("length( a"+i+" ) <> 0", a.length() >= 0);
130             assertTrue(" not isZERO( a"+i+" )", !a.isZERO() );
131             assertTrue(" not isONE( a"+i+" )", !a.isONE() );
132         }
133     }
134    
135    
136    /**
137     * Test addition.
138     * 
139     */
140     public void testAddition() {
141    
142         a = fac.random(ll);
143         b = fac.random(ll);
144    
145         c = a.sum(b);
146         d = c.subtract(b);
147         assertEquals("a+b-b = a",a,d);
148    
149         c = fac.random(ll);
150    
151         ExpVector u = ExpVector.EVRAND(rl,el,q);
152         AlgebraicNumber<ModInteger> x = cfac.random(kl);
153    
154         b = new GenPolynomial<AlgebraicNumber<ModInteger>>(fac, x, u);
155         c = a.sum(b);
156         d = a.sum(x,u);
157         assertEquals("a+p(x,u) = a+(x,u)",c,d);
158    
159         c = a.subtract(b);
160         d = a.subtract(x,u);
161         assertEquals("a-p(x,u) = a-(x,u)",c,d);
162    
163         a = new GenPolynomial<AlgebraicNumber<ModInteger>>(fac);
164         b = new GenPolynomial<AlgebraicNumber<ModInteger>>(fac,x, u);
165         c = b.sum(a);
166         d = a.sum(x,u);
167         assertEquals("a+p(x,u) = a+(x,u)",c,d);
168    
169         c = a.subtract(b);
170         d = a.subtract(x,u);
171         assertEquals("a-p(x,u) = a-(x,u)",c,d);
172    
173    
174         c = fac.random(ll);
175         d = c.sum( a.sum(b) );
176         e = c.sum( a ).sum(b);
177         assertEquals("c+(a+b) = (c+a)+b",d,e);
178    
179         c = a.sum( fac.getZERO() );
180         d = a.subtract( fac.getZERO() );
181         assertEquals("a+0 = a-0",c,d);
182    
183         c = fac.getZERO().sum( a );
184         d = fac.getZERO().subtract( a.negate() );
185         assertEquals("0+a = 0+(-a)",c,d);
186     }
187    
188    
189    /**
190     * Test object multiplication.
191     * 
192     */
193    
194     public void testMultiplication() {
195    
196         a = fac.random(ll);
197         assertTrue("not isZERO( a )", !a.isZERO() );
198    
199         b = fac.random(ll);
200         assertTrue("not isZERO( b )", !b.isZERO() );
201    
202         c = b.multiply(a);
203         d = a.multiply(b);
204         assertTrue("not isZERO( c )", !c.isZERO() );
205         assertTrue("not isZERO( d )", !d.isZERO() );
206    
207         //System.out.println("a = " + a);
208         //System.out.println("b = " + b);
209         e = d.subtract(c);
210         assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() );
211    
212         assertTrue("a*b = b*a", c.equals(d) );
213         assertEquals("a*b = b*a",c,d);
214    
215         c = fac.random(ll);
216         //System.out.println("c = " + c);
217         d = a.multiply( b.multiply(c) );
218         e = (a.multiply(b)).multiply(c);
219    
220         //System.out.println("d = " + d);
221         //System.out.println("e = " + e);
222    
223         //System.out.println("d-e = " + d.subtract(c) );
224    
225         assertEquals("a(bc) = (ab)c",d,e);
226         assertTrue("a(bc) = (ab)c", d.equals(e) );
227    
228         AlgebraicNumber<ModInteger> z = a.leadingBaseCoefficient();
229         //System.out.println("z = " + z);
230         if ( z.isUnit() ) {
231            AlgebraicNumber<ModInteger> x = z.inverse();
232            //System.out.println("x = " + x);
233            //System.out.println("a = " + a);
234            c = a.monic();
235            //System.out.println("c = " + c);
236            d = a.multiply(x);
237            //System.out.println("d = " + d);
238            assertEquals("a.monic() = a(1/ldcf(a))",c,d);
239         }
240    
241         AlgebraicNumber<ModInteger> y = b.leadingBaseCoefficient();
242         if ( y.isUnit() ) {
243             y = y.inverse();
244             c = b.monic();
245             d = b.multiply(y);
246             assertEquals("b.monic() = b(1/ldcf(b))",c,d);
247    
248             e = new GenPolynomial<AlgebraicNumber<ModInteger>>(fac,y);
249             d = b.multiply(e);
250             assertEquals("b.monic() = b(1/ldcf(b))",c,d);
251    
252             d = e.multiply(b);
253             assertEquals("b.monic() = (1/ldcf(b))*b",c,d);
254         }
255     }
256    
257    
258    /**
259     * Test distributive law.
260     * 
261     */
262     public void testDistributive() {
263         a = fac.random( ll );
264         b = fac.random( ll );
265         c = fac.random( ll );
266    
267         d = a.multiply( b.sum(c) );
268         e = a.multiply( b ).sum( a.multiply(c) );
269    
270         assertEquals("a(b+c) = ab+ac",d,e);
271     }
272    
273    
274    /**
275     * Test object quotient and remainder.
276     * 
277     */
278    
279     public void testQuotRem1() {
280    
281         fac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(cfac,1);
282    
283         a = fac.random(ll).monic();
284         assertTrue("not isZERO( a )", !a.isZERO() );
285    
286         b = fac.random(ll).monic();
287         assertTrue("not isZERO( b )", !b.isZERO() );
288    
289         GenPolynomial<AlgebraicNumber<ModInteger>> h = a;
290         GenPolynomial<AlgebraicNumber<ModInteger>> g = fac.random(ll).monic();
291         assertTrue("not isZERO( g )", !g.isZERO() );
292         g = fac.getONE();
293         a = a.multiply(g);
294         b = b.multiply(g);
295         //System.out.println("a = " + a);
296         //System.out.println("b = " + b);
297         //System.out.println("g = " + g);
298    
299         GenPolynomial<AlgebraicNumber<ModInteger>>[] qr;
300         qr = b.divideAndRemainder(a);
301         c = qr[0];
302         d = qr[1];
303         //System.out.println("q = " + c);
304         //System.out.println("r = " + d);
305         e = c.multiply(a).sum(d);
306         assertEquals("b = q a + r", b, e );
307    
308         qr = a.divideAndRemainder(b);
309         c = qr[0];
310         d = qr[1];
311         //System.out.println("q = " + c);
312         //System.out.println("r = " + d);
313         e = c.multiply(b).sum(d);
314         assertEquals("a = q b + r", a, e );
315    
316    
317         // gcd tests -------------------------------
318         c = a.gcd(b);
319         //System.out.println("gcd = " + c);
320         assertTrue("a mod gcd(a,b) = 0", a.remainder(c).isZERO() );
321         assertTrue("b mod gcd(a,b) = 0", b.remainder(c).isZERO() );
322         assertEquals("g = gcd(a,b)", c, g );
323    
324    
325         GenPolynomial<AlgebraicNumber<ModInteger>>[] gst;
326         gst = a.egcd(b);
327         //System.out.println("egcd = " + gst[0]);
328         //System.out.println(", s = " + gst[1] + ", t = " + gst[2]);
329         c = gst[0];
330         d = gst[1];
331         e = gst[2];
332         assertEquals("g = gcd(a,b)", c, g );
333    
334         GenPolynomial<AlgebraicNumber<ModInteger>> x;
335         x = a.multiply(d).sum( b.multiply(e) ).monic(); 
336         //System.out.println("x = " + x);
337         assertEquals("gcd(a,b) = a s + b t", c, x );
338    
339    
340         //System.out.println("g = " + g);
341         //System.out.println("h = " + h);
342         if ( a.isZERO() || b.isZERO() ) {
343             return;
344         }
345         try {
346             c = a.modInverse(b);
347             //System.out.println("c = " + c);
348             x = c.multiply(a).remainder( b ).monic(); 
349             //System.out.println("x = " + x);
350             assertTrue("a invertible mod b", x.isUnit() );
351         } catch (RuntimeException e) {
352             // dann halt nicht
353         }
354    
355     }
356    
357    }