001/*
002 * $Id$
003 */
004
005package edu.jas.fd;
006
007
008import java.util.List;
009import java.util.ArrayList;
010import java.util.Collection;
011
012import edu.jas.arith.BigInteger;
013import edu.jas.arith.BigRational;
014import edu.jas.kern.ComputerThreads;
015import edu.jas.poly.GenPolynomial;
016import edu.jas.poly.GenSolvablePolynomial;
017import edu.jas.poly.GenSolvablePolynomialRing;
018import edu.jas.poly.PolyUtil;
019import edu.jas.poly.RecSolvablePolynomial;
020import edu.jas.poly.RecSolvablePolynomialRing;
021import edu.jas.poly.RelationGenerator;
022import edu.jas.poly.TermOrder;
023import edu.jas.poly.WeylRelationsIterated;
024
025import junit.framework.Test;
026import junit.framework.TestCase;
027import junit.framework.TestSuite;
028
029
030/**
031 * FDUtil tests with JUnit.
032 * @author Heinz Kredel
033 */
034
035public class FDUtilTest extends TestCase {
036
037
038    /**
039     * main.
040     */
041    public static void main(String[] args) {
042        junit.textui.TestRunner.run(suite());
043        ComputerThreads.terminate();
044    }
045
046
047    /**
048     * Constructs a <CODE>FDUtilTest</CODE> object.
049     * @param name String.
050     */
051    public FDUtilTest(String name) {
052        super(name);
053    }
054
055
056    /**
057     */
058    public static Test suite() {
059        TestSuite suite = new TestSuite(FDUtilTest.class);
060        return suite;
061    }
062
063
064    TermOrder to = new TermOrder(TermOrder.INVLEX);
065
066
067    GenSolvablePolynomialRing<BigInteger> dfac;
068
069
070    GenSolvablePolynomialRing<BigRational> rdfac;
071
072
073    GenSolvablePolynomialRing<GenPolynomial<BigInteger>> rfac;
074
075
076    GenSolvablePolynomialRing<GenPolynomial<BigRational>> rrfac;
077
078
079    RecSolvablePolynomialRing<BigRational> rsfac;
080
081
082    GenSolvablePolynomial<BigInteger> a, b, c, d, e, f;
083
084
085    GenSolvablePolynomial<GenPolynomial<BigInteger>> ar, br, cr, dr, er, fr;
086
087
088    GenSolvablePolynomial<GenPolynomial<BigRational>> arr, brr, abrr, barr, crr, drr, err, frr, x1;
089
090
091    RecSolvablePolynomial<BigRational> as, bs, cs, ds, es, fs;
092
093
094    int rl = 4;
095
096
097    int kl = 2;
098
099
100    int ll = 4;
101
102
103    int el = 3;
104
105
106    float q = 0.35f;
107
108
109    @Override
110    protected void setUp() {
111        a = b = c = d = e = null;
112        ar = br = cr = dr = er = null;
113        String[] vars = new String[] { "a", "b", "c", "d" };
114        rl = vars.length;
115        dfac = new GenSolvablePolynomialRing<BigInteger>(new BigInteger(1), to, vars);
116        RelationGenerator<BigInteger> wl = new WeylRelationsIterated<BigInteger>();
117        dfac.addRelations(wl);
118        rfac = dfac.recursive(1);
119        rdfac = new GenSolvablePolynomialRing<BigRational>(new BigRational(1), to, vars);
120        RelationGenerator<BigRational> wlr = new WeylRelationsIterated<BigRational>();
121        rdfac.addRelations(wlr);
122        rrfac = rdfac.recursive(1);
123    }
124
125
126    @Override
127    protected void tearDown() {
128        a = b = c = d = e = null;
129        ar = br = cr = dr = er = null;
130        dfac = null;
131        rfac = null;
132    }
133
134
135    /**
136     * Test base pseudo division.
137     */
138    public void testBasePseudoDivisionExact() {
139        //System.out.println("dfac  = " + dfac.toScript());
140        do {
141            a = dfac.random(kl, ll + 1, el, q);
142        } while (a.isZERO());
143        //a = dfac.parse(" 3 x^5 + 44 ");
144        //System.out.println("a = " + a);
145
146        do {
147            b = dfac.random(kl, ll + 1, el, q);
148        } while (b.isZERO());
149        //a = a.sum(b);
150        //b = dfac.parse(" 2 x^2 + 40 ");
151        //System.out.println("b = " + b);
152
153        // non commutative
154        c = b.multiply(a);
155        d = a.multiply(b);
156        //System.out.println("c = " + c);
157        //System.out.println("d = " + d);
158        assertTrue("c != 0: ", !c.isZERO());
159        assertTrue("d != 0: ", !d.isZERO());
160
161        assertTrue("a*b != b*a", !c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector()));
162
163        // divide 
164        e = FDUtil.<BigInteger> leftBasePseudoQuotient(c, a);
165        //System.out.println("e = " + e);
166        assertEquals("b == b*a/a: ", b, e);
167
168        f = FDUtil.<BigInteger> rightBasePseudoQuotient(c, b);
169        //System.out.println("f = " + f);
170        assertEquals("a == b*a/b: ", a, f);
171
172        e = FDUtil.<BigInteger> rightBasePseudoQuotient(d, a);
173        //System.out.println("e = " + e);
174        assertEquals("b == a*b/a: ", b, e);
175
176        f = FDUtil.<BigInteger> leftBasePseudoQuotient(d, b);
177        //System.out.println("f = " + f);
178        assertEquals("a == a*b/b: ", a, f);
179    }
180
181
182    /**
183     * Test base pseudo division.
184     */
185    //@SuppressWarnings({ "cast" })
186    public void testBasePseudoDivision() {
187        String[] names = new String[] { "x" };
188        GenSolvablePolynomialRing<BigInteger> dfac;
189        dfac = new GenSolvablePolynomialRing<BigInteger>(new BigInteger(1), to, names);
190        GenSolvablePolynomialRing<BigRational> rdfac;
191        rdfac = new GenSolvablePolynomialRing<BigRational>(new BigRational(1), dfac);
192        //System.out.println("dfac  = " + dfac.toScript());
193
194        do {
195            a = dfac.random(kl, ll * 1, el + 0, q);
196        } while (a.isZERO());
197        a = dfac.parse("3 x**5 + 44");
198        //System.out.println("a = " + a);
199
200        do {
201            b = dfac.random(kl, ll * 2, el + 1, q);
202        } while (b.isZERO());
203        //a = a.sum(b);
204        b = dfac.parse("2 x**2 + 40");
205        //System.out.println("b = " + b);
206        //System.out.println("a = " + a);
207
208        GenPolynomial<BigInteger>[] QR = PolyUtil.<BigInteger> basePseudoQuotientRemainder(a, b);
209        c = (GenSolvablePolynomial<BigInteger>) QR[0];
210        d = (GenSolvablePolynomial<BigInteger>) QR[1];
211        //System.out.println("c   = " + c);
212        //System.out.println("d   = " + d);
213
214        boolean t = PolyUtil.<BigInteger> isBasePseudoQuotientRemainder(a, b, c, d);
215        assertTrue("lc^n c = e b + f: " + f, t);
216
217        GenSolvablePolynomial<BigInteger>[] QRs = FDUtil.<BigInteger> leftBasePseudoQuotientRemainder(a, b);
218        e = QRs[0];
219        f = QRs[1];
220        //System.out.println("e   = " + e);
221        //System.out.println("f   = " + f);
222
223        t = PolyUtil.<BigInteger> isBasePseudoQuotientRemainder(a, b, e, f);
224        assertTrue("ore(lc^n) c = e b + f: " + f, t);
225
226        // compare with field coefficients:
227        GenSolvablePolynomial<BigRational> ap, bp, cp, dp, ep, fp, qp, rp, rhs;
228        ap = (GenSolvablePolynomial<BigRational>) PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, a);
229        bp = (GenSolvablePolynomial<BigRational>) PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, b);
230        cp = (GenSolvablePolynomial<BigRational>) PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, c);
231        dp = (GenSolvablePolynomial<BigRational>) PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, d);
232        ep = (GenSolvablePolynomial<BigRational>) PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, e);
233        fp = (GenSolvablePolynomial<BigRational>) PolyUtil.<BigRational> fromIntegerCoefficients(rdfac, f);
234        //System.out.println("ap  = " + ap);
235        //System.out.println("bp  = " + bp);
236        //System.out.println("cp  = " + cp);
237        //System.out.println("dp  = " + dp);
238        //System.out.println("ep  = " + ep);
239        //System.out.println("fp  = " + fp);
240
241        qp = (GenSolvablePolynomial<BigRational>) ap.divide(bp);
242        rp = (GenSolvablePolynomial<BigRational>) ap.remainder(bp);
243        //System.out.println("qp  = " + qp);
244        //System.out.println("rp  = " + rp);
245        GenSolvablePolynomial<BigRational>[] QRr = ap.quotientRemainder(bp);
246        assertEquals("qp == QRr[0]: ", qp, QRr[0]);
247        assertEquals("rp == QRr[1]: ", rp, QRr[1]);
248
249        rhs = (GenSolvablePolynomial<BigRational>) qp.multiply(bp).sum(rp);
250        //System.out.println("qp bp + rp  = " + rhs);
251        assertEquals("ap == qp bp + rp: ", ap, rhs);
252
253        assertEquals("cp == qp: ", qp.monic(), cp.monic());
254        assertEquals("dp == rp: ", rp.monic(), dp.monic());
255        //System.out.println("dp = qp: " + qp.monic().equals(dp.monic()) );
256        assertEquals("ep == qp: ", ep.monic(), cp.monic());
257        assertEquals("fp == rp: ", fp.monic(), dp.monic());
258    }
259
260
261    /**
262     * Test recursive pseudo division.
263     * @see edu.jas.ufd.PolyUfdUtilTest#testRecursivePseudoDivisionSparse
264     */
265    public void testRecursivePseudoDivision() {
266        //String[] cnames = new String[] { "x" };
267        //String[] mnames = new String[] { "t" };
268        String[] names = new String[] { "t", "x", "y", "z" };
269        rdfac = new GenSolvablePolynomialRing<BigRational>(new BigRational(1), to, names);
270        RelationGenerator<BigRational> wl = new WeylRelationsIterated<BigRational>();
271        rdfac.addRelations(wl);
272        rsfac = (RecSolvablePolynomialRing<BigRational>) rdfac.recursive(1);
273
274        q = 0.27f;
275        kl = 1;
276        ll = 3;
277
278        arr = rrfac.random(kl, ll, el, q);
279        //arr = rrfac.parse(" ( t + x + y ) z^2 + ( 2 x - 8 ) y^2 - ( 13 t^4 - 13 t^3 + t^2 + 2 t - 13 ) ");
280        brr = rrfac.random(kl, ll, el, q);
281        if (brr.isZERO()) {
282            brr = rrfac.parse(" ( x - 2 ) z - ( t - y^2 + y ) ");
283        }
284        //System.out.println("FDQR: arr  = " + arr);
285        //System.out.println("FDQR: brr  = " + brr);
286
287        drr = FDUtil.<BigRational> recursivePseudoQuotient(arr, brr);
288        crr = FDUtil.<BigRational> recursiveSparsePseudoRemainder(arr, brr);
289        //System.out.println("FDQR: qr  = " + drr);
290        //System.out.println("FDQR: rr  = " + crr);
291
292        GenSolvablePolynomial<GenPolynomial<BigRational>>[] QR;
293        QR = FDUtil.<BigRational> recursivePseudoQuotientRemainder(arr, brr);
294        assertEquals("drr == QR[0]: ", drr, QR[0]);
295        assertEquals("crr == QR[1]: ", crr, QR[1]);
296
297        boolean t = FDUtil.<BigRational> isRecursivePseudoQuotientRemainder(arr, brr, drr, crr);
298        //System.out.println("FDQR: ore(lc^n) a == q b + r: " + t);
299        assertTrue("ore(lc^n) a = q b + r: " + crr, t); // ?? 
300    }
301
302
303    /**
304     * Test recursive division coefficient polynomial.
305     */
306    public void testLeftAndRightRecursiveDivision() {
307        //String[] names = new String[] { "t", "x", "y", "z" };
308        String[] names = new String[] { "y", "z" };
309        rdfac = new GenSolvablePolynomialRing<BigRational>(new BigRational(1), to, names);
310        RelationGenerator<BigRational> wl = new WeylRelationsIterated<BigRational>();
311        rdfac.addRelations(wl);
312        rrfac = rdfac.recursive(1);
313        //System.out.println("\nrdfac  = " + rdfac.toScript());
314        //System.out.println("rrfac  = " + rrfac.toScript());
315        GenSolvablePolynomial<GenPolynomial<BigRational>>[] QR;
316        boolean t;
317
318        // q = q;
319        kl = 2;
320        ll = 4;
321        el = 5;
322
323        arr = rrfac.random(kl, ll, el + 1, q);
324        //arr = rrfac.parse("z^5 - ( 1260/551 y^2 - 143/35 y - 33/100  ) z - ( 1/3 y^2 + 419/299 y - 19/56  )");
325        // b * q + r:
326        //arr = rrfac.parse("z^5 + z^2 - 1");
327        //System.out.println("arr  = " + arr);
328
329        brr = rrfac.random(kl, ll, el, q);
330        //brr = rrfac.parse("z^3 - ( 377/140 y^2 + 211/232 y + 1213967/85560  )");
331        //brr = rrfac.parse("( y ) z^3 - ( 1 ) z + ( 2 )");
332        //System.out.println("brr  = " + brr);
333
334        abrr = arr.multiply(brr);
335        //System.out.println("abrr  = " + abrr);
336
337        // exact left division
338        drr = FDUtil.<BigRational> recursivePseudoQuotient(abrr, brr);
339        crr = FDUtil.<BigRational> recursiveSparsePseudoRemainder(abrr, brr);
340        //System.out.println("drr  = " + drr);
341        //System.out.println("crr  = " + crr);
342
343        QR = FDUtil.<BigRational> recursivePseudoQuotientRemainder(abrr, brr);
344        assertEquals("drr == QR[0]: ", drr, QR[0]);
345        assertEquals("crr == QR[1]: ", crr, QR[1]);
346
347        //t = PolyUtil.<BigRational> isRecursivePseudoQuotientRemainder(arr, brr, drr, crr);
348        t = FDUtil.<BigRational> isRecursivePseudoQuotientRemainder(abrr, brr, drr, crr);
349        //System.out.println("FDQR: ore(lc^n) a == q b + r: " + t);
350        assertTrue("ore(lc^n) a = q b + r: " + crr, t); // ?? 
351
352        barr = brr.multiply(arr);
353        //System.out.println("barr  = " + barr);
354
355        // exact right division
356        QR = FDUtil.<BigRational> recursiveRightPseudoQuotientRemainder(barr, brr);
357        drr = QR[0];
358        crr = QR[1];
359        //System.out.println("drr  = " + drr);
360        //System.out.println("crr  = " + crr);
361        //assertEquals("drr == QR[0]: ", drr, QR[0]);
362        //assertEquals("crr == QR[1]: ", crr, QR[1]);
363
364        t = FDUtil.<BigRational> isRecursiveRightPseudoQuotientRemainder(barr, brr, drr, crr);
365        //System.out.println("FDQR: a ore(lc^n) == q b + r: " + t);
366        assertTrue("a ore(lc^n) = q b + r: " + crr, t); // ?? 
367
368        // left division
369        QR = FDUtil.<BigRational> recursivePseudoQuotientRemainder(arr, brr);
370        drr = QR[0];
371        crr = QR[1];
372        t = FDUtil.<BigRational> isRecursivePseudoQuotientRemainder(arr, brr, drr, crr);
373        //System.out.println("drr  = " + drr);
374        //System.out.println("crr  = " + crr);
375        assertTrue("ore(lc^n) a = b q + r: " + crr, t); // ?? 
376
377        // right division
378        QR = FDUtil.<BigRational> recursiveRightPseudoQuotientRemainder(arr, brr);
379        drr = QR[0];
380        crr = QR[1];
381        t = FDUtil.<BigRational> isRecursiveRightPseudoQuotientRemainder(arr, brr, drr, crr);
382        //System.out.println("drr  = " + drr);
383        //System.out.println("crr  = " + crr);
384        assertTrue("ore(lc^n) a = q p + r: " + crr, t); // ?? 
385    }
386
387
388    /**
389     * Test recursive right coefficient polynomial.
390     */
391    //@SuppressWarnings("unchecked")
392    public void testRightRecursivePolynomial() {
393        //String[] names = new String[] { "t", "x", "y", "z" };
394        String[] names = new String[] { "y", "z" };
395        rdfac = new GenSolvablePolynomialRing<BigRational>(new BigRational(1), to, names);
396        RelationGenerator<BigRational> wl = new WeylRelationsIterated<BigRational>();
397        rdfac.addRelations(wl);
398        rrfac = rdfac.recursive(1);
399        //System.out.println("\nrdfac  = " + rdfac.toScript());
400        //System.out.println("rrfac  = " + rrfac.toScript());
401        //GenSolvablePolynomialRing<BigRational> cfac = (GenSolvablePolynomialRing) rrfac.coFac;
402        //System.out.println("cfac  = " + cfac.toScript());
403
404        // q = q;
405        kl = 3;
406        ll = 5;
407        el = 5;
408
409        arr = rrfac.random(kl, ll, el, q);
410        //arr = rrfac.parse(" z { y } ");
411        //System.out.println("FDQR: arr  = " + arr);
412
413        brr = arr.rightRecursivePolynomial();
414        //System.out.println("FDQR: brr  = " + brr);
415
416        boolean t = arr.isRightRecursivePolynomial(brr);
417        assertTrue("arr == eval(brr): ", t);
418
419        GenSolvablePolynomial<BigRational> c = (GenSolvablePolynomial<BigRational>) rrfac
420                        .random(kl, ll, el, q).leadingBaseCoefficient();
421        //c = cfac.parse("y**2");
422        //System.out.println("FDQR: c  = " + c);
423
424        drr = arr.multiply(c); // arr * c = drr
425        //System.out.println("FDQR: drr  = " + drr);
426
427        //err = FDUtil.<BigRational> recursiveLeftDivide(drr, c); // err * c = drr
428        //System.out.println("FDQR: err  = " + err);
429        //assertEquals("arr == err: ", arr, err);
430
431
432        //System.out.println("\nFDQR: arr  = " + arr);
433        drr = arr.multiplyLeft(c); // c * arr = drr
434        //System.out.println("FDQR: drr  = " + drr);
435
436        //err = FDUtil.<BigRational> recursiveRightDivide(drr, c); // c * err = drr
437        //todo: System.out.println("FDQR: err  = " + err);
438        //assertEquals("arr == err: ", arr, err);
439    }
440
441
442    /**
443     * Test exact division of recursive polynomials.
444     */
445    //@SuppressWarnings({ "cast" })
446    public void testRecursiveDivide() {
447        rdfac = new GenSolvablePolynomialRing<BigRational>(new BigRational(1), dfac);
448        RelationGenerator<BigRational> wl = new WeylRelationsIterated<BigRational>();
449        rdfac.addRelations(wl);
450        //System.out.println("rdfac  = " + rdfac.toScript());
451        rsfac = (RecSolvablePolynomialRing<BigRational>) rdfac.recursive(1);
452        //System.out.println("rsfac  = " + rsfac.toScript());
453
454        assertFalse("isCommutative()", rsfac.isCommutative());
455        assertTrue("isAssociative()", rsfac.isAssociative());
456
457        do {
458            as = rsfac.random(kl, ll, el, q);
459        } while (as.isZERO());
460        //System.out.println("as = " + as);
461
462        do {
463            bs = rsfac.random(kl, ll, el, q);
464        } while (bs.isZERO());
465        //System.out.println("bs = " + bs);
466
467        // non commutative
468        cs = bs.multiply(as);
469        ds = as.multiply(bs);
470        //System.out.println("cs = " + cs);
471        //System.out.println("ds = " + ds);
472        assertTrue("cs != 0: ", !cs.isZERO());
473        assertTrue("ds != 0: ", !ds.isZERO());
474
475        //es = (RecSolvablePolynomial<BigRational>) ds.subtract(cs);
476        assertTrue("as*bs != bs*as", !cs.equals(ds) || cs.leadingExpVector().equals(ds.leadingExpVector()));
477
478        // divide 
479        es = (RecSolvablePolynomial<BigRational>) FDUtil.<BigRational> recursivePseudoQuotient(cs, as);
480        //System.out.println("es = " + es);
481        final int max = 4;
482        int i = 0;
483        do {
484            x1 = (RecSolvablePolynomial<BigRational>) bs.multiplyLeft(as.leadingBaseCoefficient().power(i));
485            //System.out.println("lc(a)^"+i+"*b = " + x1);
486            if (es.equals(x1)) {
487                assertEquals("b == b*a/a: ", es, x1);
488                break;
489            }
490            if (es.leadingBaseCoefficient().equals(x1.leadingBaseCoefficient())) {
491                // assertEquals("b == b*a/a: ", e, x1);
492                System.out.println("fail: b == b*a/a: lc(e)==lc(x1)");
493                if (es.abs().equals(bs.abs())) {
494                    System.out.println("success via pseudo: b == b*a/a: ");
495                }
496                break;
497            }
498        } while (i++ < max);
499
500        fs = (RecSolvablePolynomial<BigRational>) FDUtil.<BigRational> recursiveRightPseudoQuotient(cs, bs);
501        //System.out.println("fs = " + fs);
502        i = 0;
503        do {
504            x1 = (RecSolvablePolynomial<BigRational>) as.multiply(bs.leadingBaseCoefficient().power(i));
505            //System.out.println("a*lc(b)^"+i+" = " + x1);
506            if (fs.equals(x1)) {
507                assertEquals("a == b*a/b: ", fs, x1);
508                break;
509            }
510            if (fs.leadingBaseCoefficient().equals(x1.leadingBaseCoefficient())) {
511                System.out.println("fail: a == b*a/b: lc(f)==lc(x1)");
512                if (fs.abs().equals(as.abs())) {
513                    System.out.println("success via pseudo: a == b*a/b: ");
514                }
515                break;
516            }
517        } while (i++ < max);
518
519        es = (RecSolvablePolynomial<BigRational>) FDUtil.<BigRational> recursiveRightPseudoQuotient(ds, as);
520        //System.out.println("es = " + es);
521        i = 0;
522        do {
523            x1 = (RecSolvablePolynomial<BigRational>) bs.multiply(as.leadingBaseCoefficient().power(i));
524            //System.out.println("b*lc(a)^"+i+" = " + x1);
525            if (es.equals(x1)) {
526                assertEquals("b == a*b/a: ", es, x1);
527                break;
528            }
529            if (es.leadingBaseCoefficient().equals(x1.leadingBaseCoefficient())) {
530                System.out.println("fail: b == a*b/a: lc(e) == lc(x1)");
531                if (es.abs().equals(bs.abs())) {
532                    //System.out.println("success via pseudo: b == a*b/a: ");
533                }
534                break;
535            }
536        } while (i++ < max);
537
538        fs = (RecSolvablePolynomial<BigRational>) FDUtil.<BigRational> recursivePseudoQuotient(ds, bs);
539        //System.out.println("fs = " + fs);
540        i = 0;
541        do {
542            x1 = (RecSolvablePolynomial<BigRational>) as.multiplyLeft(bs.leadingBaseCoefficient().power(i));
543            //System.out.println("lc(b)^"+i+"*a = " + x1);
544            if (fs.equals(x1)) {
545                assertEquals("a == a*b/b: ", fs, x1);
546                break;
547            }
548            if (fs.leadingBaseCoefficient().equals(x1.leadingBaseCoefficient())) {
549                System.out.println("fail: a == a*b/b: lc(f)==lc(x1)");
550                if (fs.abs().equals(as.abs())) {
551                    System.out.println("success via pseudo: a == a*b/b: ");
552                }
553                break;
554            }
555        } while (i++ < max);
556
557        GenSolvablePolynomial<BigRational> bc = (GenSolvablePolynomial<BigRational>) bs.leadingBaseCoefficient();
558        ds = (RecSolvablePolynomial<BigRational>) as.multiply(bc);
559        fs = (RecSolvablePolynomial<BigRational>) FDUtil.<BigRational> recursiveDivide(ds, bc);
560        //System.out.println("bc = " + bc);
561        //System.out.println("ds = " + ds);
562        //System.out.println("fs = " + fs);
563        i = 0;
564        do {
565            x1 = (RecSolvablePolynomial<BigRational>) as.multiply(bc.power(i));
566            //System.out.println("lc(b)^"+i+"*a = " + x1);
567            if (fs.equals(x1)) {
568                assertEquals("a == a*b/b: ", fs, x1);
569                break;
570            }
571            if (fs.leadingBaseCoefficient().equals(x1.leadingBaseCoefficient())) {
572                System.out.println("fail: a == a*b/b: lc(f)==lc(x1)");
573                if (fs.abs().equals(as.abs())) {
574                    System.out.println("success via pseudo: a == a*b/b: ");
575                }
576                break;
577            }
578        } while (i++ < max);
579
580        bc = (GenSolvablePolynomial<BigRational>) bs.leadingBaseCoefficient();
581        ds = (RecSolvablePolynomial<BigRational>) as.multiply(bc);
582        fs = (RecSolvablePolynomial<BigRational>) FDUtil.<BigRational> recursiveLeftDivide(ds, bc);
583        //System.out.println("bc = " + bc);
584        //System.out.println("ds = " + ds);
585        //System.out.println("fs = " + fs);
586        i = 0;
587        do {
588            x1 = (RecSolvablePolynomial<BigRational>) as.multiply(bc.power(i));
589            //System.out.println("lc(b)^"+i+"*a = " + x1);
590            if (fs.equals(x1)) {
591                assertEquals("a == a*b/b: ", fs, x1);
592                break;
593            }
594            if (fs.leadingBaseCoefficient().equals(x1.leadingBaseCoefficient())) {
595                System.out.println("fail: a == a*b/b: lc(f)==lc(x1)");
596                if (fs.abs().equals(as.abs())) {
597                    System.out.println("success via pseudo: a == a*b/b: ");
598                }
599                break;
600            }
601        } while (i++ < max);
602    }
603
604
605    /**
606     * Test integer polynomial conversions.
607     */
608    public void testIntConversion() {
609        //System.out.println("dfac = " + dfac.toScript());
610        //System.out.println("rdfac = " + rdfac.toScript());
611        //System.out.println("rrfac = " + rrfac.toScript());
612
613        rfac = dfac.recursive(2); // avoid polCoeff
614        //System.out.println("rfac = " + rfac.toScript());
615        assertFalse("isCommutative()", rfac.isCommutative());
616        assertTrue("isAssociative()", rfac.isAssociative());
617
618        GenSolvablePolynomialRing<BigInteger> ifac = (GenSolvablePolynomialRing<BigInteger>) rfac.coFac;
619        //System.out.println("ifac = " + ifac.toScript());
620
621        SolvableQuotientRing <BigInteger> qfac = new SolvableQuotientRing<BigInteger>(ifac);
622        //System.out.println("qfac = " + qfac.toScript());
623        GenSolvablePolynomialRing<SolvableQuotient<BigInteger>> iqfac = new GenSolvablePolynomialRing<SolvableQuotient<BigInteger>>(qfac, rfac);
624        //System.out.println("iqfac = " + iqfac.toScript());
625
626        List<GenSolvablePolynomial<GenPolynomial<BigInteger>>> irel = rfac.table.relationList();
627        //System.out.println("irel = " + irel);
628
629        List<GenSolvablePolynomial<SolvableQuotient<BigInteger>>> qrel;
630        qrel = FDUtil.<BigInteger> quotientFromIntegralCoefficients(iqfac, irel);
631        //System.out.println("qrel = " + qrel);
632        assertEquals("#irel == #qrel: ", irel.size(), qrel.size());
633        iqfac.table.addSolvRelations(qrel);
634        //System.out.println("iqfac = " + iqfac.toScript());
635        assertFalse("isCommutative()", iqfac.isCommutative());
636        //assertTrue("isAssociative()", iqfac.isAssociative()); //extLeftGB is missing
637
638        List<GenSolvablePolynomial<GenPolynomial<BigInteger>>> iqrel;
639        iqrel = FDUtil.<BigInteger> integralFromQuotientCoefficients(rfac, qrel);
640        //System.out.println("iqrel = " + iqrel);
641        assertEquals("#qrel == #iqrel: ", qrel.size(), iqrel.size());
642        assertEquals("irel == iqrel: ", irel, iqrel);
643
644        // not possible because of missing extLeftGB for pseudo GB:
645        // iqfac.random(kl, ll, el, q);
646    }
647
648
649    /**
650     * Test rational polynomial conversions.
651     */
652    public void testRatConversion() {
653        ////System.out.println("dfac = " + dfac.toScript());
654        //System.out.println("rdfac = " + rdfac.toScript());
655        //System.out.println("rrfac = " + rrfac.toScript());
656
657        rrfac = rdfac.recursive(2); // avoid polCoeff
658        //System.out.println("rrfac = " + rrfac.toScript());
659        assertFalse("isCommutative()", rrfac.isCommutative());
660        assertTrue("isAssociative()", rrfac.isAssociative());
661
662        GenSolvablePolynomialRing<BigRational> irfac = (GenSolvablePolynomialRing<BigRational>) rrfac.coFac;
663        //System.out.println("irfac = " + irfac.toScript());
664
665        SolvableQuotientRing <BigRational> qfac = new SolvableQuotientRing<BigRational>(irfac);
666        //System.out.println("qfac = " + qfac.toScript());
667        GenSolvablePolynomialRing<SolvableQuotient<BigRational>> rqfac = new GenSolvablePolynomialRing<SolvableQuotient<BigRational>>(qfac, rrfac);
668        //System.out.println("rqfac = " + rqfac.toScript());
669
670        List<GenSolvablePolynomial<GenPolynomial<BigRational>>> rrel = rrfac.table.relationList();
671        //System.out.println("rrel = " + rrel);
672
673        List<GenSolvablePolynomial<SolvableQuotient<BigRational>>> qrel;
674        qrel = FDUtil.<BigRational> quotientFromIntegralCoefficients(rqfac, rrel);
675        //System.out.println("qrel = " + qrel);
676        assertEquals("#rrel == #qrel: ", rrel.size(), qrel.size());
677        rqfac.table.addSolvRelations(qrel);
678        //System.out.println("rqfac = " + rqfac.toScript());
679        assertFalse("isCommutative()", rqfac.isCommutative());
680        assertTrue("isAssociative()", rqfac.isAssociative());
681
682        List<GenSolvablePolynomial<GenPolynomial<BigRational>>> rqrel;
683        rqrel = FDUtil.<BigRational> integralFromQuotientCoefficients(rrfac, qrel);
684        //System.out.println("rqrel = " + rqrel);
685        assertEquals("#rrel == #rqrel: ", rrel.size(), rqrel.size());
686        assertEquals("rrel == rqrel: ", rrel, rqrel);
687
688        kl = 1;
689        q = 0.3f;
690        //System.out.println("kl = " + kl + ", ll = " + ll + ", el = " + el + ", q = " + q);
691        GenSolvablePolynomial<SolvableQuotient<BigRational>> aq, bq, cq, dq;
692        do {
693            aq = rqfac.random(kl, ll, el, q);
694        } while (aq.isZERO());
695
696        do {
697            bq = rqfac.random(kl, ll, el, q/2f);
698        } while (bq.isZERO());
699        //System.out.println("aq = " + aq);
700        //System.out.println("bq = " + bq);
701
702        // non commutative
703        cq = bq.multiply(aq);
704        dq = aq.multiply(bq);
705        //System.out.println("cq = " + cq);
706        //System.out.println("dq = " + dq);
707        assertTrue("cq != 0: ", !cq.isZERO());
708        assertTrue("dq != 0: ", !dq.isZERO());
709
710        assertTrue("aq*bq != bq*aq", !cq.equals(dq) || cq.leadingExpVector().equals(dq.leadingExpVector()));
711    }
712
713}