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