001    /*
002     * $Id: SquarefreeAlgModTest.java 2933 2009-12-29 13:13:34Z kredel $
003     */
004    
005    package edu.jas.ufd;
006    
007    
008    import java.util.SortedMap;
009    
010    import junit.framework.Test;
011    import junit.framework.TestCase;
012    import junit.framework.TestSuite;
013    
014    import edu.jas.arith.ModInteger;
015    import edu.jas.arith.ModIntegerRing;
016    import edu.jas.kern.ComputerThreads;
017    import edu.jas.poly.AlgebraicNumber;
018    import edu.jas.poly.AlgebraicNumberRing;
019    import edu.jas.poly.ExpVector;
020    import edu.jas.poly.GenPolynomial;
021    import edu.jas.poly.GenPolynomialRing;
022    import edu.jas.poly.PolyUtil;
023    import edu.jas.poly.TermOrder;
024    import edu.jas.structure.Power;
025    
026    
027    /**
028     * Squarefree factorization tests with JUnit.
029     * @author Heinz Kredel.
030     */
031    
032    public class SquarefreeAlgModTest extends TestCase {
033    
034    
035        /**
036         * main.
037         */
038        public static void main(String[] args) {
039            //BasicConfigurator.configure();
040            junit.textui.TestRunner.run(suite());
041            ComputerThreads.terminate();
042        }
043    
044    
045        /**
046         * Constructs a <CODE>SquarefreeAlgModTest</CODE> object.
047         * @param name String.
048         */
049        public SquarefreeAlgModTest(String name) {
050            super(name);
051        }
052    
053    
054        /**
055         */
056        public static Test suite() {
057            TestSuite suite = new TestSuite(SquarefreeAlgModTest.class);
058            return suite;
059        }
060    
061    
062        TermOrder to = new TermOrder(TermOrder.INVLEX);
063    
064    
065        //long p = 11L;
066        long p = 7L;
067    
068    
069        long qp;
070    
071    
072        int rl = 3;
073    
074    
075        int kl = 3;
076    
077    
078        int ll = 4;
079    
080    
081        int el = 3;
082    
083    
084        float q = 0.25f;
085    
086    
087        String[] vars;
088    
089    
090        String[] cvars;
091    
092    
093        String[] c1vars;
094    
095    
096        String[] rvars;
097    
098    
099        ModIntegerRing mfac;
100    
101    
102        String[] alpha;
103    
104    
105        GenPolynomialRing<ModInteger> mpfac;
106    
107    
108        GenPolynomial<ModInteger> agen;
109    
110    
111        AlgebraicNumberRing<ModInteger> fac;
112    
113    
114        GreatestCommonDivisorAbstract<AlgebraicNumber<ModInteger>> ufd;
115    
116    
117        SquarefreeFiniteFieldCharP<AlgebraicNumber<ModInteger>> sqf;
118    
119    
120        GenPolynomialRing<AlgebraicNumber<ModInteger>> dfac;
121    
122    
123        GenPolynomial<AlgebraicNumber<ModInteger>> a;
124    
125    
126        GenPolynomial<AlgebraicNumber<ModInteger>> b;
127    
128    
129        GenPolynomial<AlgebraicNumber<ModInteger>> c;
130    
131    
132        GenPolynomial<AlgebraicNumber<ModInteger>> d;
133    
134    
135        GenPolynomial<AlgebraicNumber<ModInteger>> e;
136    
137    
138        GenPolynomialRing<AlgebraicNumber<ModInteger>> cfac;
139    
140    
141        GenPolynomialRing<GenPolynomial<AlgebraicNumber<ModInteger>>> rfac;
142    
143    
144        GenPolynomial<GenPolynomial<AlgebraicNumber<ModInteger>>> ar;
145    
146    
147        GenPolynomial<GenPolynomial<AlgebraicNumber<ModInteger>>> br;
148    
149    
150        GenPolynomial<GenPolynomial<AlgebraicNumber<ModInteger>>> cr;
151    
152    
153        GenPolynomial<GenPolynomial<AlgebraicNumber<ModInteger>>> dr;
154    
155    
156        GenPolynomial<GenPolynomial<AlgebraicNumber<ModInteger>>> er;
157    
158    
159        @Override
160        protected void setUp() {
161            vars = ExpVector.STDVARS(rl);
162            cvars = ExpVector.STDVARS(rl - 1);
163            c1vars = new String[] { cvars[0] };
164            rvars = new String[] { vars[rl - 1] };
165    
166            mfac = new ModIntegerRing(p);
167            alpha = new String[] { "alpha" };
168            mpfac = new GenPolynomialRing<ModInteger>(mfac, 1, to, alpha);
169            agen = mpfac.univariate(0, 2);
170            agen = agen.sum(mpfac.getONE()); // x^2 + 1, is irred mod 7, 11, 19
171            fac = new AlgebraicNumberRing<ModInteger>(agen, true);
172            qp = 1L;
173            for (int i = 0; i < agen.degree(0); i++) {
174                qp = qp * p;
175            }
176            //System.out.println("p = " + p + ", qp = " + qp);
177    
178            //ufd = new GreatestCommonDivisorSubres<AlgebraicNumber<ModInteger>>();
179            //ufd = GCDFactory.<AlgebraicNumber<ModInteger>> getImplementation(fac);
180            ufd = GCDFactory.<AlgebraicNumber<ModInteger>> getProxy(fac);
181    
182            sqf = new SquarefreeFiniteFieldCharP<AlgebraicNumber<ModInteger>>(fac);
183    
184            SquarefreeAbstract<AlgebraicNumber<ModInteger>> sqff = SquarefreeFactory.getImplementation(fac);
185            //System.out.println("sqf  = " + sqf);
186            //System.out.println("sqff = " + sqff);
187            assertEquals("sqf == sqff ", sqf.getClass(), sqff.getClass());
188    
189            a = b = c = d = e = null;
190            ar = br = cr = dr = er = null;
191        }
192    
193    
194        @Override
195        protected void tearDown() {
196            a = b = c = d = e = null;
197            ar = br = cr = dr = er = null;
198            //ComputerThreads.terminate();
199        }
200    
201    
202        /**
203         * Test base squarefree.
204         * 
205         */
206        public void testBaseSquarefree() {
207            //System.out.println("\nbase:");
208    
209            dfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, 1, to, rvars);
210    
211            a = dfac.random(kl, ll, el + 2, q);
212            b = dfac.random(kl, ll, el + 2, q);
213            c = dfac.random(kl, ll, el, q);
214            //System.out.println("a  = " + a);
215            //System.out.println("b  = " + b);
216            //System.out.println("c  = " + c);
217    
218            if (a.isZERO() || b.isZERO() || c.isZERO()) {
219                // skip for this turn
220                return;
221            }
222    
223            // a a b b b c
224            d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
225            c = a.multiply(b).multiply(c);
226            //System.out.println("c  = " + c);
227            //System.out.println("d  = " + d);
228    
229            c = sqf.baseSquarefreePart(c);
230            d = sqf.baseSquarefreePart(d);
231            //System.out.println("c  = " + c);
232            //System.out.println("d  = " + d);
233            assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
234            assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
235    
236            e = PolyUtil.<AlgebraicNumber<ModInteger>> basePseudoRemainder(d, c);
237            //System.out.println("e  = " + e);
238            assertTrue("squarefree(abc) | squarefree(aabbbc) " + e, e.isZERO());
239        }
240    
241    
242        /**
243         * Test base squarefree factors.
244         * 
245         */
246        public void testBaseSquarefreeFactors() {
247    
248            dfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, 1, to, rvars);
249    
250            a = dfac.random(kl, ll, el + 3, q);
251            b = dfac.random(kl, ll, el + 3, q);
252            c = dfac.random(kl, ll, el + 2, q);
253            //System.out.println("a  = " + a);
254            //System.out.println("b  = " + b);
255            //System.out.println("c  = " + c);
256    
257            if (a.isZERO() || b.isZERO() || c.isZERO()) {
258                // skip for this turn
259                return;
260            }
261    
262            // a a b b b c
263            d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
264            //System.out.println("d  = " + d);
265    
266            SortedMap<GenPolynomial<AlgebraicNumber<ModInteger>>, Long> sfactors;
267            sfactors = sqf.baseSquarefreeFactors(d);
268            //System.out.println("sfactors = " + sfactors);
269            assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
270        }
271    
272    
273        /**
274         * Test recursive squarefree.
275         * 
276         */
277        public void testRecursiveSquarefree() {
278            //System.out.println("\nrecursive:");
279    
280            cfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, 2 - 1, to, c1vars);
281            rfac = new GenPolynomialRing<GenPolynomial<AlgebraicNumber<ModInteger>>>(cfac, 1, to, rvars);
282    
283            ar = rfac.random(kl, ll, el, q);
284            br = rfac.random(kl, ll, el, q);
285            cr = rfac.random(kl, ll, el, q);
286            //System.out.println("ar = " + ar);
287            //System.out.println("br = " + br);
288            //System.out.println("cr = " + cr);
289    
290            if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
291                // skip for this turn
292                return;
293            }
294    
295            dr = ar.multiply(ar).multiply(br).multiply(br);
296            cr = ar.multiply(br);
297            //System.out.println("cr  = " + cr);
298            //System.out.println("dr  = " + dr);
299    
300            cr = sqf.recursiveUnivariateSquarefreePart(cr);
301            dr = sqf.recursiveUnivariateSquarefreePart(dr);
302            //System.out.println("cr  = " + cr);
303            //System.out.println("dr  = " + dr);
304            assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr));
305            assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr));
306    
307            er = PolyUtil.<AlgebraicNumber<ModInteger>> recursivePseudoRemainder(dr, cr);
308            //System.out.println("er  = " + er);
309            assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO());
310        }
311    
312    
313        /**
314         * Test recursive squarefree factors.
315         * 
316         */
317        public void testRecursiveSquarefreeFactors() {
318    
319            cfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, 2 - 1, to, c1vars);
320            rfac = new GenPolynomialRing<GenPolynomial<AlgebraicNumber<ModInteger>>>(cfac, 1, to, rvars);
321    
322            ar = rfac.random(kl, 3, 2, q);
323            br = rfac.random(kl, 3, 2, q);
324            cr = rfac.random(kl, 3, 2, q);
325            //System.out.println("ar = " + ar);
326            //System.out.println("br = " + br);
327            //System.out.println("cr = " + cr);
328    
329            if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
330                // skip for this turn
331                return;
332            }
333    
334            dr = ar.multiply(cr).multiply(br).multiply(br);
335            //System.out.println("dr  = " + dr);
336    
337            SortedMap<GenPolynomial<GenPolynomial<AlgebraicNumber<ModInteger>>>, Long> sfactors;
338            sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr);
339            //System.out.println("sfactors = " + sfactors);
340    
341            assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors));
342        }
343    
344    
345        /**
346         * Test squarefree.
347         * 
348         */
349        public void testSquarefree() {
350            //System.out.println("\nfull:");
351    
352            dfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, rl, to, vars);
353    
354            a = dfac.random(kl, 3, 2, q);
355            b = dfac.random(kl, 3, 2, q);
356            c = dfac.random(kl, 3, 2, q);
357            //System.out.println("a  = " + a);
358            //System.out.println("b  = " + b);
359            //System.out.println("c  = " + c);
360    
361            if (a.isZERO() || b.isZERO() || c.isZERO()) {
362                // skip for this turn
363                return;
364            }
365    
366            d = a.multiply(a).multiply(b).multiply(b).multiply(c);
367            c = a.multiply(b).multiply(c);
368            //System.out.println("c  = " + c);
369            //System.out.println("d  = " + d);
370    
371            c = sqf.squarefreePart(c);
372            d = sqf.squarefreePart(d);
373            //System.out.println("c  = " + c);
374            //System.out.println("d  = " + d);
375            assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
376            assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
377    
378            e = PolyUtil.<AlgebraicNumber<ModInteger>> basePseudoRemainder(d, c);
379            //System.out.println("e  = " + e);
380            assertTrue("squarefree(abc) | squarefree(aabbc) " + e, e.isZERO());
381        }
382    
383    
384        /**
385         * Test squarefree factors.
386         * 
387         */
388        public void testSquarefreeFactors() {
389    
390            dfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, rl, to, vars);
391    
392            a = dfac.random(kl, 3, 2, q);
393            b = dfac.random(kl, 3, 2, q);
394            c = dfac.random(kl, 3, 2, q);
395            //System.out.println("a  = " + a);
396            //System.out.println("b  = " + b);
397            //System.out.println("c  = " + c);
398    
399            if (a.isZERO() || b.isZERO() || c.isZERO()) {
400                // skip for this turn
401                return;
402            }
403    
404            d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
405            //System.out.println("d  = " + d);
406    
407            SortedMap<GenPolynomial<AlgebraicNumber<ModInteger>>, Long> sfactors;
408            sfactors = sqf.squarefreeFactors(d);
409            //System.out.println("sfactors = " + sfactors);
410            assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
411        }
412    
413    
414        /* ------------char-th root ------------------------- */
415    
416    
417        /**
418         * Test base squarefree with char-th root.
419         * 
420         */
421        public void testBaseSquarefreeCharRoot() {
422            //System.out.println("\nbase CharRoot:");
423    
424            long p = fac.characteristic().longValue();
425    
426            //dfac = new GenPolynomialRing<ModInteger>(fac,1,to,rvars);
427            dfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, 1, to, rvars);
428    
429            a = dfac.random(kl, ll + 1, el + 1, q).monic();
430            b = dfac.random(kl, ll + 1, el + 1, q).monic();
431            c = dfac.random(kl, ll, el, q).monic();
432    
433            if (a.isZERO() || b.isZERO() || c.isZERO() || a.isConstant() || b.isConstant()) {
434                // skip for this turn
435                return;
436            }
437            //System.out.println("a  = " + a);
438            //System.out.println("b  = " + b);
439            //System.out.println("c  = " + c);
440    
441            e = Power.<GenPolynomial<AlgebraicNumber<ModInteger>>> positivePower(b, p);
442            //System.out.println("b^p  = " + e);
443            // a a b^p c
444            d = a.multiply(a).multiply(e).multiply(c);
445            c = a.multiply(b).multiply(c);
446            //System.out.println("c  = " + c);
447            //System.out.println("d  = " + d);
448    
449            c = sqf.baseSquarefreePart(c);
450            d = sqf.baseSquarefreePart(d);
451            //System.out.println("c  = " + c);
452            //System.out.println("d  = " + d);
453            assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
454            assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
455    
456            e = PolyUtil.<AlgebraicNumber<ModInteger>> basePseudoRemainder(d, c);
457            //System.out.println("e  = " + e);
458            assertTrue("squarefree(abc) | squarefree(aab^pc) " + e, e.isZERO());
459        }
460    
461    
462        /**
463         * Test base squarefree factors with char-th root.
464         * 
465         */
466        public void testBaseSquarefreeFactorsCharRoot() {
467    
468            long p = fac.characteristic().longValue();
469    
470            //dfac = new GenPolynomialRing<ModInteger>(fac,1,to,rvars);
471            dfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, 1, to, rvars);
472    
473            a = dfac.random(kl, ll + 1, el + 2, q).monic();
474            b = dfac.random(kl, ll + 1, el + 2, q).monic();
475            c = dfac.random(kl, ll, el + 1, q).monic();
476    
477            if (a.isZERO() || b.isZERO() || c.isZERO() || a.isConstant() || b.isConstant()) {
478                // skip for this turn
479                return;
480            }
481            //System.out.println("a  = " + a);
482            //System.out.println("b  = " + b);
483            //System.out.println("c  = " + c);
484    
485            e = Power.<GenPolynomial<AlgebraicNumber<ModInteger>>> positivePower(b, p);
486            //System.out.println("b^p  = " + e);
487            // a a b^p 
488            d = a.multiply(a).multiply(e);
489            //d = d.monic();
490            //System.out.println("d  = " + d);
491    
492            SortedMap<GenPolynomial<AlgebraicNumber<ModInteger>>, Long> sfactors;
493            sfactors = sqf.baseSquarefreeFactors(d);
494            //System.out.println("sfactors = " + sfactors);
495            assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
496        }
497    
498    
499        /**
500         * Test base squarefree with char-th root, two times.
501         * 
502         */
503        public void testBaseSquarefreeCharRoot2() {
504            //System.out.println("\nbase CharRoot 2:");
505    
506            long p = fac.characteristic().longValue();
507    
508            //dfac = new GenPolynomialRing<ModInteger>(fac,1,to,rvars);
509            dfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, 1, to, rvars);
510    
511            a = dfac.random(kl, ll + 1, el + 1, q).monic();
512            b = dfac.random(kl, ll + 1, el + 1, q).monic();
513            c = dfac.random(kl, ll, el, q).monic();
514    
515            if (a.isZERO() || b.isZERO() || c.isZERO() || a.isConstant() || b.isConstant()) {
516                // skip for this turn
517                return;
518            }
519            //System.out.println("a  = " + a);
520            //System.out.println("b  = " + b);
521            //System.out.println("c  = " + c);
522    
523            e = Power.<GenPolynomial<AlgebraicNumber<ModInteger>>> positivePower(b, qp);
524            //System.out.println("b^qp  = " + e);
525            // a a b^qp c
526            d = a.multiply(a).multiply(e).multiply(c);
527            c = a.multiply(b).multiply(c);
528            //System.out.println("c  = " + c);
529            //System.out.println("d  = " + d);
530    
531            c = sqf.baseSquarefreePart(c);
532            d = sqf.baseSquarefreePart(d);
533            //System.out.println("c  = " + c);
534            //System.out.println("d  = " + d);
535            assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
536            assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
537    
538            e = PolyUtil.<AlgebraicNumber<ModInteger>> basePseudoRemainder(d, c);
539            //System.out.println("e  = " + e);
540            assertTrue("squarefree(abc) | squarefree(aab^pc) " + e, e.isZERO());
541        }
542    
543    
544        /**
545         * Test base squarefree factors with char-th root, two times.
546         * 
547         */
548        public void testBaseSquarefreeFactorsCharRoot2() {
549    
550            long p = fac.characteristic().longValue();
551    
552            //dfac = new GenPolynomialRing<ModInteger>(fac,1,to,rvars);
553            dfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, 1, to, rvars);
554    
555            a = dfac.random(kl, ll + 1, el + 2, q).monic();
556            b = dfac.random(kl, ll + 1, el + 2, q).monic();
557            c = dfac.random(kl, ll, el + 2, q).monic();
558    
559            if (a.isZERO() || b.isZERO() || c.isZERO() || a.isConstant() || b.isConstant()) {
560                // skip for this turn
561                return;
562            }
563            //System.out.println("a  = " + a);
564            //System.out.println("b  = " + b);
565            //System.out.println("c  = " + c);
566    
567            e = Power.<GenPolynomial<AlgebraicNumber<ModInteger>>> positivePower(b, qp);
568            //System.out.println("b^qp  = " + e);
569            // a a b^qp 
570            d = a.multiply(a).multiply(e);
571            //d = d.monic();
572            //System.out.println("d  = " + d);
573    
574            SortedMap<GenPolynomial<AlgebraicNumber<ModInteger>>, Long> sfactors;
575            sfactors = sqf.baseSquarefreeFactors(d);
576            //System.out.println("sfactors = " + sfactors);
577            assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
578        }
579    
580    
581        /**
582         * Test recursive squarefree with char-th root.
583         * 
584         */
585        public void testRecursiveSquarefreeCharRoot() {
586            //System.out.println("\nrecursive CharRoot:");
587    
588            long p = fac.characteristic().longValue();
589    
590            cfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, 2 - 1, to, c1vars);
591            rfac = new GenPolynomialRing<GenPolynomial<AlgebraicNumber<ModInteger>>>(cfac, 1, to, rvars);
592    
593            ar = rfac.random(kl, 3, el, q);
594            br = rfac.random(kl, 3, el, q);
595            cr = rfac.random(kl, 3, el, q);
596            //cr = rfac.getONE();
597    
598            if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
599                // skip for this turn
600                return;
601            }
602            //ar = PolyUtil.<AlgebraicNumber<ModInteger>>monic(ar);
603            //br = PolyUtil.<AlgebraicNumber<ModInteger>>monic(br);
604            //cr = PolyUtil.<AlgebraicNumber<ModInteger>>monic(cr);
605            //System.out.println("ar = " + ar);
606            //System.out.println("br = " + br);
607            //System.out.println("cr = " + cr);
608    
609            er = Power.<GenPolynomial<GenPolynomial<AlgebraicNumber<ModInteger>>>> positivePower(br, p);
610            //System.out.println("b^p  = " + er);
611            // a a b^p c
612            dr = ar.multiply(ar).multiply(er).multiply(cr);
613            cr = ar.multiply(br).multiply(cr);
614            //System.out.println("cr  = " + cr);
615            //System.out.println("dr  = " + dr);
616    
617            cr = sqf.recursiveUnivariateSquarefreePart(cr);
618            dr = sqf.recursiveUnivariateSquarefreePart(dr);
619            //System.out.println("cr  = " + cr);
620            //System.out.println("dr  = " + dr);
621            assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr));
622            assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr));
623    
624            er = PolyUtil.<AlgebraicNumber<ModInteger>> recursivePseudoRemainder(dr, cr);
625            //System.out.println("er  = " + er);
626            assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO());
627        }
628    
629    
630        /**
631         * Test recursive squarefree factors with char-th root.
632         * 
633         */
634        public void testRecursiveSquarefreeFactorsCharRoot() {
635    
636            long p = fac.characteristic().longValue();
637    
638            cfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, 2 - 1, to, c1vars);
639            rfac = new GenPolynomialRing<GenPolynomial<AlgebraicNumber<ModInteger>>>(cfac, 1, to, rvars);
640    
641            ar = rfac.random(kl, 3, 2, q);
642            br = rfac.random(kl, 3, 2, q);
643            cr = rfac.random(kl, 3, 2, q);
644            //cr = rfac.getONE();
645    
646            if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
647                // skip for this turn
648                return;
649            }
650            //ar = PolyUtil.<AlgebraicNumber<ModInteger>>monic(ar);
651            //br = PolyUtil.<AlgebraicNumber<ModInteger>>monic(br);
652            //cr = PolyUtil.<AlgebraicNumber<ModInteger>>monic(cr);
653            //System.out.println("ar = " + ar);
654            //System.out.println("br = " + br);
655            //System.out.println("cr = " + cr);
656    
657            er = Power.<GenPolynomial<GenPolynomial<AlgebraicNumber<ModInteger>>>> positivePower(br, p);
658            //System.out.println("b^p  = " + er);
659            // a a b^p c
660            dr = ar.multiply(ar).multiply(er).multiply(cr);
661            //System.out.println("dr  = " + dr);
662    
663            SortedMap<GenPolynomial<GenPolynomial<AlgebraicNumber<ModInteger>>>, Long> sfactors;
664            sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr);
665            //System.out.println("sfactors = " + sfactors);
666    
667            assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors));
668        }
669    
670    
671        /**
672         * Test squarefree with char-th root.
673         * 
674         */
675        public void testSquarefreeCharRoot() {
676            //System.out.println("\nfull CharRoot:");
677    
678            long p = fac.characteristic().longValue();
679    
680            dfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, rl, to, vars);
681    
682            a = dfac.random(kl, 3, 3, q);
683            b = dfac.random(kl, 3, 3, q);
684            c = dfac.random(kl, 3, 3, q);
685            //c = dfac.getONE();
686    
687            if (a.isZERO() || b.isZERO() || c.isZERO() || a.isConstant() || b.isConstant()) {
688                // skip for this turn
689                return;
690            }
691            //a = a.monic();
692            //b = b.monic();
693            //c = c.monic();
694            //System.out.println("a  = " + a);
695            //System.out.println("b  = " + b);
696            //System.out.println("c  = " + c);
697    
698            e = Power.<GenPolynomial<AlgebraicNumber<ModInteger>>> positivePower(b, p);
699            //System.out.println("b^p  = " + e);
700            // a a b^p c
701            d = a.multiply(a).multiply(e).multiply(c);
702            c = a.multiply(b).multiply(c);
703            //System.out.println("c  = " + c);
704            //System.out.println("d  = " + d);
705    
706            c = sqf.squarefreePart(c);
707            d = sqf.squarefreePart(d);
708            //System.out.println("c  = " + c);
709            //System.out.println("d  = " + d);
710            assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
711            assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
712    
713            e = PolyUtil.<AlgebraicNumber<ModInteger>> basePseudoRemainder(d, c);
714            //System.out.println("e  = " + e);
715            assertTrue("squarefree(abc) | squarefree(aab^pc) " + e, e.isZERO());
716        }
717    
718    
719        /**
720         * Test squarefree factors with char-th root.
721         * 
722         */
723        public void testSquarefreeFactorsCharRoot() {
724    
725            long p = fac.characteristic().longValue();
726    
727            dfac = new GenPolynomialRing<AlgebraicNumber<ModInteger>>(fac, rl, to, vars);
728    
729            a = dfac.random(kl, 3, 3, q);
730            b = dfac.random(kl, 3, 3, q);
731            c = dfac.random(kl, 3, 3, q);
732            //c = dfac.getONE();
733    
734            if (a.isZERO() || b.isZERO() || c.isZERO() || a.isConstant() || b.isConstant()) {
735                // skip for this turn
736                return;
737            }
738            //a = a.monic();
739            //b = b.monic();
740            //c = c.monic();
741            //System.out.println("a  = " + a);
742            //System.out.println("b  = " + b);
743            //System.out.println("c  = " + c);
744    
745            e = Power.<GenPolynomial<AlgebraicNumber<ModInteger>>> positivePower(b, p);
746            //System.out.println("b^p  = " + e);
747            // a a b^p c
748            d = a.multiply(a).multiply(e).multiply(c);
749            //System.out.println("d  = " + d);
750    
751            SortedMap<GenPolynomial<AlgebraicNumber<ModInteger>>, Long> sfactors;
752            sfactors = sqf.squarefreeFactors(d);
753            //System.out.println("sfactors = " + sfactors);
754    
755            assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
756        }
757    
758    }