001    /*
002     * $Id: GCDModEvalTest.java 2724 2009-07-09 20:16:03Z kredel $
003     */
004    
005    package edu.jas.ufd;
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.ModInteger;
016    import edu.jas.arith.ModIntegerRing;
017    import edu.jas.arith.PrimeList;
018    import edu.jas.poly.ExpVector;
019    import edu.jas.poly.GenPolynomial;
020    import edu.jas.poly.GenPolynomialRing;
021    import edu.jas.poly.PolyUtil;
022    import edu.jas.poly.TermOrder;
023    
024    
025    /**
026     * GCD Modular Evaluation algorithm tests with JUnit.
027     * @author Heinz Kredel.
028     */
029    
030    public class GCDModEvalTest extends TestCase {
031    
032    
033        /**
034         * main.
035         */
036        public static void main(String[] args) {
037            junit.textui.TestRunner.run(suite());
038        }
039    
040    
041        /**
042         * Constructs a <CODE>GCDModEvalTest</CODE> object.
043         * @param name String.
044         */
045        public GCDModEvalTest(String name) {
046            super(name);
047        }
048    
049    
050        /**
051         */
052        public static Test suite() {
053            TestSuite suite = new TestSuite(GCDModEvalTest.class);
054            return suite;
055        }
056    
057    
058        //private final static int bitlen = 100;
059    
060        GreatestCommonDivisorAbstract<ModInteger> ufd;
061    
062    
063        TermOrder to = new TermOrder(TermOrder.INVLEX);
064    
065    
066        GenPolynomialRing<ModInteger> dfac;
067    
068    
069        GenPolynomialRing<ModInteger> cfac;
070    
071    
072        GenPolynomialRing<GenPolynomial<ModInteger>> rfac;
073    
074    
075        PrimeList primes = new PrimeList();
076    
077    
078        ModIntegerRing mi;
079    
080    
081        ModInteger ai;
082    
083    
084        ModInteger bi;
085    
086    
087        ModInteger ci;
088    
089    
090        ModInteger di;
091    
092    
093        ModInteger ei;
094    
095    
096        GenPolynomial<ModInteger> a;
097    
098    
099        GenPolynomial<ModInteger> b;
100    
101    
102        GenPolynomial<ModInteger> c;
103    
104    
105        GenPolynomial<ModInteger> d;
106    
107    
108        GenPolynomial<ModInteger> e;
109    
110    
111        GenPolynomial<GenPolynomial<ModInteger>> ar;
112    
113    
114        GenPolynomial<GenPolynomial<ModInteger>> br;
115    
116    
117        GenPolynomial<GenPolynomial<ModInteger>> cr;
118    
119    
120        GenPolynomial<GenPolynomial<ModInteger>> dr;
121    
122    
123        GenPolynomial<GenPolynomial<ModInteger>> er;
124    
125    
126        int rl = 3;
127    
128    
129        int kl = 4;
130    
131    
132        int ll = 5;
133    
134    
135        int el = 3;
136    
137    
138        float q = 0.3f;
139    
140    
141        @Override
142        protected void setUp() {
143            a = b = c = d = e = null;
144            ai = bi = ci = di = ei = null;
145            ar = br = cr = dr = er = null;
146            //mi = new ModIntegerRing(primes.get(0),true);
147            mi = new ModIntegerRing(19, true);
148            //mi = new ModIntegerRing(19*17,true); // failing tests
149            //mi = new ModIntegerRing(primes.get(0).multiply(primes.get(1)),false); // failing tests
150            //ufd = new GreatestCommonDivisorPrimitive<ModInteger>();
151            ufd = new GreatestCommonDivisorModEval();
152            String[] vars = ExpVector.STDVARS(rl);
153            String[] cvars = ExpVector.STDVARS(rl - 1);
154            String[] rvars = new String[] { vars[rl - 1] };
155            dfac = new GenPolynomialRing<ModInteger>(mi, rl, to, vars);
156            cfac = new GenPolynomialRing<ModInteger>(mi, rl - 1, to, cvars);
157            rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to, rvars);
158            //System.out.println("mi = " + mi);
159        }
160    
161    
162        @Override
163        protected void tearDown() {
164            a = b = c = d = e = null;
165            ai = bi = ci = di = ei = null;
166            ar = br = cr = dr = er = null;
167            mi = null;
168            ufd = null;
169            dfac = null;
170            cfac = null;
171            rfac = null;
172        }
173    
174    
175        /**
176         * Test modular evaluation gcd.
177         * 
178         */
179        public void testModEvalGcd() {
180    
181            //GreatestCommonDivisorAbstract<ModInteger> ufd_me
182            //   = new GreatestCommonDivisorModEval();
183    
184            for (int i = 0; i < 1; i++) {
185                a = dfac.random(kl * (i + 2), ll + 2 * i, el + 0 * i, q);
186                b = dfac.random(kl * (i + 2), ll + 2 * i, el + 0 * i, q);
187                c = dfac.random(kl * (i + 2), ll + 2 * i, el + 0 * i, q);
188                c = c.multiply(dfac.univariate(0));
189                //a = ufd.basePrimitivePart(a);
190                //b = ufd.basePrimitivePart(b);
191    
192                if (a.isZERO() || b.isZERO() || c.isZERO()) {
193                    // skip for this turn
194                    continue;
195                }
196                assertTrue("length( c" + i + " ) <> 0", c.length() > 0);
197                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
198                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
199    
200                a = a.multiply(c);
201                b = b.multiply(c);
202                //System.out.println("a  = " + a);
203                //System.out.println("b  = " + b);
204    
205                d = ufd.gcd(a, b);
206    
207                c = ufd.basePrimitivePart(c).abs();
208                e = PolyUtil.<ModInteger> basePseudoRemainder(d, c);
209                //System.out.println("c  = " + c);
210                //System.out.println("d  = " + d);
211                assertTrue("c | gcd(ac,bc) " + e, e.isZERO());
212    
213                e = PolyUtil.<ModInteger> basePseudoRemainder(a, d);
214                //System.out.println("e = " + e);
215                assertTrue("gcd(a,b) | a" + e, e.isZERO());
216    
217                e = PolyUtil.<ModInteger> basePseudoRemainder(b, d);
218                //System.out.println("e = " + e);
219                assertTrue("gcd(a,b) | b" + e, e.isZERO());
220            }
221        }
222    
223    
224        /**
225         * Test base quotioent and remainder.
226         * 
227         */
228        public void testBaseQR() {
229    
230            dfac = new GenPolynomialRing<ModInteger>(mi, 1, to);
231    
232            for (int i = 0; i < 5; i++) {
233                a = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q);
234                c = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q);
235                //a = ufd.basePrimitivePart(a).abs();
236                //c = ufd.basePrimitivePart(c);
237                do {
238                    ci = mi.random(kl * (i + 2));
239                    ci = ci.sum(mi.getONE());
240                } while (ci.isZERO());
241    
242                //System.out.println("a  = " + a);
243                //System.out.println("c  = " + c);
244                //System.out.println("ci = " + ci);
245    
246                if (a.isZERO() || c.isZERO()) {
247                    // skip for this turn
248                    continue;
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                b = a.multiply(c);
255                //System.out.println("b  = " + b);
256                d = PolyUtil.<ModInteger> basePseudoRemainder(b, c);
257                //System.out.println("d  = " + d);
258    
259                assertTrue("rem(ac,c) == 0", d.isZERO());
260    
261                b = a.multiply(ci);
262                //System.out.println("b  = " + b);
263                d = b.divide(ci);
264                //System.out.println("d  = " + d);
265    
266                assertEquals("a == ac/c", a, d);
267    
268                b = a.multiply(c);
269                //System.out.println("b  = " + b);
270                d = PolyUtil.<ModInteger> basePseudoDivide(b, c);
271                //System.out.println("d  = " + d);
272    
273                assertEquals("a == ac/c", a, d);
274            }
275        }
276    
277    
278        /**
279         * Test base content and primitive part.
280         * 
281         */
282        public void testBaseContentPP() {
283    
284            for (int i = 0; i < 13; i++) {
285                c = dfac.random(kl * (i + 2), ll + 2 * i, el + i, q);
286                c = c.multiply(mi.random(kl * (i + 2)));
287    
288                if (c.isZERO()) {
289                    // skip for this turn
290                    continue;
291                }
292                assertTrue("length( c" + i + " ) <> 0", c.length() > 0);
293                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
294                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
295    
296                ci = ufd.baseContent(c);
297                d = ufd.basePrimitivePart(c);
298                //System.out.println("c  = " + c);
299                //System.out.println("ci = " + ci);
300                //System.out.println("d  = " + d);
301    
302                a = d.multiply(ci);
303                assertEquals("c == cont(c)pp(c)", c, a);
304            }
305        }
306    
307    
308        /**
309         * Test base gcd.
310         * 
311         */
312        public void testBaseGcd() {
313    
314            dfac = new GenPolynomialRing<ModInteger>(mi, 1, to);
315    
316            for (int i = 0; i < 5; i++) {
317                a = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q);
318                b = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q);
319                c = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q);
320                //a = ufd.basePrimitivePart(a);
321                //b = ufd.basePrimitivePart(b);
322                //c = ufd.basePrimitivePart(c).abs();
323    
324                //System.out.println("a  = " + a);
325                //System.out.println("b  = " + b);
326                //System.out.println("c  = " + c);
327    
328                if (a.isZERO() || b.isZERO() || c.isZERO()) {
329                    // skip for this turn
330                    continue;
331                }
332                assertTrue("length( c" + i + " ) <> 0", c.length() > 0);
333                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
334                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
335    
336                a = a.multiply(c);
337                b = b.multiply(c);
338    
339                d = ufd.baseGcd(a, b);
340                e = PolyUtil.<ModInteger> basePseudoRemainder(d, c);
341                //System.out.println("d  = " + d);
342    
343                assertTrue("c | gcd(ac,bc) " + e, e.isZERO());
344            }
345        }
346    
347    
348        /**
349         * Test recursive quotioent and remainder.
350         * 
351         */
352        public void testRecursiveQR() {
353            dfac = new GenPolynomialRing<ModInteger>(mi, 2, to);
354            cfac = new GenPolynomialRing<ModInteger>(mi, 2 - 1, to);
355            rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to);
356    
357            for (int i = 0; i < 5; i++) {
358                a = dfac.random(kl * (i + 1), ll + i, el + i, q);
359                a = ufd.basePrimitivePart(a).abs();
360    
361                c = dfac.random(kl * (i + 1), ll + i, el + i, q);
362                c = ufd.basePrimitivePart(a).abs();
363                cr = PolyUtil.<ModInteger> recursive(rfac, c);
364    
365                c = cfac.random(kl * (i + 1), ll + 2 * i, el + 2 * i, q);
366                c = ufd.basePrimitivePart(c).abs();
367    
368                ar = PolyUtil.<ModInteger> recursive(rfac, a);
369                //System.out.println("ar = " + ar);
370                //System.out.println("a  = " + a);
371                //System.out.println("c  = " + c);
372                //System.out.println("cr = " + cr);
373    
374                if (cr.isZERO() || c.isZERO()) {
375                    // skip for this turn
376                    continue;
377                }
378                assertTrue("length( cr" + i + " ) <> 0", cr.length() > 0);
379                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
380                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
381    
382    
383                br = ar.multiply(cr);
384                //System.out.println("br = " + br);
385                dr = PolyUtil.<ModInteger> recursivePseudoRemainder(br, cr);
386                //System.out.println("dr = " + dr);
387                d = PolyUtil.<ModInteger> distribute(dfac, dr);
388                //System.out.println("d  = " + d);
389    
390                assertTrue("rem(ac,c) == 0", d.isZERO());
391    
392                br = ar.multiply(c);
393                //System.out.println("br = " + br);
394                dr = PolyUtil.<ModInteger> recursiveDivide(br, c);
395                //System.out.println("dr = " + dr);
396                d = PolyUtil.<ModInteger> distribute(dfac, dr);
397                //System.out.println("d  = " + d);
398    
399                assertEquals("a == ac/c", a, d);
400            }
401        }
402    
403    
404        /**
405         * Test recursive content and primitive part.
406         * 
407         */
408        public void testRecursiveContentPP() {
409            dfac = new GenPolynomialRing<ModInteger>(mi, 2, to);
410            cfac = new GenPolynomialRing<ModInteger>(mi, 2 - 1, to);
411            rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to);
412    
413            for (int i = 0; i < 3; i++) {
414                cr = rfac.random(kl * (i + 2), ll + 2 * i, el + i, q);
415                //System.out.println("cr = " + cr);
416    
417                assertTrue("length( cr" + i + " ) <> 0", cr.length() > 0);
418                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
419                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
420    
421                c = ufd.recursiveContent(cr);
422                dr = ufd.recursivePrimitivePart(cr);
423                //System.out.println("c  = " + c);
424                //System.out.println("dr = " + dr);
425    
426                ar = dr.multiply(c);
427                assertEquals("c == cont(c)pp(c)", cr, ar);
428            }
429        }
430    
431    
432        /**
433         * Test recursive gcd.
434         * 
435         */
436        public void testRecursiveGCD() {
437            dfac = new GenPolynomialRing<ModInteger>(mi, 2, to);
438            cfac = new GenPolynomialRing<ModInteger>(mi, 2 - 1, to);
439            rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to);
440    
441            for (int i = 0; i < 2; i++) {
442                ar = rfac.random(kl, ll, el + i, q);
443                br = rfac.random(kl, ll, el, q);
444                cr = rfac.random(kl, ll, el, q);
445                //System.out.println("ar = " + ar);
446                //System.out.println("br = " + br);
447                //System.out.println("cr = " + cr);
448    
449                if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
450                    // skip for this turn
451                    continue;
452                }
453                assertTrue("length( cr" + i + " ) <> 0", cr.length() > 0);
454                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
455                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
456    
457                ar = ar.multiply(cr);
458                br = br.multiply(cr);
459                //System.out.println("ar = " + ar);
460                //System.out.println("br = " + br);
461    
462                dr = ufd.recursiveUnivariateGcd(ar, br);
463                //System.out.println("dr = " + dr);
464    
465                er = PolyUtil.<ModInteger> recursivePseudoRemainder(dr, cr);
466                //System.out.println("er = " + er);
467    
468                assertTrue("c | gcd(ac,bc) " + er, er.isZERO());
469            }
470        }
471    
472    
473        /**
474         * Test arbitrary recursive gcd.
475         * 
476         */
477        public void testArbitraryRecursiveGCD() {
478            dfac = new GenPolynomialRing<ModInteger>(mi, 2, to);
479            cfac = new GenPolynomialRing<ModInteger>(mi, 2 - 1, to);
480            rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to);
481    
482            for (int i = 0; i < 2; i++) {
483                ar = rfac.random(kl, ll, el + i, q);
484                br = rfac.random(kl, ll, el, q);
485                cr = rfac.random(kl, ll, el, q);
486                //System.out.println("ar = " + ar);
487                //System.out.println("br = " + br);
488                //System.out.println("cr = " + cr);
489    
490                if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
491                    // skip for this turn
492                    continue;
493                }
494                assertTrue("length( cr" + i + " ) <> 0", cr.length() > 0);
495                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
496                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
497    
498                ar = ar.multiply(cr);
499                br = br.multiply(cr);
500                //System.out.println("ar = " + ar);
501                //System.out.println("br = " + br);
502    
503                dr = ufd.recursiveGcd(ar, br);
504                //System.out.println("dr = " + dr);
505    
506                er = PolyUtil.<ModInteger> recursivePseudoRemainder(dr, cr);
507                //System.out.println("er = " + er);
508    
509                assertTrue("c | gcd(ac,bc) " + er, er.isZERO());
510            }
511        }
512    
513    
514        /**
515         * Test content and primitive part.
516         * 
517         */
518        public void testContentPP() {
519            dfac = new GenPolynomialRing<ModInteger>(mi, 3, to);
520    
521            for (int i = 0; i < 3; i++) {
522                c = dfac.random(kl * (i + 2), ll + 2 * i, el + i, q);
523                //System.out.println("cr = " + cr);
524                if (c.isZERO()) {
525                    continue;
526                }
527    
528                assertTrue("length( c" + i + " ) <> 0", c.length() > 0);
529                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
530                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
531    
532                a = ufd.content(c);
533                e = a.extend(dfac, 0, 0L);
534                b = ufd.primitivePart(c);
535                //System.out.println("c  = " + c);
536                //System.out.println("a  = " + a);
537                //System.out.println("e  = " + e);
538                //System.out.println("b  = " + b);
539    
540                d = e.multiply(b);
541                assertEquals("c == cont(c)pp(c)", d, c);
542            }
543        }
544    
545    
546        /**
547         * Test gcd 3 variables.
548         * 
549         */
550        public void testGCD3() {
551            dfac = new GenPolynomialRing<ModInteger>(mi, 3, to);
552    
553            for (int i = 0; i < 4; i++) {
554                a = dfac.random(kl, ll, el + i, q);
555                b = dfac.random(kl, ll, el, q);
556                c = dfac.random(kl, ll, el, q);
557                //System.out.println("a = " + a);
558                //System.out.println("b = " + b);
559                //System.out.println("c = " + c);
560    
561                if (a.isZERO() || b.isZERO() || c.isZERO()) {
562                    // skip for this turn
563                    continue;
564                }
565                assertTrue("length( c" + i + " ) <> 0", c.length() > 0);
566                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
567                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
568    
569                a = a.multiply(c);
570                b = b.multiply(c);
571                //System.out.println("a = " + a);
572                //System.out.println("b = " + b);
573    
574                d = ufd.gcd(a, b);
575                //System.out.println("d = " + d);
576    
577                e = PolyUtil.<ModInteger> basePseudoRemainder(d, c);
578                //System.out.println("e = " + e);
579    
580                assertTrue("c | gcd(ac,bc) " + e, e.isZERO());
581            }
582        }
583    
584    
585        /**
586         * Test gcd.
587         * 
588         */
589        public void testGCD() {
590            // dfac = new GenPolynomialRing<ModInteger>(mi,3,to);
591    
592            for (int i = 0; i < 1; i++) {
593                a = dfac.random(kl, ll, el, q);
594                b = dfac.random(kl, ll, el, q);
595                c = dfac.random(kl, ll, el, q);
596                //System.out.println("a = " + a);
597                //System.out.println("b = " + b);
598                //System.out.println("c = " + c);
599    
600                if (a.isZERO() || b.isZERO() || c.isZERO()) {
601                    // skip for this turn
602                    continue;
603                }
604                assertTrue("length( c" + i + " ) <> 0", c.length() > 0);
605                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
606                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
607    
608                a = a.multiply(c);
609                b = b.multiply(c);
610                //System.out.println("a = " + a);
611                //System.out.println("b = " + b);
612    
613                d = ufd.gcd(a, b);
614                //System.out.println("d = " + d);
615    
616                e = PolyUtil.<ModInteger> basePseudoRemainder(d, c);
617                //System.out.println("e = " + e);
618                assertTrue("c | gcd(ac,bc) " + e, e.isZERO());
619    
620                e = PolyUtil.<ModInteger> basePseudoRemainder(a, d);
621                //System.out.println("e = " + e);
622                assertTrue("gcd(a,b) | a " + e, e.isZERO());
623    
624                e = PolyUtil.<ModInteger> basePseudoRemainder(b, d);
625                //System.out.println("e = " + e);
626                assertTrue("gcd(a,b) | b " + e, e.isZERO());
627            }
628        }
629    
630    
631        /**
632         * Test lcm.
633         * 
634         */
635        public void testLCM() {
636            dfac = new GenPolynomialRing<ModInteger>(mi, 3, to);
637    
638            for (int i = 0; i < 1; i++) {
639                a = dfac.random(kl, ll, el, q);
640                b = dfac.random(kl, ll, el, q);
641                c = dfac.random(kl, 3, 2, q);
642                //System.out.println("a = " + a);
643                //System.out.println("b = " + b);
644                //System.out.println("c = " + c);
645    
646                if (a.isZERO() || b.isZERO() || c.isZERO()) {
647                    // skip for this turn
648                    continue;
649                }
650                assertTrue("length( a" + i + " ) <> 0", a.length() > 0);
651                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
652                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
653    
654                a = a.multiply(c);
655                b = b.multiply(c);
656    
657                c = ufd.gcd(a, b);
658                //System.out.println("c = " + c);
659    
660                d = ufd.lcm(a, b);
661                //System.out.println("d = " + d);
662    
663                e = c.multiply(d);
664                //System.out.println("e = " + e);
665                c = a.multiply(b);
666                //System.out.println("c = " + c);
667    
668                assertEquals("ab == gcd(a,b)lcm(ab)", c, e);
669            }
670        }
671    
672    
673        /**
674         * Test co-prime factors.
675         * 
676         */
677        public void testCoPrime() {
678    
679            dfac = new GenPolynomialRing<ModInteger>(mi, 3, to);
680    
681            a = dfac.random(kl, 3, 2, q);
682            b = dfac.random(kl, 3, 2, q);
683            c = dfac.random(kl, 3, 2, q);
684            //System.out.println("a  = " + a);
685            //System.out.println("b  = " + b);
686            //System.out.println("c  = " + c);
687    
688            if (a.isZERO() || b.isZERO() || c.isZERO()) {
689                // skip for this turn
690                return;
691            }
692            assertTrue("length( a ) <> 0", a.length() > 0);
693    
694            d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
695            e = a.multiply(b).multiply(c);
696            //System.out.println("d  = " + d);
697            //System.out.println("c  = " + c);
698    
699            List<GenPolynomial<ModInteger>> F = new ArrayList<GenPolynomial<ModInteger>>(5);
700            F.add(d);
701            F.add(a);
702            F.add(b);
703            F.add(c);
704            F.add(e);
705    
706    
707            List<GenPolynomial<ModInteger>> P = ufd.coPrime(F);
708            //System.out.println("F = " + F);
709            //System.out.println("P = " + P);
710    
711            assertTrue("is co-prime ", ufd.isCoPrime(P));
712            assertTrue("is co-prime of ", ufd.isCoPrime(P, F));
713    
714    
715            //P = ufd.coPrimeSquarefree(F);
716            //System.out.println("F = " + F);
717            //System.out.println("P = " + P);
718            //assertTrue("is co-prime ", ufd.isCoPrime(P) );
719            //assertTrue("is co-prime of ", ufd.isCoPrime(P,F) );
720    
721    
722            P = ufd.coPrimeRec(F);
723            //System.out.println("F = " + F);
724            //System.out.println("P = " + P);
725    
726            assertTrue("is co-prime ", ufd.isCoPrime(P));
727            assertTrue("is co-prime of ", ufd.isCoPrime(P, F));
728        }
729    
730    }