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