001/*
002 * $Id$
003 */
004
005package edu.jas.poly;
006
007
008import java.util.ArrayList;
009import java.util.List;
010
011import edu.jas.arith.BigComplex;
012import edu.jas.arith.BigInteger;
013import edu.jas.arith.BigRational;
014import edu.jas.arith.ModInteger;
015import edu.jas.arith.ModIntegerRing;
016import edu.jas.arith.Product;
017import edu.jas.arith.ProductRing;
018
019import junit.framework.Test;
020import junit.framework.TestCase;
021import junit.framework.TestSuite;
022
023
024/**
025 * PolyUtil tests with JUnit.
026 * @author Heinz Kredel
027 */
028
029public class PolyUtilTest extends TestCase {
030
031
032    /**
033     * main.
034     */
035    public static void main(String[] args) {
036        junit.textui.TestRunner.run(suite());
037    }
038
039
040    /**
041     * Constructs a <CODE>PolyUtilTest</CODE> object.
042     * @param name String.
043     */
044    public PolyUtilTest(String name) {
045        super(name);
046    }
047
048
049    /**
050     */
051    public static Test suite() {
052        TestSuite suite = new TestSuite(PolyUtilTest.class);
053        return suite;
054    }
055
056
057    //private final static int bitlen = 100;
058
059    TermOrder to = new TermOrder(TermOrder.INVLEX);
060
061
062    GenPolynomialRing<BigInteger> dfac;
063
064
065    GenPolynomialRing<BigInteger> cfac;
066
067
068    GenPolynomialRing<GenPolynomial<BigInteger>> rfac;
069
070
071    BigInteger ai;
072
073
074    BigInteger bi;
075
076
077    BigInteger ci;
078
079
080    BigInteger di;
081
082
083    BigInteger ei;
084
085
086    GenPolynomial<BigInteger> a;
087
088
089    GenPolynomial<BigInteger> b;
090
091
092    GenPolynomial<BigInteger> c;
093
094
095    GenPolynomial<BigInteger> d;
096
097
098    GenPolynomial<BigInteger> e;
099
100
101    GenPolynomial<GenPolynomial<BigInteger>> ar;
102
103
104    GenPolynomial<GenPolynomial<BigInteger>> br;
105
106
107    GenPolynomial<GenPolynomial<BigInteger>> cr;
108
109
110    GenPolynomial<GenPolynomial<BigInteger>> dr;
111
112
113    GenPolynomial<GenPolynomial<BigInteger>> er;
114
115
116    int rl = 5;
117
118
119    int kl = 5;
120
121
122    int ll = 5;
123
124
125    int el = 3;
126
127
128    float q = 0.3f;
129
130
131    @Override
132    protected void setUp() {
133        a = b = c = d = e = null;
134        ai = bi = ci = di = ei = null;
135        ar = br = cr = dr = er = null;
136        dfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), rl, to);
137        cfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), rl - 1, to);
138        rfac = new GenPolynomialRing<GenPolynomial<BigInteger>>(cfac, 1, to);
139    }
140
141
142    @Override
143    protected void tearDown() {
144        a = b = c = d = e = null;
145        ai = bi = ci = di = ei = null;
146        ar = br = cr = dr = er = null;
147        dfac = null;
148        cfac = null;
149        rfac = null;
150    }
151
152
153    protected static java.math.BigInteger getPrime1() {
154        long prime = 2; //2^60-93; // 2^30-35; //19; knuth (2,390)
155        for (int i = 1; i < 60; i++) {
156            prime *= 2;
157        }
158        prime -= 93;
159        //prime = 37;
160        //System.out.println("p1 = " + prime);
161        return new java.math.BigInteger("" + prime);
162    }
163
164
165    protected static java.math.BigInteger getPrime2() {
166        long prime = 2; //2^60-93; // 2^30-35; //19; knuth (2,390)
167        for (int i = 1; i < 30; i++) {
168            prime *= 2;
169        }
170        prime -= 35;
171        //prime = 19;
172        //System.out.println("p1 = " + prime);
173        return new java.math.BigInteger("" + prime);
174    }
175
176
177    /**
178     * Test recursive -- distributive conversion.
179     */
180    public void testConversion() {
181        c = dfac.getONE();
182        assertTrue("length( c ) = 1", c.length() == 1);
183        assertTrue("isZERO( c )", !c.isZERO());
184        assertTrue("isONE( c )", c.isONE());
185
186        cr = PolyUtil.recursive(rfac, c);
187        a = PolyUtil.distribute(dfac, cr);
188        assertEquals("c == dist(rec(c))", c, a);
189
190        d = dfac.getZERO();
191        assertTrue("length( d ) = 0", d.length() == 0);
192        assertTrue("isZERO( d )", d.isZERO());
193        assertTrue("isONE( d )", !d.isONE());
194
195        dr = PolyUtil.recursive(rfac, d);
196        b = PolyUtil.distribute(dfac, dr);
197        assertEquals("d == dist(rec(d))", d, b);
198    }
199
200
201    /**
202     * Test recursive -- distributive ring conversion.
203     */
204    public void testConversionRing() {
205        GenPolynomialRing<GenPolynomial<BigInteger>> rf = dfac.recursive(1);
206        GenPolynomialRing<BigInteger> cf = (GenPolynomialRing<BigInteger>) rf.coFac;
207        assertEquals("rfac#var == rf#var ", rfac.nvar, rf.nvar);
208        assertEquals("rfac.coFac#var == rf.coFac#var ", cfac.nvar, cf.nvar);
209        assertEquals("rfac.coFac.coFac == rf.coFac.coFac ", cfac.coFac, cf.coFac);
210        // variable names not same in this test
211    }
212
213
214    /**
215     * Test random recursive -- distributive conversion.
216     */
217    public void testRandomConversion() {
218        for (int i = 0; i < 7; i++) {
219            c = dfac.random(kl * (i + 2), ll + 2 * i, el + i, q);
220
221            assertTrue("length( c" + i + " ) <> 0", c.length() >= 0);
222            assertTrue(" not isZERO( c" + i + " )", !c.isZERO());
223            assertTrue(" not isONE( c" + i + " )", !c.isONE());
224
225            cr = PolyUtil.recursive(rfac, c);
226            a = PolyUtil.distribute(dfac, cr);
227            //System.out.println("c   = " + c);
228            //System.out.println("cr  = " + cr);
229            //System.out.println("crd = " + a);
230
231            assertEquals("c == dist(rec(c))", c, a);
232        }
233    }
234
235
236    /**
237     * Test random rational -- integer conversion.
238     */
239    public void testRationalConversion() {
240        GenPolynomialRing<BigRational> rfac = new GenPolynomialRing<BigRational>(new BigRational(1), rl, to);
241
242        GenPolynomial<BigRational> ar;
243        GenPolynomial<BigRational> br;
244
245        for (int i = 0; i < 3; i++) {
246            c = dfac.random(kl * (i + 9), ll * (i + 3), el + i, q).abs();
247            //c = c.multiply( new BigInteger(99) ); // fails, since not primitive
248            //c = GreatestCommonDivisor.primitivePart(c);
249
250            assertTrue("length( c" + i + " ) <> 0", c.length() >= 0);
251            assertTrue(" not isZERO( c" + i + " )", !c.isZERO());
252            assertTrue(" not isONE( c" + i + " )", !c.isONE());
253
254            ar = PolyUtil.<BigRational> fromIntegerCoefficients(rfac, c);
255            br = ar.monic();
256            a = PolyUtil.integerFromRationalCoefficients(dfac, br);
257            //System.out.println("c   = " + c);
258            //System.out.println("ar  = " + ar);
259            //System.out.println("br  = " + br);
260            //System.out.println("crd = " + a);
261
262            assertEquals("c == integer(rational(c))", c, a);
263        }
264    }
265
266
267    /**
268     * Test random modular -- integer conversion.
269     */
270    public void testModularConversion() {
271        ModIntegerRing pm = new ModIntegerRing(getPrime1());
272        GenPolynomialRing<ModInteger> mfac = new GenPolynomialRing<ModInteger>(pm, rl, to);
273
274        GenPolynomial<ModInteger> ar;
275
276        for (int i = 0; i < 3; i++) {
277            c = dfac.random(kl * (i + 2), ll * (i + 1), el + i, q).abs();
278            //c = c.multiply( new BigInteger(99) ); // fails, since not primitive
279            //c = GreatestCommonDivisor.primitivePart(c);
280
281            assertTrue("length( c" + i + " ) <> 0", c.length() >= 0);
282            assertTrue(" not isZERO( c" + i + " )", !c.isZERO());
283            assertTrue(" not isONE( c" + i + " )", !c.isONE());
284
285            ar = PolyUtil.<ModInteger> fromIntegerCoefficients(mfac, c);
286            a = PolyUtil.integerFromModularCoefficients(dfac, ar);
287            //System.out.println("c   = " + c);
288            //System.out.println("ar  = " + ar);
289            //System.out.println("crd = " + a);
290
291            assertEquals("c == integer(modular(c))", c, a);
292        }
293    }
294
295
296    /**
297     * Test chinese remainder.
298     */
299    public void testChineseRemainder() {
300        java.math.BigInteger p1 = getPrime1();
301        java.math.BigInteger p2 = getPrime2();
302        java.math.BigInteger p12 = p1.multiply(p2);
303
304        ModIntegerRing pm1 = new ModIntegerRing(p1);
305        GenPolynomialRing<ModInteger> mfac1 = new GenPolynomialRing<ModInteger>(pm1, rl, to);
306
307        ModIntegerRing pm2 = new ModIntegerRing(p2);
308        GenPolynomialRing<ModInteger> mfac2 = new GenPolynomialRing<ModInteger>(pm2, rl, to);
309
310        ModIntegerRing pm12 = new ModIntegerRing(p12);
311        GenPolynomialRing<ModInteger> mfac = new GenPolynomialRing<ModInteger>(pm12, rl, to);
312
313        ModInteger di = pm2.create(p1);
314        di = di.inverse();
315        //System.out.println("di = " + di);
316
317        GenPolynomial<ModInteger> am;
318        GenPolynomial<ModInteger> bm;
319        GenPolynomial<ModInteger> cm;
320
321        ExpVector degv, qdegv;
322
323        for (int i = 0; i < 3; i++) {
324            c = dfac.random((59 + 29) / 2, ll * (i + 1), el + i, q);
325            //c = c.multiply( new BigInteger(99) ); // fails, since not primitive
326            //c = GreatestCommonDivisor.primitivePart(c);
327            degv = c.degreeVector();
328            //System.out.println("degv  = " + degv);
329
330            assertTrue("length( c" + i + " ) <> 0", c.length() >= 0);
331            assertTrue(" not isZERO( c" + i + " )", !c.isZERO());
332            assertTrue(" not isONE( c" + i + " )", !c.isONE());
333
334            am = PolyUtil.<ModInteger> fromIntegerCoefficients(mfac1, c);
335            qdegv = am.degreeVector();
336            //System.out.println("qdegv  = " + qdegv);
337            if (!degv.equals(qdegv)) {
338                continue;
339            }
340            bm = PolyUtil.<ModInteger> fromIntegerCoefficients(mfac2, c);
341            qdegv = bm.degreeVector();
342            //System.out.println("qdegv  = " + qdegv);
343            if (!degv.equals(qdegv)) {
344                continue;
345            }
346
347            cm = PolyUtil.chineseRemainder(mfac, am, di, bm);
348            a = PolyUtil.integerFromModularCoefficients(dfac, cm);
349
350            //System.out.println("c  = " + c);
351            //System.out.println("am = " + am);
352            //System.out.println("bm = " + bm);
353            //System.out.println("cm = " + cm);
354            //System.out.println("a  = " + a);
355
356            assertEquals("cra(c mod p1,c mod p2) = c", c, a);
357        }
358    }
359
360
361    /**
362     * Test complex conversion.
363     */
364    public void testComplexConversion() {
365        BigRational rf = new BigRational(1);
366        GenPolynomialRing<BigRational> rfac = new GenPolynomialRing<BigRational>(rf, rl, to);
367
368        BigComplex cf = new BigComplex(1);
369        GenPolynomialRing<BigComplex> cfac = new GenPolynomialRing<BigComplex>(cf, rl, to);
370
371        BigComplex imag = BigComplex.I;
372
373        GenPolynomial<BigRational> rp;
374        GenPolynomial<BigRational> ip;
375        GenPolynomial<BigComplex> crp;
376        GenPolynomial<BigComplex> cip;
377        GenPolynomial<BigComplex> cp;
378        GenPolynomial<BigComplex> ap;
379
380        for (int i = 0; i < 3; i++) {
381            cp = cfac.random(kl + 2 * i, ll * (i + 1), el + i, q);
382
383            assertTrue("length( c" + i + " ) <> 0", cp.length() >= 0);
384            assertTrue(" not isZERO( c" + i + " )", !cp.isZERO());
385            assertTrue(" not isONE( c" + i + " )", !cp.isONE());
386
387            rp = PolyUtil.realPart(rfac, cp);
388            ip = PolyUtil.imaginaryPart(rfac, cp);
389
390            crp = PolyUtil.complexFromRational(cfac, rp);
391            cip = PolyUtil.complexFromRational(cfac, ip);
392
393            ap = crp.sum(cip.multiply(imag));
394
395            //System.out.println("cp = " + cp);
396            //System.out.println("rp = " + rp);
397            //System.out.println("ip = " + ip);
398            //System.out.println("crp = " + crp);
399            //System.out.println("cip = " + cip);
400            //System.out.println("ap  = " + ap);
401
402            assertEquals("re(c)+i*im(c) = c", cp, ap);
403        }
404    }
405
406
407    /**
408     * Test base pseudo division.
409     */
410    public void testBasePseudoDivision() {
411        String[] names = new String[] { "x" };
412        dfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), to, names);
413        GenPolynomialRing<BigRational> rdfac = new GenPolynomialRing<BigRational>(new BigRational(1), dfac);
414        //System.out.println("\ndfac  = " + dfac);
415        //System.out.println("rdfac = " + rdfac);
416
417        a = dfac.random(kl, 2 * ll, el + 17, q);
418        //a = dfac.parse(" 3 x^5 + 44 ");
419        //b = a;
420        b = dfac.random(kl, 2 * ll, el + 3, q);
421        //a = a.multiply(b);
422        //a = a.sum(b);
423        //b = dfac.parse(" 2 x^2 + 40 ");
424        //System.out.println("a   = " + a);
425        //System.out.println("b   = " + b);
426
427        GenPolynomial<BigInteger>[] QR = PolyUtil.<BigInteger> basePseudoQuotientRemainder(a, b);
428        c = QR[1];
429        d = QR[0];
430        //System.out.println("q   = " + d);
431        //System.out.println("r   = " + c);
432
433        boolean t = PolyUtil.<BigInteger> isBasePseudoQuotientRemainder(a, b, d, c);
434        assertTrue("lc^n a = q b + r: " + c, t);
435
436        GenPolynomial<BigRational> ap = PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, a);
437        GenPolynomial<BigRational> bp = PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, b);
438        GenPolynomial<BigRational> cp = PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, c);
439        GenPolynomial<BigRational> dp = PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, d);
440        //System.out.println("ap  = " + ap);
441        //System.out.println("bp  = " + bp);
442        //System.out.println("cp  = " + cp);
443        ////System.out.println("dp  = " + dp);
444        //System.out.println("dp  = " + dp.monic());
445
446        GenPolynomial<BigRational> qp = ap.divide(bp);
447        GenPolynomial<BigRational> rp = ap.remainder(bp);
448        //System.out.println("qp  = " + qp);
449        //System.out.println("qp  = " + qp.monic());
450        //System.out.println("rp  = " + rp);
451        GenPolynomial<BigRational> rhs = qp.multiply(bp).sum(rp);
452        //System.out.println("qp bp + rp  = " + rhs);
453
454        assertEquals("ap = qp bp + rp: ", ap, rhs);
455
456        assertEquals("cp = rp: ", rp.monic(), cp.monic());
457        assertEquals("dp = qp: ", qp.monic(), dp.monic()); // ??
458        //System.out.println("dp = qp: " + qp.monic().equals(dp.monic()) );
459    }
460
461
462    /**
463     * Test base sparse pseudo division.
464     */
465    public void testBasePseudoDivisionSparse() {
466        String[] names = new String[] { "x" };
467        dfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), to, names);
468        GenPolynomialRing<BigRational> rdfac = new GenPolynomialRing<BigRational>(new BigRational(1), dfac);
469        //System.out.println("\ndfac  = " + dfac);
470        //System.out.println("rdfac = " + rdfac);
471
472        a = dfac.random(kl, 2 * ll, el + 17, q);
473        //a = dfac.parse(" 3 x^5 + 44 ");
474        //b = a;
475        b = dfac.random(kl, 2 * ll, el + 3, q);
476        //a = a.multiply(b);
477        //a = a.sum(b);
478        //b = dfac.parse(" 2 x^2 + 40 ");
479        //System.out.println("a   = " + a);
480        //System.out.println("b   = " + b);
481
482        d = PolyUtil.<BigInteger> basePseudoDivide(a, b);
483        //System.out.println("q   = " + d);
484        c = PolyUtil.<BigInteger> baseSparsePseudoRemainder(a, b);
485        //System.out.println("r   = " + c);
486
487        boolean t = PolyUtil.<BigInteger> isBasePseudoQuotientRemainder(a, b, d, c);
488        assertTrue("lc^n a = q b + r: " + c, t);
489
490        GenPolynomial<BigRational> ap = PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, a);
491        GenPolynomial<BigRational> bp = PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, b);
492        GenPolynomial<BigRational> cp = PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, c);
493        GenPolynomial<BigRational> dp = PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, d);
494        //System.out.println("ap  = " + ap);
495        //System.out.println("bp  = " + bp);
496        //System.out.println("cp  = " + cp);
497        ////System.out.println("dp  = " + dp);
498        //System.out.println("dp  = " + dp.monic());
499
500        GenPolynomial<BigRational> qp = ap.divide(bp);
501        GenPolynomial<BigRational> rp = ap.remainder(bp);
502        //System.out.println("qp  = " + qp);
503        //System.out.println("qp  = " + qp.monic());
504        //System.out.println("rp  = " + rp);
505        GenPolynomial<BigRational> rhs = qp.multiply(bp).sum(rp);
506        //System.out.println("qp bp + rp  = " + rhs);
507
508        assertEquals("ap = qp bp + rp: ", ap, rhs);
509
510        assertEquals("cp = rp: ", rp.monic(), cp.monic());
511        assertEquals("dp = qp: ", qp.monic(), dp.monic()); // ??
512        //System.out.println("dp = qp: " + qp.monic().equals(dp.monic()) );
513    }
514
515
516    /**
517     * Test base dense pseudo division.
518     */
519    public void testBasePseudoDivisionDense() {
520        String[] names = new String[] { "x" };
521        dfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), to, names);
522        GenPolynomialRing<BigRational> rdfac = new GenPolynomialRing<BigRational>(new BigRational(1), dfac);
523        //System.out.println("\ndfac  = " + dfac);
524        //System.out.println("rdfac = " + rdfac);
525
526        a = dfac.random(kl, 2 * ll, el + 17, q);
527        //a = dfac.parse(" 3 x^5 + 44 ");
528        //b = a;
529        b = dfac.random(kl, 2 * ll, el + 3, q);
530        //a = a.multiply(b);
531        //a = a.sum(b);
532        //b = dfac.parse(" 2 x^2 + 40 ");
533        //System.out.println("a   = " + a);
534        //System.out.println("b   = " + b);
535
536        d = PolyUtil.<BigInteger> baseDensePseudoQuotient(a, b);
537        //System.out.println("q   = " + d);
538        c = PolyUtil.<BigInteger> baseDensePseudoRemainder(a, b);
539        //System.out.println("r   = " + c);
540
541        boolean t = PolyUtil.<BigInteger> isBasePseudoQuotientRemainder(a, b, d, c);
542        assertTrue("lc^n a = q b + r: " + c, t);
543
544        GenPolynomial<BigRational> ap = PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, a);
545        GenPolynomial<BigRational> bp = PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, b);
546        GenPolynomial<BigRational> cp = PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, c);
547        GenPolynomial<BigRational> dp = PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, d);
548        //System.out.println("ap  = " + ap);
549        //System.out.println("bp  = " + bp);
550        //System.out.println("cp  = " + cp);
551        ////System.out.println("dp  = " + dp);
552        //System.out.println("dp  = " + dp.monic());
553
554        GenPolynomial<BigRational> qp = ap.divide(bp);
555        GenPolynomial<BigRational> rp = ap.remainder(bp);
556        //System.out.println("qp  = " + qp);
557        //System.out.println("qp  = " + qp.monic());
558        //System.out.println("rp  = " + rp);
559        GenPolynomial<BigRational> rhs = qp.multiply(bp).sum(rp);
560        //System.out.println("qp bp + rp  = " + rhs);
561
562        assertEquals("ap = qp bp + rp: ", ap, rhs);
563
564        assertEquals("cp = rp: ", rp.monic(), cp.monic());
565        assertEquals("dp = qp: ", qp.monic(), dp.monic()); // ??
566        //System.out.println("dp = qp: " + qp.monic().equals(dp.monic()) );
567    }
568
569
570    /**
571     * Test recursive pseudo division.
572     * @see edu.jas.ufd.PolyUfdUtilTest#testRecursivePseudoDivisionSparse
573     */
574    public void testRecursivePseudoDivision() {
575    }
576
577
578    /**
579     * Test evaluate main recursive.
580     */
581    public void testEvalMainRecursive() {
582        ai = (new BigInteger()).random(kl);
583        //System.out.println("ai  = " + ai);
584
585        ar = rfac.getZERO();
586        //System.out.println("ar  = " + ar);
587
588        a = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, ar, ai);
589        //System.out.println("a   = " + a);
590
591        assertTrue("isZERO( a )", a.isZERO());
592
593        ar = rfac.getONE();
594        //System.out.println("ar  = " + ar);
595
596        a = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, ar, ai);
597        //System.out.println("a   = " + a);
598
599        assertTrue("isONE( a )", a.isONE());
600
601
602        //ar = rfac.getONE();
603        ar = rfac.random(kl, ll, el, q);
604        //System.out.println("ar  = " + ar);
605        //br = rfac.getONE();
606        br = rfac.random(kl, ll, el, q);
607        //System.out.println("br  = " + br);
608
609        cr = br.sum(ar);
610        //System.out.println("cr  = " + cr);
611
612        a = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, ar, ai);
613        b = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, br, ai);
614        c = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, cr, ai);
615        //System.out.println("a   = " + a);
616        //System.out.println("b   = " + b);
617        //System.out.println("c   = " + c);
618
619        d = a.sum(b);
620        //System.out.println("d   = " + d);
621
622        assertEquals("eval(a+b) == eval(a) + eval(b)", c, d);
623
624
625        cr = br.multiply(ar);
626        //System.out.println("cr  = " + cr);
627
628        a = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, ar, ai);
629        b = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, br, ai);
630        c = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, cr, ai);
631        //System.out.println("a   = " + a);
632        //System.out.println("b   = " + b);
633        //System.out.println("c   = " + c);
634
635        d = a.multiply(b);
636        //System.out.println("d   = " + d);
637
638        assertEquals("eval(a*b) == eval(a) * eval(b)", c, d);
639    }
640
641
642    /**
643     * Test evaluate main.
644     */
645    public void testEvalMain() {
646        ei = (new BigInteger()).random(kl);
647        //System.out.println("ei  = " + ei);
648
649        cfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), 1, to);
650        //System.out.println("cfac  = " + cfac);
651
652        a = cfac.getZERO();
653        //System.out.println("a  = " + a);
654
655        ai = PolyUtil.<BigInteger> evaluateMain(ei, a, ei);
656        //System.out.println("ai   = " + ai);
657
658        assertTrue("isZERO( ai )", ai.isZERO());
659
660        a = cfac.getONE();
661        //System.out.println("a  = " + a);
662
663        ai = PolyUtil.<BigInteger> evaluateMain(ei, a, ei);
664        //System.out.println("ai   = " + ai);
665
666        assertTrue("isONE( ai )", ai.isONE());
667
668        //a = cfac.getONE();
669        a = cfac.random(kl, ll, el, q);
670        //System.out.println("a  = " + a);
671        //b = cfac.getONE();
672        b = cfac.random(kl, ll, el, q);
673        //System.out.println("b  = " + b);
674
675        c = b.sum(a);
676        //System.out.println("c  = " + c);
677
678        ai = PolyUtil.<BigInteger> evaluateMain(ei, a, ei);
679        bi = PolyUtil.<BigInteger> evaluateMain(ei, b, ei);
680        ci = PolyUtil.<BigInteger> evaluateMain(ei, c, ei);
681        //System.out.println("ai   = " + ai);
682        //System.out.println("bi   = " + bi);
683        //System.out.println("ci   = " + ci);
684
685        di = bi.sum(ai);
686        //System.out.println("di   = " + di);
687
688        assertEquals("eval(a+b) == eval(a) + eval(b)", ci, di);
689
690        c = b.multiply(a);
691        //System.out.println("c  = " + c);
692
693        ai = PolyUtil.<BigInteger> evaluateMain(ei, a, ei);
694        bi = PolyUtil.<BigInteger> evaluateMain(ei, b, ei);
695        ci = PolyUtil.<BigInteger> evaluateMain(ei, c, ei);
696        //System.out.println("ai   = " + ai);
697        //System.out.println("bi   = " + bi);
698        //System.out.println("ci   = " + ci);
699
700        di = bi.multiply(ai);
701        //System.out.println("di   = " + di);
702
703        assertEquals("eval(a*b) == eval(a) * eval(b)", ci, di);
704    }
705
706
707    /**
708     * Test evaluate first.
709     */
710    public void testEvalFirst() {
711        ei = (new BigInteger()).random(kl);
712        //System.out.println("ei  = " + ei);
713
714        GenPolynomial<BigInteger> ae, be, ce, de;
715
716        GenPolynomialRing<BigInteger> fac;
717        fac = new GenPolynomialRing<BigInteger>(new BigInteger(1), rl, to);
718        //System.out.println("fac  = " + fac);
719
720        cfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), 1, to);
721        //System.out.println("cfac  = " + cfac);
722
723        dfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), rl - 1, to);
724        //System.out.println("dfac  = " + dfac);
725
726        a = fac.getZERO();
727        //System.out.println("a  = " + a);
728
729        ae = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, a, ei);
730        //System.out.println("ae   = " + ae);
731
732        assertTrue("isZERO( ae )", ae.isZERO());
733
734        a = fac.getONE();
735        //System.out.println("a  = " + a);
736
737        ae = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, a, ei);
738        //System.out.println("ae   = " + ae);
739
740        assertTrue("isONE( ae )", ae.isONE());
741
742        //a = fac.getONE();
743        a = fac.random(kl, ll, el, q);
744        //System.out.println("a  = " + a);
745        //b = fac.getONE();
746        b = fac.random(kl, ll, el, q);
747        //System.out.println("b  = " + b);
748
749        c = b.sum(a);
750        //System.out.println("c  = " + c);
751
752        ae = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, a, ei);
753        be = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, b, ei);
754        ce = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, c, ei);
755        //System.out.println("ae   = " + ae);
756        //System.out.println("be   = " + be);
757        //System.out.println("ce   = " + ce);
758
759        de = be.sum(ae);
760        //System.out.println("de   = " + de);
761
762        assertEquals("eval(a+b) == eval(a) + eval(b)", ce, de);
763
764        c = b.multiply(a);
765        //System.out.println("c  = " + c);
766
767        ae = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, a, ei);
768        be = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, b, ei);
769        ce = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, c, ei);
770        //System.out.println("ae   = " + ae);
771        //System.out.println("be   = " + be);
772        //System.out.println("ce   = " + ce);
773
774        de = be.multiply(ae);
775        //System.out.println("de   = " + de);
776
777        assertEquals("eval(a*b) == eval(a) * eval(b)", ce, de);
778    }
779
780
781    /**
782     * Test evaluate all.
783     */
784    public void testEvalAll() {
785        BigInteger cfac = new BigInteger();
786
787        List<BigInteger> Ev = new ArrayList<BigInteger>();
788        for (int i = 0; i < rl; i++) {
789            ei = cfac.random(kl);
790            Ev.add(ei);
791        }
792        //System.out.println("Ev  = " + Ev);
793
794        BigInteger ae, be, ce, de;
795
796        GenPolynomialRing<BigInteger> fac;
797        fac = new GenPolynomialRing<BigInteger>(cfac, rl, to);
798        //System.out.println("fac  = " + fac);
799
800        a = fac.getZERO();
801        //System.out.println("a  = " + a);
802
803        ae = PolyUtil.<BigInteger> evaluateAll(cfac, a, Ev);
804        //System.out.println("ae   = " + ae);
805
806        assertTrue("isZERO( ae )", ae.isZERO());
807
808        a = fac.getONE();
809        //System.out.println("a  = " + a);
810
811        ae = PolyUtil.<BigInteger> evaluateAll(cfac, a, Ev);
812        //System.out.println("ae   = " + ae);
813
814        assertTrue("isONE( ae )", ae.isONE());
815
816        //a = fac.getONE();
817        a = fac.random(kl, ll, el, q);
818        //System.out.println("a  = " + a);
819        //b = fac.getONE();
820        b = fac.random(kl, ll, el, q);
821        //System.out.println("b  = " + b);
822
823        c = b.sum(a);
824        //System.out.println("c  = " + c);
825
826        ae = PolyUtil.<BigInteger> evaluateAll(cfac, a, Ev);
827        be = PolyUtil.<BigInteger> evaluateAll(cfac, b, Ev);
828        ce = PolyUtil.<BigInteger> evaluateAll(cfac, c, Ev);
829        //System.out.println("ae   = " + ae);
830        //System.out.println("be   = " + be);
831        //System.out.println("ce   = " + ce);
832
833        de = be.sum(ae);
834        //System.out.println("de   = " + de);
835
836        assertEquals("eval(a+b) == eval(a) + eval(b)", ce, de);
837
838        c = b.multiply(a);
839        //System.out.println("c  = " + c);
840
841        ce = PolyUtil.<BigInteger> evaluateAll(cfac, c, Ev);
842        //System.out.println("ae   = " + ae);
843        //System.out.println("be   = " + be);
844        //System.out.println("ce   = " + ce);
845
846        de = be.multiply(ae);
847        //System.out.println("de   = " + de);
848
849        assertEquals("eval(a*b) == eval(a) * eval(b)", ce, de);
850    }
851
852
853    /**
854     * Test interpolate univariate 1 polynomial.
855     */
856    public void testInterpolateUnivariateOne() {
857        ModInteger ai, bi, ci, di, ei, fi, gi, hi;
858        GenPolynomial<ModInteger> a;
859        GenPolynomialRing<ModInteger> cfac;
860        ModIntegerRing fac;
861        GenPolynomial<ModInteger> r;
862        GenPolynomial<ModInteger> Q;
863        GenPolynomial<ModInteger> Qp;
864
865        fac = new ModIntegerRing(19);
866        //System.out.println("fac.modul  = " + fac.getModul());
867        cfac = new GenPolynomialRing<ModInteger>(fac, 1, to);
868        //System.out.println("cfac  = " + cfac);
869
870        a = cfac.getONE();
871        //System.out.println("a  = " + a);
872
873        ei = fac.fromInteger(11);
874        //System.out.println("ei  = " + ei);
875        // a(ei)
876        ai = PolyUtil.<ModInteger> evaluateMain(fac, a, ei);
877        //System.out.println("ai   = " + ai);
878        assertTrue("isONE( ai )", ai.isONE());
879
880        di = fac.fromInteger(13);
881        //System.out.println("di  = " + di);
882        // a(di)
883        bi = PolyUtil.<ModInteger> evaluateMain(fac, a, di);
884        //System.out.println("bi   = " + bi);
885        assertTrue("isONE( bi )", bi.isONE());
886
887        // interpolation result
888        r = cfac.getZERO();
889        //System.out.println("r   = " + r);
890
891        // interpolation polynomials product
892        Q = cfac.getONE();
893        //System.out.println("Q   = " + Q);
894
895        ci = PolyUtil.<ModInteger> evaluateMain(fac, Q, ei);
896        //System.out.println("ci   = " + ci);
897        // Q(ei)^-1
898        fi = ci.inverse();
899        //System.out.println("fi   = " + fi);
900        r = PolyUtil.<ModInteger> interpolate(cfac, r, Q, fi, ai, ei);
901        //System.out.println("r   = " + r);
902
903        // next evaluation polynomial
904        Qp = cfac.univariate(0);
905        Qp = Qp.subtract(cfac.getONE().multiply(ei));
906        //System.out.println("Qp   = " + Qp);
907        Q = Q.multiply(Qp);
908        //System.out.println("Q   = " + Q);
909
910        ci = PolyUtil.<ModInteger> evaluateMain(fac, Q, di);
911        //System.out.println("ci   = " + ci);
912        // Q(di)^-1
913        fi = ci.inverse();
914        //System.out.println("fi   = " + fi);
915        r = PolyUtil.<ModInteger> interpolate(cfac, r, Q, fi, bi, di);
916        //System.out.println("r   = " + r);
917
918        // check evaluation
919        gi = PolyUtil.<ModInteger> evaluateMain(fac, r, ei);
920        //System.out.println("gi   = " + gi);
921        hi = PolyUtil.<ModInteger> evaluateMain(fac, r, di);
922        //System.out.println("hi   = " + hi);
923        assertTrue("gi == 1 ", gi.isONE());
924        assertTrue("hi == 1 ", hi.isONE());
925
926        //            interpolate( a(ei), a(di) )            = a (mod 19)
927        assertEquals("interpolate(a mod (x-ei),a mod (x-di)) = a (mod 19)", a, r);
928    }
929
930
931    /**
932     * Test interpolate univariate deg &gt; 0 polynomial.
933     */
934    public void testInterpolateUnivariate() {
935        ModInteger ai, ci, ei, fi;
936        GenPolynomial<ModInteger> a;
937        GenPolynomialRing<ModInteger> cfac;
938        ModIntegerRing fac;
939        GenPolynomial<ModInteger> r;
940        GenPolynomial<ModInteger> Q;
941        GenPolynomial<ModInteger> Qp;
942
943        //long prime = 19;
944        long prime = getPrime1().longValue();
945        fac = new ModIntegerRing(prime);
946        //System.out.println("fac.modul  = " + fac.getModul());
947        cfac = new GenPolynomialRing<ModInteger>(fac, 1, to);
948        //System.out.println("cfac  = " + cfac);
949        int maxdeg = 19;
950
951        // polynomial to interpolate
952        long deg = 0;
953        do {
954            a = cfac.random(kl, ll, maxdeg, q);
955            if (!a.isZERO()) {
956                deg = a.degree(0);
957            }
958        } while (deg <= 0);
959        //System.out.println("a  = " + a);
960        //System.out.println("deg  = " + deg);
961
962        // interpolation result
963        r = cfac.getZERO();
964        //System.out.println("r   = " + r);
965
966        // interpolation polynomials product
967        Q = cfac.getONE();
968        //System.out.println("Q   = " + Q);
969
970        long i = -1;
971        long qdeg;
972        do {
973            i++;
974            if (i >= prime) {
975                assertTrue("elements of Z_prime exhausted", i < prime);
976            }
977            qdeg = Q.degree(0);
978            ei = fac.fromInteger(i);
979            //System.out.println("ei  = " + ei);
980            // a(ei)
981            ai = PolyUtil.<ModInteger> evaluateMain(fac, a, ei);
982            //System.out.println("ai   = " + ai);
983
984            ci = PolyUtil.<ModInteger> evaluateMain(fac, Q, ei);
985            //System.out.println("ci   = " + ci);
986            // Q(ei)^-1
987            fi = ci.inverse();
988            //System.out.println("fi   = " + fi);
989            r = PolyUtil.<ModInteger> interpolate(cfac, r, Q, fi, ai, ei);
990            //System.out.println("r   = " + r);
991
992            // next evaluation polynomial
993            Qp = cfac.univariate(0);
994            Qp = Qp.subtract(cfac.getONE().multiply(ei));
995            //System.out.println("Qp   = " + Qp);
996            Q = Q.multiply(Qp);
997            //System.out.println("Q   = " + Q);
998        } while (qdeg < deg);
999
1000        //System.out.println("a   = " + a);
1001        //System.out.println("r   = " + r);
1002
1003        //            interpolate( a(e1), ..., a(ei) )           = a (mod 19)
1004        assertEquals("interpolate(a mod (x-e1),...,a mod (x-ei)) = a (mod 19)", a, r);
1005    }
1006
1007
1008    /**
1009     * Test interpolate multivariate deg &gt; 0 polynomial.
1010     */
1011    public void testInterpolateMultivariate() {
1012        ModInteger ci, ei, fi;
1013        GenPolynomial<ModInteger> ap, bp;
1014        GenPolynomial<GenPolynomial<ModInteger>> a;
1015        GenPolynomialRing<GenPolynomial<ModInteger>> cfac;
1016        GenPolynomialRing<ModInteger> ufac;
1017        GenPolynomialRing<ModInteger> dfac;
1018        ModIntegerRing fac;
1019        GenPolynomial<GenPolynomial<ModInteger>> r;
1020        GenPolynomial<ModInteger> Q;
1021        GenPolynomial<ModInteger> Qp;
1022
1023        //long prime = 19;
1024        long prime = getPrime1().longValue();
1025        fac = new ModIntegerRing(prime);
1026        //System.out.println("fac.modul  = " + fac.getModul());
1027        ufac = new GenPolynomialRing<ModInteger>(fac, 1, to);
1028        //System.out.println("ufac  = " + ufac);
1029        cfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(ufac, rl, to);
1030        //System.out.println("cfac  = " + cfac);
1031        dfac = new GenPolynomialRing<ModInteger>(fac, rl, to);
1032        //System.out.println("dfac  = " + dfac);
1033        int maxdeg = 19;
1034
1035        // polynomial to interpolate
1036        long deg = 0;
1037        do {
1038            a = cfac.random(kl, ll + 9, maxdeg, q);
1039            if (!a.isZERO()) {
1040                deg = PolyUtil.<ModInteger> coeffMaxDegree(a);
1041            }
1042        } while (deg <= 0);
1043        //System.out.println("a  = " + a);
1044        //System.out.println("deg  = " + deg);
1045        ExpVector degv = a.degreeVector();
1046        //System.out.println("degv  = " + degv);
1047
1048        // interpolation result
1049        r = cfac.getZERO();
1050        //System.out.println("r   = " + r);
1051
1052        // interpolation polynomials product
1053        Q = ufac.getONE();
1054        //System.out.println("Q   = " + Q);
1055
1056        long i = -1;
1057        long qdeg;
1058        ExpVector qdegv;
1059        do {
1060            i++;
1061            if (i >= prime) {
1062                assertTrue("elements of Z_prime exhausted", i < prime);
1063            }
1064            qdeg = Q.degree(0);
1065            ei = fac.fromInteger(i);
1066            //System.out.println("ei  = " + ei);
1067            // a(ei)
1068            ap = PolyUtil.<ModInteger> evaluateFirstRec(ufac, dfac, a, ei);
1069            //System.out.println("ap   = " + ap);
1070            qdegv = ap.degreeVector();
1071            //System.out.println("qdegv = " + qdegv);
1072            if (!degv.equals(qdegv)) {
1073                continue;
1074            }
1075            ci = PolyUtil.<ModInteger> evaluateMain(fac, Q, ei);
1076            //System.out.println("ci   = " + ci);
1077            // Q(ei)^-1
1078            fi = ci.inverse();
1079            //System.out.println("fi   = " + fi);
1080            r = PolyUtil.<ModInteger> interpolate(cfac, r, Q, fi, ap, ei);
1081            //System.out.println("r   = " + r);
1082
1083            // check
1084            bp = PolyUtil.<ModInteger> evaluateFirstRec(ufac, dfac, r, ei);
1085            //System.out.println("bp   = " + bp);
1086            assertEquals("interpolate(a)(ei) == a ", bp, ap);
1087
1088
1089            // next evaluation polynomial
1090            Qp = ufac.univariate(0);
1091            Qp = Qp.subtract(ufac.getONE().multiply(ei));
1092            //System.out.println("Qp   = " + Qp);
1093            Q = Q.multiply(Qp);
1094            //System.out.println("Q   = " + Q);
1095        } while (qdeg <= deg);
1096
1097        //System.out.println("a   = " + a);
1098        //System.out.println("r   = " + r);
1099
1100        //            interpolate( a(e1), ..., a(ei) )           = a (mod 19)
1101        assertEquals("interpolate(a mod (x-e1),...,a mod (x-ei)) = a (mod 19)", a, r);
1102    }
1103
1104
1105    /**
1106     * Test interpolate rational multivariate deg &gt; 0 polynomial.
1107     */
1108    public void testInterpolateRationalMultivariate() {
1109        BigRational ci, ei, fi;
1110        GenPolynomial<BigRational> ap, bp;
1111        GenPolynomial<GenPolynomial<BigRational>> a;
1112        GenPolynomialRing<GenPolynomial<BigRational>> cfac;
1113        GenPolynomialRing<BigRational> ufac;
1114        GenPolynomialRing<BigRational> dfac;
1115        BigRational fac;
1116        GenPolynomial<GenPolynomial<BigRational>> r;
1117        GenPolynomial<BigRational> Q;
1118        GenPolynomial<BigRational> Qp;
1119
1120        fac = new BigRational();
1121        //System.out.println("fac.modul  = " + fac.getModul());
1122        ufac = new GenPolynomialRing<BigRational>(fac, 1, to);
1123        //System.out.println("ufac  = " + ufac);
1124        cfac = new GenPolynomialRing<GenPolynomial<BigRational>>(ufac, rl, to);
1125        //System.out.println("cfac  = " + cfac);
1126        dfac = new GenPolynomialRing<BigRational>(fac, rl, to);
1127        //System.out.println("dfac  = " + dfac);
1128        int maxdeg = 19;
1129
1130        // polynomial to interpolate
1131        long deg = 0;
1132        do {
1133            a = cfac.random(kl, ll + 9, maxdeg, q);
1134            if (!a.isZERO()) {
1135                deg = PolyUtil.<BigRational> coeffMaxDegree(a);
1136            }
1137        } while (deg <= 0);
1138        //System.out.println("a  = " + a);
1139        //System.out.println("deg  = " + deg);
1140        ExpVector degv = a.degreeVector();
1141        //System.out.println("degv  = " + degv);
1142
1143        // interpolation result
1144        r = cfac.getZERO();
1145        //System.out.println("r   = " + r);
1146
1147        // interpolation polynomials product
1148        Q = ufac.getONE();
1149        //System.out.println("Q   = " + Q);
1150
1151        long i = -1;
1152        long qdeg;
1153        ExpVector qdegv;
1154        do {
1155            i++;
1156            qdeg = Q.degree(0);
1157            ei = fac.fromInteger(i);
1158            //System.out.println("ei  = " + ei);
1159            // a(ei)
1160            ap = PolyUtil.<BigRational> evaluateFirstRec(ufac, dfac, a, ei);
1161            //System.out.println("ap   = " + ap);
1162            qdegv = ap.degreeVector();
1163            //System.out.println("qdegv = " + qdegv);
1164            if (!degv.equals(qdegv)) {
1165                continue;
1166            }
1167            ci = PolyUtil.<BigRational> evaluateMain(fac, Q, ei);
1168            //System.out.println("ci   = " + ci);
1169            // Q(ei)^-1
1170            fi = ci.inverse();
1171            //System.out.println("fi   = " + fi);
1172            r = PolyUtil.<BigRational> interpolate(cfac, r, Q, fi, ap, ei);
1173            //System.out.println("r   = " + r);
1174
1175            // check
1176            bp = PolyUtil.<BigRational> evaluateFirstRec(ufac, dfac, r, ei);
1177            //System.out.println("bp   = " + bp);
1178            assertEquals("interpolate(a)(ei) == a ", bp, ap);
1179
1180
1181            // next evaluation polynomial
1182            Qp = ufac.univariate(0);
1183            Qp = Qp.subtract(ufac.getONE().multiply(ei));
1184            //System.out.println("Qp   = " + Qp);
1185            Q = Q.multiply(Qp);
1186            //System.out.println("Q   = " + Q);
1187        } while (qdeg <= deg);
1188
1189        //System.out.println("a   = " + a);
1190        //System.out.println("r   = " + r);
1191
1192        //            interpolate( a(e1), ..., a(ei) )           = a (mod 19)
1193        assertEquals("interpolate(a mod (x-e1),...,a mod (x-ei)) = a (mod 19)", a, r);
1194    }
1195
1196
1197    /**
1198     * Test coefficient map function.
1199     */
1200    public void testMap() {
1201        // integers
1202        BigInteger fi = new BigInteger();
1203        //System.out.println("fi = " + fi);
1204
1205        // rational numbers
1206        BigRational fr = new BigRational();
1207        //System.out.println("fr = " + fr);
1208
1209        // modular integers
1210        ModIntegerRing fm = new ModIntegerRing(17);
1211        //System.out.println("fm = " + fm);
1212
1213        // polynomials over integral numbers
1214        GenPolynomialRing<BigInteger> pfi = new GenPolynomialRing<BigInteger>(fi, rl);
1215        //System.out.println("pfi = " + pfi);
1216
1217        // polynomials over rational numbers
1218        GenPolynomialRing<BigRational> pfr = new GenPolynomialRing<BigRational>(fr, rl);
1219        //System.out.println("pfr = " + pfr);
1220
1221        // polynomials over modular integers
1222        GenPolynomialRing<ModInteger> pfm = new GenPolynomialRing<ModInteger>(fm, rl);
1223        //System.out.println("pfm = " + pfm);
1224
1225
1226        // random polynomial
1227        GenPolynomial<BigInteger> pi = pfi.random(kl, 2 * ll, el, q);
1228        //System.out.println("pi = " + pi);
1229
1230        // random polynomial
1231        GenPolynomial<BigRational> pr = pfr.random(kl, 2 * ll, el, q).monic();
1232        //System.out.println("pr = " + pr);
1233
1234        // random polynomial
1235        GenPolynomial<ModInteger> pm = pfm.random(kl, 2 * ll, el, q);
1236        //System.out.println("pm = " + pm);
1237
1238        // test integer to rational and back
1239        GenPolynomial<BigRational> qr;
1240        GenPolynomial<BigInteger> qi;
1241        qr = PolyUtil.<BigInteger, BigRational> map(pfr, pi, new FromInteger<BigRational>(fr));
1242        qi = PolyUtil.<BigRational, BigInteger> map(pfi, qr, new RatNumer());
1243        //System.out.println("qr = " + qr);
1244        //System.out.println("qi = " + qi);
1245        assertEquals("pi == qi ", pi, qi);
1246
1247        // test rational to integer and back
1248        qi = PolyUtil.integerFromRationalCoefficients(pfi, pr);
1249        qr = PolyUtil.<BigInteger, BigRational> map(pfr, qi, new FromInteger<BigRational>(fr));
1250        qr = qr.monic();
1251        //System.out.println("pr = " + pr);
1252        //System.out.println("qr = " + qr);
1253        //System.out.println("qi = " + qi);
1254        assertEquals("pr == qr ", pr, qr);
1255
1256        // test symmetric modular integer to integer and back
1257        GenPolynomial<ModInteger> qm;
1258        qi = PolyUtil.<ModInteger, BigInteger> map(pfi, pm, new ModSymToInt<ModInteger>());
1259        qm = PolyUtil.<BigInteger, ModInteger> map(pfm, qi, new FromInteger<ModInteger>(fm));
1260        //System.out.println("qi = " + qi);
1261        //System.out.println("qm = " + qm);
1262        assertEquals("pm == qm ", pm, qm);
1263
1264        // test modular integer to integer and back
1265        qi = PolyUtil.<ModInteger, BigInteger> map(pfi, pm, new ModToInt<ModInteger>());
1266        qm = PolyUtil.<BigInteger, ModInteger> map(pfm, qi, new FromInteger<ModInteger>(fm));
1267        //System.out.println("qi = " + qi);
1268        //System.out.println("qm = " + qm);
1269        assertEquals("pm == qm ", pm, qm);
1270
1271        // test symmetric modular integer to integer to rational and back
1272        qi = PolyUtil.<ModInteger, BigInteger> map(pfi, pm, new ModSymToInt<ModInteger>());
1273        qr = PolyUtil.<BigInteger, BigRational> map(pfr, qi, new FromInteger<BigRational>(fr));
1274        qi = PolyUtil.<BigRational, BigInteger> map(pfi, qr, new RatNumer());
1275        qm = PolyUtil.<BigInteger, ModInteger> map(pfm, qi, new FromInteger<ModInteger>(fm));
1276        //System.out.println("qi = " + qi);
1277        //System.out.println("qm = " + qm);
1278        assertEquals("pm == qm ", pm, qm);
1279    }
1280
1281
1282    /**
1283     * Test substitution.
1284     */
1285    public void testSubstitution() {
1286        dfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), 1, to);
1287
1288        // subs = x - 7
1289        GenPolynomial<BigInteger> s = dfac.univariate(0).subtract(dfac.fromInteger(7));
1290        GenPolynomial<BigInteger> s1 = dfac.univariate(0).sum(dfac.fromInteger(7));
1291        //System.out.println("s = " + s);
1292        //System.out.println("s1 = " + s1);
1293
1294        for (int i = 0; i < 5; i++) {
1295            a = dfac.random(kl, ll, el, q);
1296            //System.out.println("a = " + a);
1297            b = PolyUtil.<BigInteger> substituteMain(a, s);
1298            c = PolyUtil.<BigInteger> substituteMain(b, s1);
1299            //System.out.println("b = " + b);
1300            //System.out.println("c = " + c);
1301            //System.out.println("a == c " + a.equals(c));
1302            assertEquals("a == c ", a, c);
1303        }
1304    }
1305
1306
1307    /**
1308     * Test algebraic substitution.
1309     */
1310    public void testAlgebraicSubstitution() {
1311
1312        BigRational cfac = new BigRational(1);
1313        String[] alpha = new String[] { "alpha" };
1314        String[] vars = new String[] { "z" };
1315        GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, alpha);
1316        GenPolynomial<BigRational> agen = pfac.univariate(0, 2);
1317        agen = agen.sum(pfac.getONE()); // x^2 + 1
1318        AlgebraicNumberRing<BigRational> afac = new AlgebraicNumberRing<BigRational>(agen, true);
1319        GenPolynomialRing<AlgebraicNumber<BigRational>> apfac = new GenPolynomialRing<AlgebraicNumber<BigRational>>(
1320                        afac, 1, to, vars); // univariate
1321
1322        //System.out.println("agen  = " + agen);
1323        //System.out.println("afac  = " + afac);
1324        //System.out.println("apfac = " + apfac);
1325
1326        // subs = x - 7
1327        GenPolynomial<AlgebraicNumber<BigRational>> s = apfac.univariate(0)
1328                        .subtract(apfac.fromInteger(7).multiply(afac.getGenerator()));
1329        GenPolynomial<AlgebraicNumber<BigRational>> s1 = apfac.univariate(0)
1330                        .sum(apfac.fromInteger(7).multiply(afac.getGenerator()));
1331        //System.out.println("s = " + s);
1332        //System.out.println("s1 = " + s1);
1333
1334        GenPolynomial<AlgebraicNumber<BigRational>> a, b, c;
1335        for (int i = 0; i < 5; i++) {
1336            a = apfac.random(kl, ll, el, q);
1337            //System.out.println("a = " + a);
1338            b = PolyUtil.<AlgebraicNumber<BigRational>> substituteMain(a, s);
1339            c = PolyUtil.<AlgebraicNumber<BigRational>> substituteMain(b, s1);
1340            //System.out.println("b = " + b);
1341            //System.out.println("c = " + c);
1342            //System.out.println("a == c " + a.equals(c));
1343            assertEquals("a == c ", a, c);
1344        }
1345    }
1346
1347
1348    /**
1349     * Test multivariate substitution.
1350     */
1351    public void testMultivarSubstitution() {
1352        dfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), 2, to);
1353        // subs = x - 7
1354        GenPolynomial<BigInteger> s = dfac.univariate(0).subtract(dfac.fromInteger(7));
1355        GenPolynomial<BigInteger> s1 = dfac.univariate(0).sum(dfac.fromInteger(7));
1356        //System.out.println("s = " + s);
1357        //System.out.println("s1 = " + s1);
1358
1359        for (int i = 0; i < 5; i++) {
1360            a = dfac.random(kl, ll, el, q);
1361            //System.out.println("a = " + a);
1362            b = PolyUtil.<BigInteger> substituteUnivariateMult(a, s);
1363            c = PolyUtil.<BigInteger> substituteUnivariateMult(b, s1);
1364            //System.out.println("b = " + b);
1365            //System.out.println("c = " + c);
1366            //System.out.println("a == c " + a.equals(c));
1367            assertEquals("a == c ", a, c);
1368        }
1369    }
1370
1371
1372    /**
1373     * Test switch variables.
1374     */
1375    public void testSwitchVariables() {
1376        BigRational cfac = new BigRational(1);
1377        GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, rl, to);
1378        GenPolynomialRing<GenPolynomial<BigRational>> rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(
1379                        pfac, rl, to);
1380
1381        //System.out.println("pfac  = " + pfac);
1382        //System.out.println("rfac  = " + rfac);
1383
1384        GenPolynomial<GenPolynomial<BigRational>> a, c;
1385        GenPolynomial<GenPolynomial<BigRational>> b;
1386        for (int i = 0; i < 5; i++) {
1387            a = rfac.random(kl, ll, el, q);
1388            //System.out.println("a = " + a);
1389            b = PolyUtil.<BigRational> switchVariables(a);
1390            c = PolyUtil.<BigRational> switchVariables(b);
1391            //System.out.println("b = " + b);
1392            //System.out.println("c = " + c);
1393            //System.out.println("a == c " + a.equals(c));
1394            assertEquals("a == c ", a, c);
1395        }
1396    }
1397
1398
1399    /**
1400     * Test algebraic conversions.
1401     */
1402    public void testAlgebraicConversions() {
1403
1404        BigRational cfac = new BigRational(1);
1405        String[] alpha = new String[] { "alpha" };
1406        //String[] vars = new String[] { "z" };
1407        GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, alpha);
1408        GenPolynomial<BigRational> agen = pfac.univariate(0, 2);
1409        agen = agen.sum(pfac.getONE()); // x^2 + 1
1410        AlgebraicNumberRing<BigRational> afac = new AlgebraicNumberRing<BigRational>(agen, true);
1411        GenPolynomialRing<AlgebraicNumber<BigRational>> apfac = new GenPolynomialRing<AlgebraicNumber<BigRational>>(
1412                        afac, rl, to);
1413        GenPolynomialRing<GenPolynomial<BigRational>> rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(
1414                        pfac, rl, to);
1415
1416        //System.out.println("agen  = " + agen);
1417        //System.out.println("afac  = " + afac);
1418        //System.out.println("apfac = " + apfac);
1419        //System.out.println("pfac  = " + pfac);
1420        //System.out.println("rfac  = " + rfac);
1421
1422        GenPolynomial<AlgebraicNumber<BigRational>> a, c;
1423        GenPolynomial<GenPolynomial<BigRational>> b;
1424        for (int i = 0; i < 5; i++) {
1425            a = apfac.random(kl, ll, el, q);
1426            //System.out.println("a = " + a);
1427            b = PolyUtil.<BigRational> fromAlgebraicCoefficients(rfac, a);
1428            c = PolyUtil.<BigRational> convertRecursiveToAlgebraicCoefficients(apfac, b);
1429            //System.out.println("b = " + b);
1430            //System.out.println("c = " + c);
1431            //System.out.println("a == c " + a.equals(c));
1432            assertEquals("a == c ", a, c);
1433        }
1434    }
1435
1436
1437    /**
1438     * Test Taylor series.
1439     */
1440    public void testTaylorSeries() {
1441        GenPolynomial<BigRational> a;
1442        GenPolynomial<BigRational> b;
1443        GenPolynomial<BigRational> c;
1444        GenPolynomialRing<BigRational> dfac;
1445        BigRational cfac;
1446
1447        cfac = new BigRational(1);
1448        String[] vars = new String[] { "x" };
1449        dfac = new GenPolynomialRing<BigRational>(cfac, 1, to, vars);
1450
1451        a = dfac.random(kl, ll, el, q);
1452        //System.out.println("a = " + a);
1453
1454        BigRational v = cfac.getZERO();
1455        //System.out.println("v = " + v);
1456
1457        b = PolyUtil.<BigRational> seriesOfTaylor(a, v);
1458        //System.out.println("taylor(a,0) = " + b);
1459        assertTrue("taylor(a,0) == a ", a.equals(b));
1460
1461        v = cfac.random(kl);
1462        //System.out.println("v = " + v);
1463
1464        b = PolyUtil.<BigRational> seriesOfTaylor(a, v);
1465        //System.out.println("taylor(a,v) = " + b);
1466
1467        c = PolyUtil.<BigRational> seriesOfTaylor(b, v.negate());
1468        //System.out.println("tailor(taylor(a,v),-v) = " + c);
1469        assertTrue("tailor(taylor(a,v),-v) == a ", a.equals(c));
1470    }
1471
1472
1473    /**
1474     * Test Complex real and imaginary part.
1475     */
1476    public void testComplexParts() {
1477        BigRational rf = new BigRational(1);
1478        GenPolynomialRing<BigRational> rfac = new GenPolynomialRing<BigRational>(rf, rl, to);
1479
1480        ComplexRing<BigRational> cf = new ComplexRing<BigRational>(new BigRational(1));
1481        GenPolynomialRing<Complex<BigRational>> cfac = new GenPolynomialRing<Complex<BigRational>>(cf, rl,
1482                        to);
1483
1484        Complex<BigRational> imag = cf.getIMAG();
1485
1486        GenPolynomial<BigRational> rp;
1487        GenPolynomial<BigRational> ip;
1488        GenPolynomial<Complex<BigRational>> crp;
1489        GenPolynomial<Complex<BigRational>> cip;
1490        GenPolynomial<Complex<BigRational>> cp;
1491        GenPolynomial<Complex<BigRational>> ap;
1492
1493        for (int i = 0; i < 3; i++) {
1494            cp = cfac.random(kl + 2 * i, ll * (i + 1), el + i, q);
1495
1496            assertTrue("length( c" + i + " ) <> 0", cp.length() >= 0);
1497            assertTrue(" not isZERO( c" + i + " )", !cp.isZERO());
1498            assertTrue(" not isONE( c" + i + " )", !cp.isONE());
1499
1500            rp = PolyUtil.<BigRational> realPartFromComplex(rfac, cp);
1501            ip = PolyUtil.<BigRational> imaginaryPartFromComplex(rfac, cp);
1502
1503            crp = PolyUtil.<BigRational> toComplex(cfac, rp);
1504            cip = PolyUtil.<BigRational> toComplex(cfac, ip);
1505
1506            ap = crp.sum(cip.multiply(imag));
1507
1508            //System.out.println("cp = " + cp);
1509            //System.out.println("rp = " + rp);
1510            //System.out.println("ip = " + ip);
1511            //System.out.println("crp = " + crp);
1512            //System.out.println("cip = " + cip);
1513            //System.out.println("ap  = " + ap);
1514
1515            assertEquals("re(c)+i*im(c) = c", cp, ap);
1516        }
1517    }
1518
1519
1520    /**
1521     * Test product represenation conversion, rational numbers.
1522     */
1523    public void testProductConversionRN() {
1524        GenPolynomialRing<BigRational> ufac;
1525        ufac = new GenPolynomialRing<BigRational>(new BigRational(1), 1);
1526
1527        ProductRing<GenPolynomial<BigRational>> pfac;
1528        pfac = new ProductRing<GenPolynomial<BigRational>>(ufac, rl);
1529
1530        GenPolynomialRing<BigRational> dfac = new GenPolynomialRing<BigRational>(new BigRational(1), rl, to);
1531
1532        GenPolynomial<BigRational> c;
1533        Product<GenPolynomial<BigRational>> cp;
1534
1535        c = dfac.getONE();
1536        //System.out.println("c = " + c);
1537
1538        cp = PolyUtil.<BigRational> toProduct(pfac, c);
1539        //System.out.println("cp = " + cp);
1540        assertTrue("isONE( cp )", cp.isONE());
1541
1542        c = dfac.random(kl, ll, el, q);
1543        //System.out.println("c = " + c);
1544
1545        cp = PolyUtil.<BigRational> toProduct(pfac, c);
1546        //System.out.println("cp = " + cp);
1547        assertTrue("!isONE( cp )", !cp.isONE());
1548    }
1549
1550
1551    /**
1552     * Test polynomal over product represenation conversion, algebraic numbers.
1553     */
1554    public void testPolyProductConversionAN() {
1555        GenPolynomialRing<BigRational> ufac;
1556        ufac = new GenPolynomialRing<BigRational>(new BigRational(1), 1);
1557
1558        GenPolynomial<BigRational> m;
1559        m = ufac.univariate(0, 2);
1560        m = m.subtract(ufac.univariate(0, 1));
1561        //System.out.println("m = " + m);
1562
1563        AlgebraicNumberRing<BigRational> afac;
1564        afac = new AlgebraicNumberRing<BigRational>(m);
1565        //System.out.println("afac = " + afac);
1566
1567        ProductRing<AlgebraicNumber<BigRational>> pfac;
1568        pfac = new ProductRing<AlgebraicNumber<BigRational>>(afac, rl);
1569
1570        GenPolynomialRing<Product<AlgebraicNumber<BigRational>>> dpfac;
1571        dpfac = new GenPolynomialRing<Product<AlgebraicNumber<BigRational>>>(pfac, 2);
1572
1573        GenPolynomialRing<AlgebraicNumber<BigRational>> dfac;
1574        dfac = new GenPolynomialRing<AlgebraicNumber<BigRational>>(afac, 2, to);
1575
1576
1577        GenPolynomial<AlgebraicNumber<BigRational>> c;
1578        GenPolynomial<Product<AlgebraicNumber<BigRational>>> cp;
1579
1580        c = dfac.getONE();
1581        //System.out.println("c = " + c);
1582
1583        cp = PolyUtil.<AlgebraicNumber<BigRational>> toProductGen(dpfac, c);
1584        //System.out.println("cp = " + cp);
1585        assertTrue("isZERO( cp )", cp.isONE());
1586
1587        c = dfac.random(kl, ll, el, q);
1588        //System.out.println("c = " + c);
1589
1590        cp = PolyUtil.<AlgebraicNumber<BigRational>> toProductGen(dpfac, c);
1591        //System.out.println("cp = " + cp);
1592        assertTrue("!isONE( cp )", !cp.isONE());
1593    }
1594
1595
1596    /**
1597     * Test remove unused upper varaibles.
1598     */
1599    public void testRemoveUnusedUpper() {
1600        //System.out.println("dfac = " + dfac);
1601        a = dfac.univariate(3, 2);
1602        b = a.subtract(dfac.univariate(1, 1));
1603        //System.out.println("a = " + a);
1604        //System.out.println("b = " + b);
1605
1606        c = PolyUtil.<BigInteger> removeUnusedUpperVariables(b);
1607        //System.out.println("c = " + c + ", fac = " + c.ring);
1608        assertTrue("#var == 4: " + c.ring.nvar, c.ring.nvar == 4);
1609
1610        a = dfac.univariate(3, 2);
1611        //System.out.println("a = " + a);
1612
1613        c = PolyUtil.<BigInteger> removeUnusedUpperVariables(a);
1614        //System.out.println("c = " + c + ", fac = " + c.ring);
1615        assertTrue("#var == 2: " + c.ring.nvar, c.ring.nvar == 2);
1616
1617        a = dfac.univariate(1, 2);
1618        //System.out.println("a = " + a);
1619
1620        c = PolyUtil.<BigInteger> removeUnusedUpperVariables(a);
1621        //System.out.println("c = " + c + ", fac = " + c.ring);
1622        assertTrue("#var == 4: " + c.ring.nvar, c.ring.nvar == 4);
1623    }
1624
1625
1626    /**
1627     * Test remove unused lower varaibles.
1628     */
1629    public void testRemoveUnusedLower() {
1630        //System.out.println("dfac = " + dfac);
1631        a = dfac.univariate(3, 2);
1632        b = a.subtract(dfac.univariate(1, 1));
1633        //System.out.println("a = " + a);
1634        //System.out.println("b = " + b);
1635
1636        c = PolyUtil.<BigInteger> removeUnusedLowerVariables(b);
1637        //System.out.println("c = " + c + ", fac = " + c.ring);
1638        assertTrue("#var == 4: " + c.ring.nvar, c.ring.nvar == 4);
1639
1640        a = dfac.univariate(3, 2);
1641        //System.out.println("a = " + a);
1642
1643        c = PolyUtil.<BigInteger> removeUnusedLowerVariables(a);
1644        //System.out.println("c = " + c + ", fac = " + c.ring);
1645        assertTrue("#var == 4: " + c.ring.nvar, c.ring.nvar == 4);
1646
1647        a = dfac.univariate(1, 2);
1648        //System.out.println("a = " + a);
1649
1650        c = PolyUtil.<BigInteger> removeUnusedLowerVariables(a);
1651        //System.out.println("c = " + c + ", fac = " + c.ring);
1652        assertTrue("#var == 2: " + c.ring.nvar, c.ring.nvar == 2);
1653    }
1654
1655
1656    /**
1657     * Test remove unused middle varaibles.
1658     */
1659    public void testRemoveUnusedMiddle() {
1660        //System.out.println("dfac = " + dfac);
1661        a = dfac.univariate(4, 2);
1662        b = a.subtract(dfac.univariate(0, 1));
1663        //System.out.println("a = " + a);
1664        //System.out.println("b = " + b);
1665
1666        c = PolyUtil.<BigInteger> removeUnusedLowerVariables(b);
1667        //System.out.println("c = " + c + ", fac = " + c.ring);
1668        assertTrue("#var == 5: " + c.ring.nvar, c.ring.nvar == 5);
1669        c = PolyUtil.<BigInteger> removeUnusedUpperVariables(c);
1670        //System.out.println("c = " + c + ", fac = " + c.ring);
1671        assertTrue("#var == 5: " + c.ring.nvar, c.ring.nvar == 5);
1672
1673        c = PolyUtil.<BigInteger> removeUnusedMiddleVariables(c);
1674        //System.out.println("c = " + c + ", fac = " + c.ring);
1675        assertTrue("#var == 2: " + c.ring.nvar, c.ring.nvar == 2);
1676
1677        a = dfac.univariate(3, 2);
1678        b = a.subtract(dfac.univariate(1, 1));
1679        //System.out.println("a = " + a);
1680        //System.out.println("b = " + b);
1681
1682        try {
1683            c = PolyUtil.<BigInteger> removeUnusedMiddleVariables(b);
1684            fail("c = " + c + ", fac = " + c.ring);
1685        } catch (RuntimeException e) {
1686            // success
1687        }
1688
1689        c = PolyUtil.<BigInteger> removeUnusedLowerVariables(b);
1690        //System.out.println("c = " + c + ", fac = " + c.ring);
1691        assertTrue("#var == 4: " + c.ring.nvar, c.ring.nvar == 4);
1692        c = PolyUtil.<BigInteger> removeUnusedUpperVariables(c);
1693        //System.out.println("c = " + c + ", fac = " + c.ring);
1694        assertTrue("#var == 3: " + c.ring.nvar, c.ring.nvar == 3);
1695
1696        c = PolyUtil.<BigInteger> removeUnusedMiddleVariables(c);
1697        //System.out.println("c = " + c + ", fac = " + c.ring);
1698        assertTrue("#var == 2: " + c.ring.nvar, c.ring.nvar == 2);
1699    }
1700
1701}