001    /*
002     * $Id: PolyUtilTest.java 3641 2011-05-22 12:23:54Z kredel $
003     */
004    
005    package edu.jas.poly;
006    
007    
008    import java.util.ArrayList;
009    import java.util.List;
010    
011    import junit.framework.Test;
012    import junit.framework.TestCase;
013    import junit.framework.TestSuite;
014    
015    import edu.jas.arith.BigComplex;
016    import edu.jas.arith.BigInteger;
017    import edu.jas.arith.BigRational;
018    import edu.jas.arith.ModInteger;
019    import edu.jas.arith.ModIntegerRing;
020    import edu.jas.arith.Product;
021    import edu.jas.arith.ProductRing;
022    
023    
024    /**
025     * PolyUtil tests with JUnit.
026     * @author Heinz Kredel.
027     */
028    
029    public 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         */
181        public void testConversion() {
182            c = dfac.getONE();
183            assertTrue("length( c ) = 1", c.length() == 1);
184            assertTrue("isZERO( c )", !c.isZERO());
185            assertTrue("isONE( c )", c.isONE());
186    
187            cr = PolyUtil.recursive(rfac, c);
188            a = PolyUtil.distribute(dfac, cr);
189            assertEquals("c == dist(rec(c))", c, a);
190    
191            d = dfac.getZERO();
192            assertTrue("length( d ) = 0", d.length() == 0);
193            assertTrue("isZERO( d )", d.isZERO());
194            assertTrue("isONE( d )", !d.isONE());
195    
196            dr = PolyUtil.recursive(rfac, d);
197            b = PolyUtil.distribute(dfac, dr);
198            assertEquals("d == dist(rec(d))", d, b);
199        }
200    
201    
202        /**
203         * Test recursive <--> distributive ring conversion.
204         * 
205         */
206        public void testConversionRing() {
207            GenPolynomialRing<GenPolynomial<BigInteger>> rf = dfac.recursive(1);
208            GenPolynomialRing<BigInteger> cf = (GenPolynomialRing<BigInteger>)rf.coFac;
209            assertEquals("rfac#var == rf#var ", rfac.nvar, rf.nvar);
210            assertEquals("rfac.coFac#var == rf.coFac#var ", cfac.nvar, cf.nvar);
211            assertEquals("rfac.coFac.coFac == rf.coFac.coFac ", cfac.coFac, cf.coFac);
212            // variable names not same in this test
213        }
214    
215    
216        /**
217         * Test random recursive <--> distributive conversion.
218         * 
219         */
220        public void testRandomConversion() {
221            for (int i = 0; i < 7; i++) {
222                c = dfac.random(kl * (i + 2), ll + 2 * i, el + i, q);
223    
224                assertTrue("length( c" + i + " ) <> 0", c.length() >= 0);
225                assertTrue(" not isZERO( c" + i + " )", !c.isZERO());
226                assertTrue(" not isONE( c" + i + " )", !c.isONE());
227    
228                cr = PolyUtil.recursive(rfac, c);
229                a = PolyUtil.distribute(dfac, cr);
230                //System.out.println("c   = " + c);
231                //System.out.println("cr  = " + cr);
232                //System.out.println("crd = " + a);
233    
234                assertEquals("c == dist(rec(c))", c, a);
235            }
236        }
237    
238    
239        /**
240         * Test random rational <--> integer conversion.
241         * 
242         */
243        public void testRationalConversion() {
244            GenPolynomialRing<BigRational> rfac = new GenPolynomialRing<BigRational>(new BigRational(1), rl, to);
245    
246            GenPolynomial<BigRational> ar;
247            GenPolynomial<BigRational> br;
248    
249            for (int i = 0; i < 3; i++) {
250                c = dfac.random(kl * (i + 9), ll * (i + 3), el + i, q).abs();
251                //c = c.multiply( new BigInteger(99) ); // fails, since not primitive
252                //c = GreatestCommonDivisor.primitivePart(c);
253    
254                assertTrue("length( c" + i + " ) <> 0", c.length() >= 0);
255                assertTrue(" not isZERO( c" + i + " )", !c.isZERO());
256                assertTrue(" not isONE( c" + i + " )", !c.isONE());
257    
258                ar = PolyUtil.<BigRational> fromIntegerCoefficients(rfac, c);
259                br = ar.monic();
260                a = PolyUtil.integerFromRationalCoefficients(dfac, br);
261                //System.out.println("c   = " + c);
262                //System.out.println("ar  = " + ar);
263                //System.out.println("br  = " + br);
264                //System.out.println("crd = " + a);
265    
266                assertEquals("c == integer(rational(c))", c, a);
267            }
268        }
269    
270    
271        /**
272         * Test random modular <--> integer conversion.
273         * 
274         */
275        public void testModularConversion() {
276            ModIntegerRing pm = new ModIntegerRing(getPrime1());
277            GenPolynomialRing<ModInteger> mfac = new GenPolynomialRing<ModInteger>(pm, rl, to);
278    
279            GenPolynomial<ModInteger> ar;
280    
281            for (int i = 0; i < 3; i++) {
282                c = dfac.random(kl * (i + 2), ll * (i + 1), el + i, q).abs();
283                //c = c.multiply( new BigInteger(99) ); // fails, since not primitive
284                //c = GreatestCommonDivisor.primitivePart(c);
285    
286                assertTrue("length( c" + i + " ) <> 0", c.length() >= 0);
287                assertTrue(" not isZERO( c" + i + " )", !c.isZERO());
288                assertTrue(" not isONE( c" + i + " )", !c.isONE());
289    
290                ar = PolyUtil.<ModInteger> fromIntegerCoefficients(mfac, c);
291                a = PolyUtil.integerFromModularCoefficients(dfac, ar);
292                //System.out.println("c   = " + c);
293                //System.out.println("ar  = " + ar);
294                //System.out.println("crd = " + a);
295    
296                assertEquals("c == integer(modular(c))", c, a);
297            }
298        }
299    
300    
301        /**
302         * Test chinese remainder.
303         * 
304         */
305        public void testChineseRemainder() {
306            java.math.BigInteger p1 = getPrime1();
307            java.math.BigInteger p2 = getPrime2();
308            java.math.BigInteger p12 = p1.multiply(p2);
309    
310            ModIntegerRing pm1 = new ModIntegerRing(p1);
311            GenPolynomialRing<ModInteger> mfac1 = new GenPolynomialRing<ModInteger>(pm1, rl, to);
312    
313            ModIntegerRing pm2 = new ModIntegerRing(p2);
314            GenPolynomialRing<ModInteger> mfac2 = new GenPolynomialRing<ModInteger>(pm2, rl, to);
315    
316            ModIntegerRing pm12 = new ModIntegerRing(p12);
317            GenPolynomialRing<ModInteger> mfac = new GenPolynomialRing<ModInteger>(pm12, rl, to);
318    
319            ModInteger di = pm2.create(p1);
320            di = di.inverse();
321            //System.out.println("di = " + di);
322    
323            GenPolynomial<ModInteger> am;
324            GenPolynomial<ModInteger> bm;
325            GenPolynomial<ModInteger> cm;
326    
327            ExpVector degv, qdegv;
328    
329            for (int i = 0; i < 3; i++) {
330                c = dfac.random((59 + 29) / 2, ll * (i + 1), el + i, q);
331                //c = c.multiply( new BigInteger(99) ); // fails, since not primitive
332                //c = GreatestCommonDivisor.primitivePart(c);
333                degv = c.degreeVector();
334                //System.out.println("degv  = " + degv);
335    
336                assertTrue("length( c" + i + " ) <> 0", c.length() >= 0);
337                assertTrue(" not isZERO( c" + i + " )", !c.isZERO());
338                assertTrue(" not isONE( c" + i + " )", !c.isONE());
339    
340                am = PolyUtil.<ModInteger> fromIntegerCoefficients(mfac1, c);
341                qdegv = am.degreeVector();
342                //System.out.println("qdegv  = " + qdegv);
343                if (!degv.equals(qdegv)) {
344                    continue;
345                }
346                bm = PolyUtil.<ModInteger> fromIntegerCoefficients(mfac2, c);
347                qdegv = bm.degreeVector();
348                //System.out.println("qdegv  = " + qdegv);
349                if (!degv.equals(qdegv)) {
350                    continue;
351                }
352    
353                cm = PolyUtil.chineseRemainder(mfac, am, di, bm);
354                a = PolyUtil.integerFromModularCoefficients(dfac, cm);
355    
356                //System.out.println("c  = " + c);
357                //System.out.println("am = " + am);
358                //System.out.println("bm = " + bm);
359                //System.out.println("cm = " + cm);
360                //System.out.println("a  = " + a);
361    
362                assertEquals("cra(c mod p1,c mod p2) = c", c, a);
363            }
364        }
365    
366    
367        /**
368         * Test complex conversion.
369         * 
370         */
371        public void testComplexConversion() {
372            BigRational rf = new BigRational(1);
373            GenPolynomialRing<BigRational> rfac = new GenPolynomialRing<BigRational>(rf, rl, to);
374    
375            BigComplex cf = new BigComplex(1);
376            GenPolynomialRing<BigComplex> cfac = new GenPolynomialRing<BigComplex>(cf, rl, to);
377    
378            BigComplex imag = BigComplex.I;
379    
380            GenPolynomial<BigRational> rp;
381            GenPolynomial<BigRational> ip;
382            GenPolynomial<BigComplex> crp;
383            GenPolynomial<BigComplex> cip;
384            GenPolynomial<BigComplex> cp;
385            GenPolynomial<BigComplex> ap;
386    
387            for (int i = 0; i < 3; i++) {
388                cp = cfac.random(kl + 2 * i, ll * (i + 1), el + i, q);
389    
390                assertTrue("length( c" + i + " ) <> 0", cp.length() >= 0);
391                assertTrue(" not isZERO( c" + i + " )", !cp.isZERO());
392                assertTrue(" not isONE( c" + i + " )", !cp.isONE());
393    
394                rp = PolyUtil.realPart(rfac, cp);
395                ip = PolyUtil.imaginaryPart(rfac, cp);
396    
397                crp = PolyUtil.complexFromRational(cfac, rp);
398                cip = PolyUtil.complexFromRational(cfac, ip);
399    
400                ap = crp.sum(cip.multiply(imag));
401    
402                //System.out.println("cp = " + cp);
403                //System.out.println("rp = " + rp);
404                //System.out.println("ip = " + ip);
405                //System.out.println("crp = " + crp);
406                //System.out.println("cip = " + cip);
407                //System.out.println("ap  = " + ap);
408    
409                assertEquals("re(c)+i*im(c) = c", cp, ap);
410            }
411        }
412    
413    
414        /**
415         * Test evaluate main recursive.
416         * 
417         */
418        public void testEvalMainRecursive() {
419            ai = (new BigInteger()).random(kl);
420            //System.out.println("ai  = " + ai);
421    
422            ar = rfac.getZERO();
423            //System.out.println("ar  = " + ar);
424    
425            a = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, ar, ai);
426            //System.out.println("a   = " + a);
427    
428            assertTrue("isZERO( a )", a.isZERO());
429    
430            ar = rfac.getONE();
431            //System.out.println("ar  = " + ar);
432    
433            a = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, ar, ai);
434            //System.out.println("a   = " + a);
435    
436            assertTrue("isONE( a )", a.isONE());
437    
438    
439            //ar = rfac.getONE();
440            ar = rfac.random(kl, ll, el, q);
441            //System.out.println("ar  = " + ar);
442            //br = rfac.getONE();
443            br = rfac.random(kl, ll, el, q);
444            //System.out.println("br  = " + br);
445    
446            cr = br.sum(ar);
447            //System.out.println("cr  = " + cr);
448    
449            a = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, ar, ai);
450            b = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, br, ai);
451            c = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, cr, ai);
452            //System.out.println("a   = " + a);
453            //System.out.println("b   = " + b);
454            //System.out.println("c   = " + c);
455    
456            d = a.sum(b);
457            //System.out.println("d   = " + d);
458    
459            assertEquals("eval(a+b) == eval(a) + eval(b)", c, d);
460    
461    
462            cr = br.multiply(ar);
463            //System.out.println("cr  = " + cr);
464    
465            a = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, ar, ai);
466            b = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, br, ai);
467            c = PolyUtil.<BigInteger> evaluateMainRecursive(cfac, cr, ai);
468            //System.out.println("a   = " + a);
469            //System.out.println("b   = " + b);
470            //System.out.println("c   = " + c);
471    
472            d = a.multiply(b);
473            //System.out.println("d   = " + d);
474    
475            assertEquals("eval(a*b) == eval(a) * eval(b)", c, d);
476        }
477    
478    
479        /**
480         * Test evaluate main.
481         * 
482         */
483        public void testEvalMain() {
484            ei = (new BigInteger()).random(kl);
485            //System.out.println("ei  = " + ei);
486    
487            cfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), 1, to);
488            //System.out.println("cfac  = " + cfac);
489    
490            a = cfac.getZERO();
491            //System.out.println("a  = " + a);
492    
493            ai = PolyUtil.<BigInteger> evaluateMain(ei, a, ei);
494            //System.out.println("ai   = " + ai);
495    
496            assertTrue("isZERO( ai )", ai.isZERO());
497    
498            a = cfac.getONE();
499            //System.out.println("a  = " + a);
500    
501            ai = PolyUtil.<BigInteger> evaluateMain(ei, a, ei);
502            //System.out.println("ai   = " + ai);
503    
504            assertTrue("isONE( ai )", ai.isONE());
505    
506            //a = cfac.getONE();
507            a = cfac.random(kl, ll, el, q);
508            //System.out.println("a  = " + a);
509            //b = cfac.getONE();
510            b = cfac.random(kl, ll, el, q);
511            //System.out.println("b  = " + b);
512    
513            c = b.sum(a);
514            //System.out.println("c  = " + c);
515    
516            ai = PolyUtil.<BigInteger> evaluateMain(ei, a, ei);
517            bi = PolyUtil.<BigInteger> evaluateMain(ei, b, ei);
518            ci = PolyUtil.<BigInteger> evaluateMain(ei, c, ei);
519            //System.out.println("ai   = " + ai);
520            //System.out.println("bi   = " + bi);
521            //System.out.println("ci   = " + ci);
522    
523            di = bi.sum(ai);
524            //System.out.println("di   = " + di);
525    
526            assertEquals("eval(a+b) == eval(a) + eval(b)", ci, di);
527    
528    
529            c = b.multiply(a);
530            //System.out.println("c  = " + c);
531    
532            ai = PolyUtil.<BigInteger> evaluateMain(ei, a, ei);
533            bi = PolyUtil.<BigInteger> evaluateMain(ei, b, ei);
534            ci = PolyUtil.<BigInteger> evaluateMain(ei, c, ei);
535            //System.out.println("ai   = " + ai);
536            //System.out.println("bi   = " + bi);
537            //System.out.println("ci   = " + ci);
538    
539            di = bi.multiply(ai);
540            //System.out.println("di   = " + di);
541    
542            assertEquals("eval(a*b) == eval(a) * eval(b)", ci, di);
543        }
544    
545    
546        /**
547         * Test evaluate first.
548         * 
549         */
550        public void testEvalFirst() {
551            ei = (new BigInteger()).random(kl);
552            //System.out.println("ei  = " + ei);
553    
554            GenPolynomial<BigInteger> ae, be, ce, de;
555    
556            GenPolynomialRing<BigInteger> fac;
557            fac = new GenPolynomialRing<BigInteger>(new BigInteger(1), rl, to);
558            //System.out.println("fac  = " + fac);
559    
560            cfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), 1, to);
561            //System.out.println("cfac  = " + cfac);
562    
563            dfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), rl - 1, to);
564            //System.out.println("dfac  = " + dfac);
565    
566            a = fac.getZERO();
567            //System.out.println("a  = " + a);
568    
569            ae = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, a, ei);
570            //System.out.println("ae   = " + ae);
571    
572            assertTrue("isZERO( ae )", ae.isZERO());
573    
574            a = fac.getONE();
575            //System.out.println("a  = " + a);
576    
577            ae = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, a, ei);
578            //System.out.println("ae   = " + ae);
579    
580            assertTrue("isONE( ae )", ae.isONE());
581    
582            //a = fac.getONE();
583            a = fac.random(kl, ll, el, q);
584            //System.out.println("a  = " + a);
585            //b = fac.getONE();
586            b = fac.random(kl, ll, el, q);
587            //System.out.println("b  = " + b);
588    
589            c = b.sum(a);
590            //System.out.println("c  = " + c);
591    
592            ae = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, a, ei);
593            be = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, b, ei);
594            ce = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, c, ei);
595            //System.out.println("ae   = " + ae);
596            //System.out.println("be   = " + be);
597            //System.out.println("ce   = " + ce);
598    
599            de = be.sum(ae);
600            //System.out.println("de   = " + de);
601    
602            assertEquals("eval(a+b) == eval(a) + eval(b)", ce, de);
603    
604    
605            c = b.multiply(a);
606            //System.out.println("c  = " + c);
607    
608            ae = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, a, ei);
609            be = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, b, ei);
610            ce = PolyUtil.<BigInteger> evaluateFirst(cfac, dfac, c, ei);
611            //System.out.println("ae   = " + ae);
612            //System.out.println("be   = " + be);
613            //System.out.println("ce   = " + ce);
614    
615            de = be.multiply(ae);
616            //System.out.println("de   = " + de);
617    
618            assertEquals("eval(a*b) == eval(a) * eval(b)", ce, de);
619        }
620    
621    
622        /**
623         * Test evaluate all.
624         * 
625         */
626        public void testEvalAll() {
627            BigInteger cfac = new BigInteger();
628    
629            List<BigInteger> Ev = new ArrayList<BigInteger>();
630            for (int i = 0; i < rl; i++) {
631                ei = cfac.random(kl);
632                Ev.add(ei);
633            }
634            //System.out.println("Ev  = " + Ev);
635    
636            BigInteger ae, be, ce, de;
637    
638            GenPolynomialRing<BigInteger> fac;
639            fac = new GenPolynomialRing<BigInteger>(cfac, rl, to);
640            //System.out.println("fac  = " + fac);
641    
642            a = fac.getZERO();
643            //System.out.println("a  = " + a);
644    
645            ae = PolyUtil.<BigInteger> evaluateAll(cfac, dfac, a, Ev);
646            //System.out.println("ae   = " + ae);
647    
648            assertTrue("isZERO( ae )", ae.isZERO());
649    
650            a = fac.getONE();
651            //System.out.println("a  = " + a);
652    
653            ae = PolyUtil.<BigInteger> evaluateAll(cfac, dfac, a, Ev);
654            //System.out.println("ae   = " + ae);
655    
656            assertTrue("isONE( ae )", ae.isONE());
657    
658            //a = fac.getONE();
659            a = fac.random(kl, ll, el, q);
660            //System.out.println("a  = " + a);
661            //b = fac.getONE();
662            b = fac.random(kl, ll, el, q);
663            //System.out.println("b  = " + b);
664    
665            c = b.sum(a);
666            //System.out.println("c  = " + c);
667    
668            ae = PolyUtil.<BigInteger> evaluateAll(cfac, dfac, a, Ev);
669            be = PolyUtil.<BigInteger> evaluateAll(cfac, dfac, b, Ev);
670            ce = PolyUtil.<BigInteger> evaluateAll(cfac, dfac, c, Ev);
671            //System.out.println("ae   = " + ae);
672            //System.out.println("be   = " + be);
673            //System.out.println("ce   = " + ce);
674    
675            de = be.sum(ae);
676            //System.out.println("de   = " + de);
677    
678            assertEquals("eval(a+b) == eval(a) + eval(b)", ce, de);
679    
680            c = b.multiply(a);
681            //System.out.println("c  = " + c);
682    
683            ce = PolyUtil.<BigInteger> evaluateAll(cfac, dfac, c, Ev);
684            //System.out.println("ae   = " + ae);
685            //System.out.println("be   = " + be);
686            //System.out.println("ce   = " + ce);
687    
688            de = be.multiply(ae);
689            //System.out.println("de   = " + de);
690    
691            assertEquals("eval(a*b) == eval(a) * eval(b)", ce, de);
692        }
693    
694    
695        /**
696         * Test interpolate univariate 1 polynomial.
697         * 
698         */
699        public void testInterpolateUnivariateOne() {
700            ModInteger ai, bi, ci, di, ei, fi, gi, hi;
701            GenPolynomial<ModInteger> a;
702            GenPolynomialRing<ModInteger> cfac;
703            ModIntegerRing fac;
704            GenPolynomial<ModInteger> r;
705            GenPolynomial<ModInteger> Q;
706            GenPolynomial<ModInteger> Qp;
707    
708            fac = new ModIntegerRing(19);
709            //System.out.println("fac.modul  = " + fac.getModul());
710            cfac = new GenPolynomialRing<ModInteger>(fac, 1, to);
711            //System.out.println("cfac  = " + cfac);
712    
713    
714            a = cfac.getONE();
715            //System.out.println("a  = " + a);
716    
717    
718            ei = fac.fromInteger(11);
719            //System.out.println("ei  = " + ei);
720            // a(ei)
721            ai = PolyUtil.<ModInteger> evaluateMain(fac, a, ei);
722            //System.out.println("ai   = " + ai);
723            assertTrue("isONE( ai )", ai.isONE());
724    
725            di = fac.fromInteger(13);
726            //System.out.println("di  = " + di);
727            // a(di)
728            bi = PolyUtil.<ModInteger> evaluateMain(fac, a, di);
729            //System.out.println("bi   = " + bi);
730            assertTrue("isONE( bi )", bi.isONE());
731    
732    
733            // interpolation result
734            r = cfac.getZERO();
735            //System.out.println("r   = " + r);
736    
737            // interpolation polynomials product
738            Q = cfac.getONE();
739            //System.out.println("Q   = " + Q);
740    
741    
742            ci = PolyUtil.<ModInteger> evaluateMain(fac, Q, ei);
743            //System.out.println("ci   = " + ci);
744            // Q(ei)^-1
745            fi = ci.inverse();
746            //System.out.println("fi   = " + fi);
747            r = PolyUtil.<ModInteger> interpolate(cfac, r, Q, fi, ai, ei);
748            //System.out.println("r   = " + r);
749    
750    
751            // next evaluation polynomial
752            Qp = cfac.univariate(0);
753            Qp = Qp.subtract(cfac.getONE().multiply(ei));
754            //System.out.println("Qp   = " + Qp);
755            Q = Q.multiply(Qp);
756            //System.out.println("Q   = " + Q);
757    
758            ci = PolyUtil.<ModInteger> evaluateMain(fac, Q, di);
759            //System.out.println("ci   = " + ci);
760            // Q(di)^-1
761            fi = ci.inverse();
762            //System.out.println("fi   = " + fi);
763            r = PolyUtil.<ModInteger> interpolate(cfac, r, Q, fi, bi, di);
764            //System.out.println("r   = " + r);
765    
766            // check evaluation
767            gi = PolyUtil.<ModInteger> evaluateMain(fac, r, ei);
768            //System.out.println("gi   = " + gi);
769            hi = PolyUtil.<ModInteger> evaluateMain(fac, r, di);
770            //System.out.println("hi   = " + hi);
771    
772            //            interpolate( a(ei), a(di) )            = a (mod 19)
773            assertEquals("interpolate(a mod (x-ei),a mod (x-di)) = a (mod 19)", a, r);
774        }
775    
776    
777        /**
778         * Test interpolate univariate deg > 0 polynomial.
779         * 
780         */
781        public void testInterpolateUnivariate() {
782            ModInteger ai, ci, ei, fi;
783            GenPolynomial<ModInteger> a;
784            GenPolynomialRing<ModInteger> cfac;
785            ModIntegerRing fac;
786            GenPolynomial<ModInteger> r;
787            GenPolynomial<ModInteger> Q;
788            GenPolynomial<ModInteger> Qp;
789    
790            //long prime = 19;
791            long prime = getPrime1().longValue();
792            fac = new ModIntegerRing(prime);
793            //System.out.println("fac.modul  = " + fac.getModul());
794            cfac = new GenPolynomialRing<ModInteger>(fac, 1, to);
795            //System.out.println("cfac  = " + cfac);
796            int maxdeg = 19;
797    
798            // polynomial to interpolate
799            long deg = 0;
800            do {
801                a = cfac.random(kl, ll, maxdeg, q);
802                if (!a.isZERO()) {
803                    deg = a.degree(0);
804                }
805            } while (deg <= 0);
806            //System.out.println("a  = " + a);
807            //System.out.println("deg  = " + deg);
808    
809            // interpolation result
810            r = cfac.getZERO();
811            //System.out.println("r   = " + r);
812    
813            // interpolation polynomials product
814            Q = cfac.getONE();
815            //System.out.println("Q   = " + Q);
816    
817            long i = -1;
818            long qdeg;
819            do {
820                i++;
821                if (i >= prime) {
822                    assertTrue("elements of Z_prime exhausted", i < prime);
823                }
824                qdeg = Q.degree(0);
825                ei = fac.fromInteger(i);
826                //System.out.println("ei  = " + ei);
827                // a(ei)
828                ai = PolyUtil.<ModInteger> evaluateMain(fac, a, ei);
829                //System.out.println("ai   = " + ai);
830    
831                ci = PolyUtil.<ModInteger> evaluateMain(fac, Q, ei);
832                //System.out.println("ci   = " + ci);
833                // Q(ei)^-1
834                fi = ci.inverse();
835                //System.out.println("fi   = " + fi);
836                r = PolyUtil.<ModInteger> interpolate(cfac, r, Q, fi, ai, ei);
837                //System.out.println("r   = " + r);
838    
839                // next evaluation polynomial
840                Qp = cfac.univariate(0);
841                Qp = Qp.subtract(cfac.getONE().multiply(ei));
842                //System.out.println("Qp   = " + Qp);
843                Q = Q.multiply(Qp);
844                //System.out.println("Q   = " + Q);
845            } while (qdeg < deg);
846    
847            //System.out.println("a   = " + a);
848            //System.out.println("r   = " + r);
849    
850            //            interpolate( a(e1), ..., a(ei) )           = a (mod 19)
851            assertEquals("interpolate(a mod (x-e1),...,a mod (x-ei)) = a (mod 19)", a, r);
852        }
853    
854    
855        /**
856         * Test interpolate multivariate deg > 0 polynomial.
857         * 
858         */
859        public void testInterpolateMultivariate() {
860            ModInteger ci, ei, fi;
861            GenPolynomial<ModInteger> ap, bp;
862            GenPolynomial<GenPolynomial<ModInteger>> a;
863            GenPolynomialRing<GenPolynomial<ModInteger>> cfac;
864            GenPolynomialRing<ModInteger> ufac;
865            GenPolynomialRing<ModInteger> dfac;
866            ModIntegerRing fac;
867            GenPolynomial<GenPolynomial<ModInteger>> r;
868            GenPolynomial<ModInteger> Q;
869            GenPolynomial<ModInteger> Qp;
870    
871            //long prime = 19;
872            long prime = getPrime1().longValue();
873            fac = new ModIntegerRing(prime);
874            //System.out.println("fac.modul  = " + fac.getModul());
875            ufac = new GenPolynomialRing<ModInteger>(fac, 1, to);
876            //System.out.println("ufac  = " + ufac);
877            cfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(ufac, rl, to);
878            //System.out.println("cfac  = " + cfac);
879            dfac = new GenPolynomialRing<ModInteger>(fac, rl, to);
880            //System.out.println("dfac  = " + dfac);
881            int maxdeg = 19;
882    
883            // polynomial to interpolate
884            long deg = 0;
885            do {
886                a = cfac.random(kl, ll + 9, maxdeg, q);
887                if (!a.isZERO()) {
888                    deg = PolyUtil.<ModInteger> coeffMaxDegree(a);
889                }
890            } while (deg <= 0);
891            //System.out.println("a  = " + a);
892            //System.out.println("deg  = " + deg);
893            ExpVector degv = a.degreeVector();
894            //System.out.println("degv  = " + degv);
895    
896            // interpolation result
897            r = cfac.getZERO();
898            //System.out.println("r   = " + r);
899    
900            // interpolation polynomials product
901            Q = ufac.getONE();
902            //System.out.println("Q   = " + Q);
903    
904            long i = -1;
905            long qdeg;
906            ExpVector qdegv;
907            do {
908                i++;
909                if (i >= prime) {
910                    assertTrue("elements of Z_prime exhausted", i < prime);
911                }
912                qdeg = Q.degree(0);
913                ei = fac.fromInteger(i);
914                //System.out.println("ei  = " + ei);
915                // a(ei)
916                ap = PolyUtil.<ModInteger> evaluateFirstRec(ufac, dfac, a, ei);
917                //System.out.println("ap   = " + ap);
918                qdegv = ap.degreeVector();
919                //System.out.println("qdegv = " + qdegv);
920                if (!degv.equals(qdegv)) {
921                    continue;
922                }
923                ci = PolyUtil.<ModInteger> evaluateMain(fac, Q, ei);
924                //System.out.println("ci   = " + ci);
925                // Q(ei)^-1
926                fi = ci.inverse();
927                //System.out.println("fi   = " + fi);
928                r = PolyUtil.<ModInteger> interpolate(cfac, r, Q, fi, ap, ei);
929                //System.out.println("r   = " + r);
930    
931                // check
932                bp = PolyUtil.<ModInteger> evaluateFirstRec(ufac, dfac, r, ei);
933                //System.out.println("bp   = " + bp);
934                assertEquals("interpolate(a)(ei) == a ", bp, ap);
935    
936    
937                // next evaluation polynomial
938                Qp = ufac.univariate(0);
939                Qp = Qp.subtract(ufac.getONE().multiply(ei));
940                //System.out.println("Qp   = " + Qp);
941                Q = Q.multiply(Qp);
942                //System.out.println("Q   = " + Q);
943            } while (qdeg <= deg);
944    
945            //System.out.println("a   = " + a);
946            //System.out.println("r   = " + r);
947    
948            //            interpolate( a(e1), ..., a(ei) )           = a (mod 19)
949            assertEquals("interpolate(a mod (x-e1),...,a mod (x-ei)) = a (mod 19)", a, r);
950        }
951    
952    
953        /**
954         * Test interpolate rational multivariate deg > 0 polynomial.
955         * 
956         */
957        public void testInterpolateRationalMultivariate() {
958            BigRational ci, ei, fi;
959            GenPolynomial<BigRational> ap, bp;
960            GenPolynomial<GenPolynomial<BigRational>> a;
961            GenPolynomialRing<GenPolynomial<BigRational>> cfac;
962            GenPolynomialRing<BigRational> ufac;
963            GenPolynomialRing<BigRational> dfac;
964            BigRational fac;
965            GenPolynomial<GenPolynomial<BigRational>> r;
966            GenPolynomial<BigRational> Q;
967            GenPolynomial<BigRational> Qp;
968    
969            fac = new BigRational();
970            //System.out.println("fac.modul  = " + fac.getModul());
971            ufac = new GenPolynomialRing<BigRational>(fac, 1, to);
972            //System.out.println("ufac  = " + ufac);
973            cfac = new GenPolynomialRing<GenPolynomial<BigRational>>(ufac, rl, to);
974            //System.out.println("cfac  = " + cfac);
975            dfac = new GenPolynomialRing<BigRational>(fac, rl, to);
976            //System.out.println("dfac  = " + dfac);
977            int maxdeg = 19;
978    
979            // polynomial to interpolate
980            long deg = 0;
981            do {
982                a = cfac.random(kl, ll + 9, maxdeg, q);
983                if (!a.isZERO()) {
984                    deg = PolyUtil.<BigRational> coeffMaxDegree(a);
985                }
986            } while (deg <= 0);
987            //System.out.println("a  = " + a);
988            //System.out.println("deg  = " + deg);
989            ExpVector degv = a.degreeVector();
990            //System.out.println("degv  = " + degv);
991    
992            // interpolation result
993            r = cfac.getZERO();
994            //System.out.println("r   = " + r);
995    
996            // interpolation polynomials product
997            Q = ufac.getONE();
998            //System.out.println("Q   = " + Q);
999    
1000            long i = -1;
1001            long qdeg;
1002            ExpVector qdegv;
1003            do {
1004                i++;
1005                qdeg = Q.degree(0);
1006                ei = fac.fromInteger(i);
1007                //System.out.println("ei  = " + ei);
1008                // a(ei)
1009                ap = PolyUtil.<BigRational> evaluateFirstRec(ufac, dfac, a, ei);
1010                //System.out.println("ap   = " + ap);
1011                qdegv = ap.degreeVector();
1012                //System.out.println("qdegv = " + qdegv);
1013                if (!degv.equals(qdegv)) {
1014                    continue;
1015                }
1016                ci = PolyUtil.<BigRational> evaluateMain(fac, Q, ei);
1017                //System.out.println("ci   = " + ci);
1018                // Q(ei)^-1
1019                fi = ci.inverse();
1020                //System.out.println("fi   = " + fi);
1021                r = PolyUtil.<BigRational> interpolate(cfac, r, Q, fi, ap, ei);
1022                //System.out.println("r   = " + r);
1023    
1024                // check
1025                bp = PolyUtil.<BigRational> evaluateFirstRec(ufac, dfac, r, ei);
1026                //System.out.println("bp   = " + bp);
1027                assertEquals("interpolate(a)(ei) == a ", bp, ap);
1028    
1029    
1030                // next evaluation polynomial
1031                Qp = ufac.univariate(0);
1032                Qp = Qp.subtract(ufac.getONE().multiply(ei));
1033                //System.out.println("Qp   = " + Qp);
1034                Q = Q.multiply(Qp);
1035                //System.out.println("Q   = " + Q);
1036            } while (qdeg <= deg);
1037    
1038            //System.out.println("a   = " + a);
1039            //System.out.println("r   = " + r);
1040    
1041            //            interpolate( a(e1), ..., a(ei) )           = a (mod 19)
1042            assertEquals("interpolate(a mod (x-e1),...,a mod (x-ei)) = a (mod 19)", a, r);
1043        }
1044    
1045    
1046        /**
1047         * Test coefficient map function.
1048         * 
1049         */
1050        public void testMap() {
1051            // integers
1052            BigInteger fi = new BigInteger();
1053            //System.out.println("fi = " + fi);
1054    
1055            // rational numbers
1056            BigRational fr = new BigRational();
1057            //System.out.println("fr = " + fr);
1058    
1059            // modular integers
1060            ModIntegerRing fm = new ModIntegerRing(17);
1061            //System.out.println("fm = " + fm);
1062    
1063            // polynomials over integral numbers
1064            GenPolynomialRing<BigInteger> pfi = new GenPolynomialRing<BigInteger>(fi, rl);
1065            //System.out.println("pfi = " + pfi);
1066    
1067            // polynomials over rational numbers
1068            GenPolynomialRing<BigRational> pfr = new GenPolynomialRing<BigRational>(fr, rl);
1069            //System.out.println("pfr = " + pfr);
1070    
1071            // polynomials over modular integers
1072            GenPolynomialRing<ModInteger> pfm = new GenPolynomialRing<ModInteger>(fm, rl);
1073            //System.out.println("pfm = " + pfm);
1074    
1075    
1076            // random polynomial
1077            GenPolynomial<BigInteger> pi = pfi.random(kl, 2 * ll, el, q);
1078            //System.out.println("pi = " + pi);
1079    
1080            // random polynomial
1081            GenPolynomial<BigRational> pr = pfr.random(kl, 2 * ll, el, q);
1082            //System.out.println("pr = " + pr);
1083    
1084            // random polynomial
1085            GenPolynomial<ModInteger> pm = pfm.random(kl, 2 * ll, el, q);
1086            //System.out.println("pm = " + pm);
1087    
1088            // test integer to rational and back
1089            GenPolynomial<BigRational> qr;
1090            GenPolynomial<BigInteger> qi;
1091            qr = PolyUtil.<BigInteger, BigRational> map(pfr, pi, new FromInteger<BigRational>(fr));
1092            qi = PolyUtil.<BigRational, BigInteger> map(pfi, qr, new RatNumer());
1093            //System.out.println("qr = " + qr);
1094            //System.out.println("qi = " + qi);
1095            assertEquals("pi == qi ", pi, qi);
1096    
1097            // test symmetric modular integer to integer and back
1098            GenPolynomial<ModInteger> qm;
1099            qi = PolyUtil.<ModInteger, BigInteger> map(pfi, pm, new ModSymToInt<ModInteger>());
1100            qm = PolyUtil.<BigInteger, ModInteger> map(pfm, qi, new FromInteger<ModInteger>(fm));
1101            //System.out.println("qi = " + qi);
1102            //System.out.println("qm = " + qm);
1103            assertEquals("pm == qm ", pm, qm);
1104    
1105            // test modular integer to integer and back
1106            qi = PolyUtil.<ModInteger, BigInteger> map(pfi, pm, new ModToInt<ModInteger>());
1107            qm = PolyUtil.<BigInteger, ModInteger> map(pfm, qi, new FromInteger<ModInteger>(fm));
1108            //System.out.println("qi = " + qi);
1109            //System.out.println("qm = " + qm);
1110            assertEquals("pm == qm ", pm, qm);
1111    
1112            // test symmetric modular integer to integer to rational and back
1113            qi = PolyUtil.<ModInteger, BigInteger> map(pfi, pm, new ModSymToInt<ModInteger>());
1114            qr = PolyUtil.<BigInteger, BigRational> map(pfr, qi, new FromInteger<BigRational>(fr));
1115            qi = PolyUtil.<BigRational, BigInteger> map(pfi, qr, new RatNumer());
1116            qm = PolyUtil.<BigInteger, ModInteger> map(pfm, qi, new FromInteger<ModInteger>(fm));
1117            //System.out.println("qi = " + qi);
1118            //System.out.println("qm = " + qm);
1119            assertEquals("pm == qm ", pm, qm);
1120        }
1121    
1122    
1123        /**
1124         * Test substitution.
1125         * 
1126         */
1127        public void testSubstitution() {
1128            dfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), 1, to);
1129    
1130            // subs = x - 7
1131            GenPolynomial<BigInteger> s = dfac.univariate(0).subtract(dfac.fromInteger(7));
1132            GenPolynomial<BigInteger> s1 = dfac.univariate(0).sum(dfac.fromInteger(7));
1133            //System.out.println("s = " + s);
1134            //System.out.println("s1 = " + s1);
1135    
1136            for (int i = 0; i < 5; i++) {
1137                a = dfac.random(kl, ll, el, q);
1138                //System.out.println("a = " + a);
1139                b = PolyUtil.<BigInteger> substituteMain(a, s);
1140                c = PolyUtil.<BigInteger> substituteMain(b, s1);
1141                //System.out.println("b = " + b);
1142                //System.out.println("c = " + c);
1143                //System.out.println("a == c " + a.equals(c));
1144                assertEquals("a == c ", a, c);
1145            }
1146        }
1147    
1148    
1149        /**
1150         * Test algebraic substitution.
1151         * 
1152         */
1153        public void testAlgebraicSubstitution() {
1154    
1155            BigRational cfac = new BigRational(1);
1156            String[] alpha = new String[] { "alpha" };
1157            String[] vars = new String[] { "z" };
1158            GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, alpha);
1159            GenPolynomial<BigRational> agen = pfac.univariate(0, 2);
1160            agen = agen.sum(pfac.getONE()); // x^2 + 1
1161            AlgebraicNumberRing<BigRational> afac = new AlgebraicNumberRing<BigRational>(agen, true);
1162            GenPolynomialRing<AlgebraicNumber<BigRational>> apfac = new GenPolynomialRing<AlgebraicNumber<BigRational>>(
1163                    afac, 1, to, vars); // univariate
1164    
1165            //System.out.println("agen  = " + agen);
1166            //System.out.println("afac  = " + afac);
1167            //System.out.println("apfac = " + apfac);
1168    
1169            // subs = x - 7
1170            GenPolynomial<AlgebraicNumber<BigRational>> s = apfac.univariate(0).subtract(
1171                    apfac.fromInteger(7).multiply(afac.getGenerator()));
1172            GenPolynomial<AlgebraicNumber<BigRational>> s1 = apfac.univariate(0).sum(
1173                    apfac.fromInteger(7).multiply(afac.getGenerator()));
1174            //System.out.println("s = " + s);
1175            //System.out.println("s1 = " + s1);
1176    
1177            GenPolynomial<AlgebraicNumber<BigRational>> a, b, c;
1178            for (int i = 0; i < 5; i++) {
1179                a = apfac.random(kl, ll, el, q);
1180                //System.out.println("a = " + a);
1181                b = PolyUtil.<AlgebraicNumber<BigRational>> substituteMain(a, s);
1182                c = PolyUtil.<AlgebraicNumber<BigRational>> substituteMain(b, s1);
1183                //System.out.println("b = " + b);
1184                //System.out.println("c = " + c);
1185                //System.out.println("a == c " + a.equals(c));
1186                assertEquals("a == c ", a, c);
1187            }
1188        }
1189    
1190    
1191        /**
1192         * Test switch variables.
1193         * 
1194         */
1195        public void testSwitchVariables() {
1196    
1197            BigRational cfac = new BigRational(1);
1198            GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, rl, to);
1199            GenPolynomialRing<GenPolynomial<BigRational>> rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(
1200                    pfac, rl, to);
1201    
1202            //System.out.println("pfac  = " + pfac);
1203            //System.out.println("rfac  = " + rfac);
1204    
1205            GenPolynomial<GenPolynomial<BigRational>> a, c;
1206            GenPolynomial<GenPolynomial<BigRational>> b;
1207            for (int i = 0; i < 5; i++) {
1208                a = rfac.random(kl, ll, el, q);
1209                //System.out.println("a = " + a);
1210                b = PolyUtil.<BigRational> switchVariables(a);
1211                c = PolyUtil.<BigRational> switchVariables(b);
1212                //System.out.println("b = " + b);
1213                //System.out.println("c = " + c);
1214                //System.out.println("a == c " + a.equals(c));
1215                assertEquals("a == c ", a, c);
1216            }
1217        }
1218    
1219    
1220        /**
1221         * Test algebraic conversions.
1222         * 
1223         */
1224        public void testAlgebraicConversions() {
1225    
1226            BigRational cfac = new BigRational(1);
1227            String[] alpha = new String[] { "alpha" };
1228            String[] vars = new String[] { "z" };
1229            GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, alpha);
1230            GenPolynomial<BigRational> agen = pfac.univariate(0, 2);
1231            agen = agen.sum(pfac.getONE()); // x^2 + 1
1232            AlgebraicNumberRing<BigRational> afac = new AlgebraicNumberRing<BigRational>(agen, true);
1233            GenPolynomialRing<AlgebraicNumber<BigRational>> apfac = new GenPolynomialRing<AlgebraicNumber<BigRational>>(
1234                    afac, rl, to);
1235            GenPolynomialRing<GenPolynomial<BigRational>> rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(
1236                    pfac, rl, to);
1237    
1238            //System.out.println("agen  = " + agen);
1239            //System.out.println("afac  = " + afac);
1240            //System.out.println("apfac = " + apfac);
1241            //System.out.println("pfac  = " + pfac);
1242            //System.out.println("rfac  = " + rfac);
1243    
1244            GenPolynomial<AlgebraicNumber<BigRational>> a, c;
1245            GenPolynomial<GenPolynomial<BigRational>> b;
1246            for (int i = 0; i < 5; i++) {
1247                a = apfac.random(kl, ll, el, q);
1248                //System.out.println("a = " + a);
1249                b = PolyUtil.<BigRational> fromAlgebraicCoefficients(rfac, a);
1250                c = PolyUtil.<BigRational> convertRecursiveToAlgebraicCoefficients(apfac, b);
1251                //System.out.println("b = " + b);
1252                //System.out.println("c = " + c);
1253                //System.out.println("a == c " + a.equals(c));
1254                assertEquals("a == c ", a, c);
1255            }
1256        }
1257    
1258    
1259        /**
1260         * Test Taylor series.
1261         * 
1262         */
1263        public void testTaylorSeries() {
1264            GenPolynomial<BigRational> a;
1265            GenPolynomial<BigRational> b;
1266            GenPolynomial<BigRational> c;
1267            GenPolynomialRing<BigRational> dfac;
1268            BigRational cfac;
1269    
1270            cfac = new BigRational(1);
1271            String[] vars = new String[] { "x" };
1272            dfac = new GenPolynomialRing<BigRational>(cfac, 1, to, vars);
1273    
1274            a = dfac.random(kl, ll, el, q);
1275            //System.out.println("a = " + a);
1276    
1277            BigRational v = cfac.getZERO();
1278            //System.out.println("v = " + v);
1279    
1280            b = PolyUtil.<BigRational> seriesOfTaylor(a, v);
1281            //System.out.println("taylor(a,0) = " + b);
1282            assertTrue("taylor(a,0) == a ", a.equals(b));
1283    
1284            v = cfac.random(kl);
1285            //System.out.println("v = " + v);
1286    
1287            b = PolyUtil.<BigRational> seriesOfTaylor(a, v);
1288            //System.out.println("taylor(a,v) = " + b);
1289    
1290            c = PolyUtil.<BigRational> seriesOfTaylor(b, v.negate());
1291            //System.out.println("tailor(taylor(a,v),-v) = " + c);
1292            assertTrue("tailor(taylor(a,v),-v) == a ", a.equals(c));
1293        }
1294    
1295    
1296        /**
1297         * Test Complex real and imaginary part.
1298         * 
1299         */
1300        public void testComplexParts() {
1301            BigRational rf = new BigRational(1);
1302            GenPolynomialRing<BigRational> rfac = new GenPolynomialRing<BigRational>(rf, rl, to);
1303    
1304            ComplexRing<BigRational> cf = new ComplexRing<BigRational>(new BigRational(1));
1305            GenPolynomialRing<Complex<BigRational>> cfac = new GenPolynomialRing<Complex<BigRational>>(cf, rl, to);
1306    
1307            Complex<BigRational> imag = cf.getIMAG();
1308    
1309            GenPolynomial<BigRational> rp;
1310            GenPolynomial<BigRational> ip;
1311            GenPolynomial<Complex<BigRational>> crp;
1312            GenPolynomial<Complex<BigRational>> cip;
1313            GenPolynomial<Complex<BigRational>> cp;
1314            GenPolynomial<Complex<BigRational>> ap;
1315    
1316            for (int i = 0; i < 3; i++) {
1317                cp = cfac.random(kl + 2 * i, ll * (i + 1), el + i, q);
1318    
1319                assertTrue("length( c" + i + " ) <> 0", cp.length() >= 0);
1320                assertTrue(" not isZERO( c" + i + " )", !cp.isZERO());
1321                assertTrue(" not isONE( c" + i + " )", !cp.isONE());
1322    
1323                rp = PolyUtil.<BigRational> realPartFromComplex(rfac, cp);
1324                ip = PolyUtil.<BigRational> imaginaryPartFromComplex(rfac, cp);
1325    
1326                crp = PolyUtil.<BigRational> toComplex(cfac, rp);
1327                cip = PolyUtil.<BigRational> toComplex(cfac, ip);
1328    
1329                ap = crp.sum(cip.multiply(imag));
1330    
1331                //System.out.println("cp = " + cp);
1332                //System.out.println("rp = " + rp);
1333                //System.out.println("ip = " + ip);
1334                //System.out.println("crp = " + crp);
1335                //System.out.println("cip = " + cip);
1336                //System.out.println("ap  = " + ap);
1337    
1338                assertEquals("re(c)+i*im(c) = c", cp, ap);
1339            }
1340        }
1341    
1342    
1343        /**
1344         * Test product represenation conversion, rational numbers.
1345         * 
1346         */
1347        public void testProductConversionRN() {
1348            GenPolynomialRing<BigRational> ufac;
1349            ufac = new GenPolynomialRing<BigRational>(new BigRational(1), 1);
1350    
1351            ProductRing<GenPolynomial<BigRational>> pfac;
1352            pfac = new ProductRing<GenPolynomial<BigRational>>(ufac, rl);
1353    
1354            GenPolynomialRing<BigRational> dfac = new GenPolynomialRing<BigRational>(new BigRational(1), rl, to);
1355    
1356            GenPolynomial<BigRational> c;
1357            Product<GenPolynomial<BigRational>> cp;
1358    
1359            c = dfac.getONE();
1360            //System.out.println("c = " + c);
1361     
1362            cp = PolyUtil.<BigRational> toProduct(pfac, c);
1363            //System.out.println("cp = " + cp);
1364            assertTrue("isONE( cp )", cp.isONE());
1365    
1366            c = dfac.random(kl, ll, el, q);
1367            //System.out.println("c = " + c);
1368    
1369            cp = PolyUtil.<BigRational> toProduct(pfac, c);
1370            //System.out.println("cp = " + cp);
1371            assertTrue("!isONE( cp )", !cp.isONE());
1372        }
1373    
1374    
1375        /**
1376         * Test polynomal over product represenation conversion, algebraic numbers.
1377         * 
1378         */
1379        public void testPolyProductConversionAN() {
1380            GenPolynomialRing<BigRational> ufac;
1381            ufac = new GenPolynomialRing<BigRational>(new BigRational(1), 1);
1382    
1383            GenPolynomial<BigRational> m;
1384            m = ufac.univariate(0, 2);
1385            m = m.subtract(ufac.univariate(0, 1));
1386            //System.out.println("m = " + m);
1387    
1388            AlgebraicNumberRing<BigRational> afac;
1389            afac = new AlgebraicNumberRing<BigRational>(m);
1390            //System.out.println("afac = " + afac);
1391    
1392            ProductRing<AlgebraicNumber<BigRational>> pfac;
1393            pfac = new ProductRing<AlgebraicNumber<BigRational>>(afac, rl);
1394    
1395            GenPolynomialRing<Product<AlgebraicNumber<BigRational>>> dpfac;
1396            dpfac = new GenPolynomialRing<Product<AlgebraicNumber<BigRational>>>(pfac, 2);
1397    
1398            GenPolynomialRing<AlgebraicNumber<BigRational>> dfac;
1399            dfac = new GenPolynomialRing<AlgebraicNumber<BigRational>>(afac, 2, to);
1400    
1401    
1402            GenPolynomial<AlgebraicNumber<BigRational>> c;
1403            GenPolynomial<Product<AlgebraicNumber<BigRational>>> cp;
1404    
1405            c = dfac.getONE();
1406            //System.out.println("c = " + c);
1407    
1408            cp = PolyUtil.<AlgebraicNumber<BigRational>> toProductGen(dpfac, c);
1409            //System.out.println("cp = " + cp);
1410            assertTrue("isZERO( cp )", cp.isONE());
1411    
1412            c = dfac.random(kl, ll, el, q);
1413            //System.out.println("c = " + c);
1414    
1415            cp = PolyUtil.<AlgebraicNumber<BigRational>> toProductGen(dpfac, c);
1416            //System.out.println("cp = " + cp);
1417            assertTrue("!isONE( cp )", !cp.isONE());
1418        }
1419    
1420    }