001/*
002 * $Id$
003 */
004
005package edu.jas.application;
006
007
008import java.util.ArrayList;
009import java.util.List;
010import java.util.Map;
011
012import edu.jas.arith.BigRational;
013import edu.jas.poly.ExpVector;
014import edu.jas.poly.GenPolynomial;
015import edu.jas.poly.GenPolynomialRing;
016import edu.jas.poly.GenSolvablePolynomial;
017import edu.jas.poly.GenSolvablePolynomialRing;
018import edu.jas.poly.PolyUtil;
019import edu.jas.poly.QLRSolvablePolynomial;
020import edu.jas.poly.QLRSolvablePolynomialRing;
021import edu.jas.poly.RecSolvablePolynomial;
022import edu.jas.poly.RelationGenerator;
023import edu.jas.poly.TermOrder;
024import edu.jas.poly.WeylRelations;
025import edu.jas.poly.WeylRelationsIterated;
026
027import junit.framework.Test;
028import junit.framework.TestCase;
029import junit.framework.TestSuite;
030
031
032/**
033 * BigRational coefficients ResidueSolvablePolynomial QLR representation tests
034 * with JUnit.
035 * @author Heinz Kredel
036 */
037
038public class ResidueSolvablePolynomialQLRTest extends TestCase {
039
040
041    /**
042     * main.
043     */
044    public static void main(String[] args) {
045
046        junit.textui.TestRunner.run(suite());
047    }
048
049
050    /**
051     * Constructs a <CODE>ResidueSolvablePolynomialQLRTest</CODE> object.
052     * @param name String.
053     */
054    public ResidueSolvablePolynomialQLRTest(String name) {
055        super(name);
056    }
057
058
059    /**
060     */
061    public static Test suite() {
062        TestSuite suite = new TestSuite(ResidueSolvablePolynomialQLRTest.class);
063        return suite;
064    }
065
066
067    QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational> a, b, c, d, e, f, x1, x2;
068
069
070    int rl = 4;
071
072
073    int kl = 3;
074
075
076    int ll = 4;
077
078
079    int el = 3;
080
081
082    float q = 0.3f;
083
084
085    String[] cvars = new String[] { "a", "b" };
086
087
088    String[] vars = new String[] { "w", "x", "y", "z" };
089
090
091    SolvableResidueRing<BigRational> rring;
092
093
094    SolvableIdeal<BigRational> sideal;
095
096
097    QLRSolvablePolynomialRing<SolvableResidue<BigRational>, BigRational> ring;
098
099
100    BigRational cfac;
101
102
103    GenSolvablePolynomialRing<BigRational> sring;
104
105
106    GenPolynomialRing<BigRational> cring;
107
108
109    TermOrder tord = new TermOrder(TermOrder.INVLEX);
110
111
112    @Override
113    protected void setUp() {
114        cfac = new BigRational(1);
115        sring = new GenSolvablePolynomialRing<BigRational>(cfac, tord, cvars);
116        //RelationGenerator<BigRational> wc = new WeylRelations<BigRational>();
117        //not possible: sring.addRelations(wc); //wc.generate(sring);
118        List<GenSolvablePolynomial<BigRational>> il = new ArrayList<GenSolvablePolynomial<BigRational>>();
119        GenSolvablePolynomial<BigRational> p1 = sring.parse("b - a^2");
120        il.add(p1);
121        //p1 = sring.parse("a - b^5");
122        //il.add(p1);
123        sideal = new SolvableIdeal<BigRational>(sring, il);
124        sideal = sideal.twosidedGB();
125        if (sideal.isONE()) {
126            System.out.println("twosided sideal = " + sideal.toScript());
127            throw new IllegalArgumentException("ideal is one");
128        }
129        rring = new SolvableResidueRing<BigRational>(sideal);
130        ring = new QLRSolvablePolynomialRing<SolvableResidue<BigRational>, BigRational>(rring, tord, vars);
131        RelationGenerator<SolvableResidue<BigRational>> wl = new WeylRelations<SolvableResidue<BigRational>>();
132        wl.generate(ring);
133        List<GenSolvablePolynomial<SolvableResidue<BigRational>>> qrel = ring.table.relationList();
134        //System.out.println("qrel = " + qrel);
135        List<GenSolvablePolynomial<GenPolynomial<BigRational>>> prel = new ArrayList<GenSolvablePolynomial<GenPolynomial<BigRational>>>();
136        for (GenSolvablePolynomial<SolvableResidue<BigRational>> q : qrel) {
137            GenSolvablePolynomial<GenPolynomial<BigRational>> p = ring.toPolyCoefficients(q);
138            prel.add(p);
139        }
140        //System.out.println("prel = " + prel);
141        ring.polCoeff.table.addSolvRelations(prel);
142        a = b = c = d = e = null;
143    }
144
145
146    @Override
147    protected void tearDown() {
148        ring = null;
149        a = b = c = d = e = null;
150    }
151
152
153    /**
154     * Test constructor, generators and properties.
155     */
156    public void testConstructor() {
157        assertFalse("not commutative", ring.isCommutative());
158        assertTrue("associative", ring.isAssociative());
159
160        a = new QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>(ring);
161        assertTrue("length( a ) = 0", a.length() == 0);
162        assertTrue("isZERO( a )", a.isZERO());
163        assertTrue("isONE( a )", !a.isONE());
164
165        c = ring.getONE();
166        assertTrue("length( c ) = 1", c.length() == 1);
167        assertTrue("isZERO( c )", !c.isZERO());
168        assertTrue("isONE( c )", c.isONE());
169
170        d = ring.getZERO();
171        assertTrue("length( d ) = 0", d.length() == 0);
172        assertTrue("isZERO( d )", d.isZERO());
173        assertTrue("isONE( d )", !d.isONE());
174        //System.out.println("d = " + d);
175
176        //System.out.println("");
177        for (GenPolynomial<SolvableResidue<BigRational>> g : ring.generators()) {
178            //System.out.print("g = " + g + ", ");
179            assertFalse("not isZERO( g )", g.isZERO());
180        }
181        //System.out.println("");
182    }
183
184
185    /**
186     * Test random polynomial.
187     */
188    public void testRandom() {
189        for (int i = 0; i < 3; i++) {
190            // a = ring.random(ll+2*i);
191            a = ring.random(kl * (i + 1), ll + 2 * i, el + i, q);
192            //System.out.println("a = " + a);
193            assertTrue("length( a" + i + " ) <> 0", a.length() >= 0);
194            assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
195            assertTrue(" not isONE( a" + i + " )", !a.isONE());
196        }
197    }
198
199
200    /**
201     * Test addition.
202     */
203    @SuppressWarnings("unchecked")
204    public void testAddition() {
205        a = ring.random(kl, ll, el, q);
206        c = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.subtract(a);
207        assertTrue("a-a = 0", c.isZERO());
208
209        b = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.sum(a);
210        c = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) b.subtract(a);
211        assertEquals("a+a-a = a", c, a);
212
213        b = ring.random(kl, ll, el, q);
214        c = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) b.sum(a);
215        d = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.sum(b);
216        assertEquals("a+b = b+a", c, d);
217
218        c = ring.random(kl, ll, el, q);
219        d = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.sum(b.sum(c));
220        e = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.sum(b).sum(c);
221        assertEquals("a+(b+c) = (a+b)+c", d, e);
222        //System.out.println("a = " + a);
223        //System.out.println("b = " + b);
224        //System.out.println("c = " + c);
225        //System.out.println("d = " + d);
226        //System.out.println("e = " + e);
227
228        ExpVector u = ExpVector.random(rl, el, q);
229        SolvableResidue<BigRational> x = rring.random(kl);
230        //System.out.println("x = " + x);
231        //System.out.println("u = " + u);
232
233        b = ring.getONE().multiply(x, u);
234        c = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.sum(b);
235        d = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.sum(x, u);
236        //System.out.println("a = " + a);
237        //System.out.println("b = " + b);
238        //System.out.println("c = " + c);
239        //System.out.println("d = " + d);
240        assertEquals("a+p(x,u) = a+(x,u)", c, d);
241
242        c = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.subtract(b);
243        d = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.subtract(x, u);
244        assertEquals("a-p(x,u) = a-(x,u)", c, d);
245
246        a = ring.getZERO();
247        b = ring.getONE().multiply(x, u);
248        c = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) b.sum(a);
249        d = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.sum(x, u);
250        assertEquals("a+p(x,u) = a+(x,u)", c, d);
251
252        c = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.subtract(b);
253        d = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.subtract(x, u);
254        assertEquals("a-p(x,u) = a-(x,u)", c, d);
255    }
256
257
258    /**
259     * Test multiplication.
260     */
261    @SuppressWarnings("unchecked")
262    public void testMultiplication() {
263        //System.out.println("ring = " + ring);
264        a = ring.random(kl, ll, el, q);
265        //a = ring.parse(" b y z + a w z ");  
266        b = ring.random(kl, ll, el, q);
267        //b = ring.parse(" w x - b x "); 
268
269        c = b.multiply(a);
270        d = a.multiply(b);
271        //System.out.println("a = " + a);
272        //System.out.println("b = " + b);
273        //System.out.println("c = " + c);
274        //System.out.println("d = " + d);
275        assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector()));
276
277        c = ring.random(kl, ll, el, q);
278        d = a.multiply(b.multiply(c));
279        e = a.multiply(b).multiply(c);
280        assertEquals("a(bc) = (ab)c", d, e);
281        //System.out.println("a = " + a);
282        //System.out.println("b = " + b);
283        //System.out.println("c = " + c);
284        //System.out.println("d = " + d);
285        //System.out.println("e = " + e);
286
287        d = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.monic();
288        //System.out.println("d = " + d);
289        assertTrue("a.monic(): " + d, d.leadingBaseCoefficient().isONE()
290                        || d.leadingBaseCoefficient().equals(a.leadingBaseCoefficient()));
291    }
292
293
294    /**
295     * Test partially commutative ring.
296     */
297    @SuppressWarnings("unchecked")
298    public void testPartCommutative() {
299        //System.out.println("table = " + table.toString(vars));
300        //System.out.println("table = " + table.toScript());
301        //System.out.println("ring = " + ring);
302        //System.out.println("ring.table = " + ring.table.toScript());
303        //assertEquals("table == ring.table: ", table, ring.table); // ?
304        assertTrue("# relations == 2", ring.table.size() == 2);
305
306        ring = new QLRSolvablePolynomialRing<SolvableResidue<BigRational>, BigRational>(rring, ring);
307        //System.out.println("ring = " + ring);
308
309        assertTrue("isCommutative()", ring.isCommutative() || !rring.isCommutative());
310        assertTrue("isAssociative()", ring.isAssociative());
311
312        a = ring.random(kl, ll, el, q);
313        //a = ring.parse(" b x y z + a w z ");
314        //System.out.println("a = " + a);
315        b = ring.random(kl, ll, el, q);
316        //b = ring.parse(" w y z - b x ");
317        //System.out.println("b = " + b);
318
319        // commutative
320        c = b.multiply(a);
321        //System.out.println("c = " + c);
322        d = a.multiply(b);
323        //d = ring.getONE(); 
324        //System.out.println("d = " + d);
325        assertEquals("ba == ab: ", c, d);
326    }
327
328
329    /**
330     * Test distributive law.
331     */
332    @SuppressWarnings("unchecked")
333    public void testDistributive() {
334        a = ring.random(kl, ll, el, q);
335        b = ring.random(kl, ll, el, q);
336        c = ring.random(kl, ll, el, q);
337
338        d = a.multiply((QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) b.sum(c));
339        e = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a.multiply(b)
340                        .sum(a.multiply(c));
341        assertEquals("a(b+c) = ab+ac", d, e);
342    }
343
344
345    /**
346     * Test solvable coefficient ring.
347     */
348    @SuppressWarnings("unchecked")
349    public void testSolvableCoeffsRelations() {
350        assertTrue("# relations == 2", ring.table.size() == 2);
351        assertFalse("isCommutative()", ring.isCommutative());
352        assertTrue("isAssociative()", ring.isAssociative());
353        //System.out.println("ring = " + ring.toScript());
354
355        QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational> r1 = ring.parse("z");
356        GenSolvablePolynomial<BigRational> r2 = sring.parse("a");
357        QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational> rp = ring.parse("a z + b");
358        GenSolvablePolynomial<GenPolynomial<BigRational>> pp = ring.toPolyCoefficients(rp);
359        //System.out.println("r1 = " + r1);
360        //System.out.println("r2 = " + r2);
361        //System.out.println("rp = " + rp);
362        //System.out.println("pp = " + pp);
363        ring.polCoeff.coeffTable.update(r1.leadingExpVector(), r2.leadingExpVector(), pp);
364        //ring.polCoeff.table.update(r1.leadingExpVector(), r2.leadingExpVector(), pp);
365        //ring.coeffTable.update(r1.leadingExpVector(), r2.leadingExpVector(), rp);
366
367        //System.out.println("ring = " + ring.toScript());
368
369        assertFalse("isCommutative()", ring.isCommutative());
370        assertTrue("isAssociative()", ring.isAssociative());
371
372        List<GenPolynomial<SolvableResidue<BigRational>>> gens = ring.generators();
373        for (GenPolynomial<SolvableResidue<BigRational>> x : gens) {
374            GenSolvablePolynomial<SolvableResidue<BigRational>> xx = (GenSolvablePolynomial<SolvableResidue<BigRational>>) x;
375            a = new QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>(ring, xx);
376            for (GenPolynomial<SolvableResidue<BigRational>> y : gens) {
377                GenSolvablePolynomial<SolvableResidue<BigRational>> yy = (GenSolvablePolynomial<SolvableResidue<BigRational>>) y;
378                b = new QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>(ring, yy);
379                c = a.multiply(b);
380                //System.out.println("gens:" + a + " * " + b + " = " + c);
381                ExpVector ev = a.leadingExpVector().sum(b.leadingExpVector());
382                assertTrue("LT(a)*LT(b) == LT(c)", c.leadingExpVector().equals(ev));
383                ev = a.leadingBaseCoefficient().val.leadingExpVector()
384                                .sum(b.leadingBaseCoefficient().val.leadingExpVector());
385                assertTrue("LT(lc(a))*LT(lc(b)) == LT(lc(c))",
386                                c.leadingBaseCoefficient().val.leadingExpVector().equals(ev));
387            }
388        }
389        //System.out.println("ring = " + ring.toScript());
390
391        a = ring.random(kl, ll, el, q);
392        //a = ring.getONE();
393        //System.out.println("a = " + a);
394        b = ring.random(kl, ll, el, q);
395        //b = ring.getONE();
396        //System.out.println("b = " + b);
397
398        // non-commutative
399        c = b.multiply(a);
400        d = a.multiply(b);
401        //System.out.println("c = " + c);
402        //System.out.println("d = " + d);
403        assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector()));
404    }
405
406
407    /**
408     * Test extension and contraction for Weyl relations.
409     */
410    @SuppressWarnings("unchecked")
411    public void testExtendContractWeyl() {
412        QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational> r1 = ring.parse("x");
413        GenSolvablePolynomial<BigRational> r2 = sring.parse("a");
414        QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational> rp = ring.parse("a x + b");
415        ring.polCoeff.coeffTable.update(r1.leadingExpVector(), r2.leadingExpVector(),
416                        ring.toPolyCoefficients(rp));
417
418        int k = rl;
419        QLRSolvablePolynomialRing<SolvableResidue<BigRational>, BigRational> pfe = ring.extend(k);
420        //System.out.println("pfe = " + pfe);
421        QLRSolvablePolynomialRing<SolvableResidue<BigRational>, BigRational> pfec = pfe.contract(k);
422        //System.out.println("pfec = " + pfec);
423        assertEquals("ring == pfec", ring, pfec);
424
425        QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational> a = ring.random(kl, ll, el, q);
426        //System.out.println("a = " + a);
427
428        QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational> ae = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a
429                        .extend(pfe, 0, 0);
430        //System.out.println("ae = " + ae);
431
432        Map<ExpVector, GenPolynomial<SolvableResidue<BigRational>>> m = ae.contract(pfec);
433        List<GenPolynomial<SolvableResidue<BigRational>>> ml = new ArrayList<GenPolynomial<SolvableResidue<BigRational>>>(
434                        m.values());
435        GenPolynomial<SolvableResidue<BigRational>> aec = ml.get(0);
436        //System.out.println("ae  = " + ae);
437        //System.out.println("aec = " + aec);
438        assertEquals("a == aec", a, aec);
439    }
440
441
442    /**
443     * Test reversion for Weyl relations.
444     */
445    @SuppressWarnings("unchecked")
446    public void testReverseWeyl() {
447        QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational> r1 = ring.parse("x");
448        GenSolvablePolynomial<BigRational> r2 = sring.parse("a");
449        QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational> rp = ring.parse("a x + b");
450        ring.polCoeff.coeffTable.update(r1.leadingExpVector(), r2.leadingExpVector(),
451                        ring.toPolyCoefficients(rp));
452
453        QLRSolvablePolynomialRing<SolvableResidue<BigRational>, BigRational> pfr = ring.reverse();
454        QLRSolvablePolynomialRing<SolvableResidue<BigRational>, BigRational> pfrr = pfr.reverse();
455        assertEquals("pf == pfrr", ring, pfrr);
456        //System.out.println("ring = " + ring);
457        //System.out.println("pfr = " + pfr);
458
459        QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational> a = ring.random(kl, ll, el, q);
460        //System.out.println("a = " + a);
461
462        QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational> ar = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) a
463                        .reverse(pfr);
464        QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational> arr = (QLRSolvablePolynomial<SolvableResidue<BigRational>, BigRational>) ar
465                        .reverse(pfrr);
466        assertEquals("a == arr", a, arr);
467        //System.out.println("ar = " + ar);
468        //System.out.println("arr = " + arr);
469    }
470
471
472    /**
473     * Test recursive for Weyl relations.
474     */
475    @SuppressWarnings("unchecked")
476    public void testRecursiveWeyl() {
477        GenSolvablePolynomialRing<GenPolynomial<SolvableResidue<BigRational>>> rsring = ring.recursive(2); // 1,2,3
478        //System.out.println("rsring = " + rsring.toScript());
479
480        GenSolvablePolynomial<SolvableResidue<BigRational>> ad, bd, cd, dd;
481        RecSolvablePolynomial<SolvableResidue<BigRational>> ar, br, cr, dr;
482        ad = ring.random(kl, ll, el, q);
483        bd = ring.random(kl, ll, el, q);
484        //ad = sring.parse("7/2 y^2 * z"); // - 15/2 w^2 + 262/225");
485        //bd = sring.parse("-10/13 x "); //+ 413/150");
486        //ad = (GenSolvablePolynomial<BigRational>) ad.monic();
487        //bd = (GenSolvablePolynomial<BigRational>) bd.monic();
488
489        //System.out.println("ad = " + ad);
490        //System.out.println("bd = " + bd);
491
492        cd = ad.multiply(bd);
493        //System.out.println("cd = " + cd);
494
495        ar = (RecSolvablePolynomial<SolvableResidue<BigRational>>) PolyUtil
496                        .<SolvableResidue<BigRational>> recursive(rsring, ad);
497        br = (RecSolvablePolynomial<SolvableResidue<BigRational>>) PolyUtil
498                        .<SolvableResidue<BigRational>> recursive(rsring, bd);
499        //System.out.println("ar = " + ar);
500        //System.out.println("br = " + br);
501
502        cr = ar.multiply(br);
503        //System.out.println("cr = " + cr);
504        //System.out.println("cr.ring = " + cr.ring.toScript());
505
506        dr = (RecSolvablePolynomial<SolvableResidue<BigRational>>) PolyUtil
507                        .<SolvableResidue<BigRational>> recursive(rsring, cd);
508        //System.out.println("dr = " + dr);
509
510        assertEquals("dr.ring == cr.ring", dr.ring, cr.ring);
511        assertEquals("dr == cr", dr, cr);
512
513        dd = (GenSolvablePolynomial<SolvableResidue<BigRational>>) PolyUtil
514                        .<SolvableResidue<BigRational>> distribute(ring, cr);
515        // //System.out.println("dd = " + dd);
516        assertEquals("dd == cd", dd, cd);
517    }
518
519
520    /*
521     * Test recursive for iterated Weyl relations.
522     */
523    public void testRecursiveIteratedWeyl() {
524        String[] svars = new String[] { "w", "x", "y", "z" };
525        GenSolvablePolynomialRing<BigRational> sring = new GenSolvablePolynomialRing<BigRational>(cfac, tord,
526                        svars);
527        RelationGenerator<BigRational> wlc = new WeylRelationsIterated<BigRational>();
528        wlc.generate(sring);
529        assertFalse("isCommutative()", sring.isCommutative());
530        assertTrue("isAssociative()", sring.isAssociative());
531        //System.out.println("sring = " + sring.toScript());
532
533        GenSolvablePolynomialRing<GenPolynomial<BigRational>> rsring = sring.recursive(2); // 1,2,3
534        //System.out.println("rsring = " + rsring); //.toScript());
535        //System.out.println("rsring = " + rsring.toScript());
536
537        GenSolvablePolynomial<BigRational> ad, bd, cd, dd;
538        RecSolvablePolynomial<BigRational> ar, br, cr, dr;
539        ad = sring.random(kl, ll, el, q);
540        bd = sring.random(kl, ll, el, q);
541        //ad = (GenSolvablePolynomial<BigRational>) ad.monic();
542        //bd = (GenSolvablePolynomial<BigRational>) bd.monic();
543
544        //System.out.println("ad = " + ad);
545        //System.out.println("bd = " + bd);
546
547        cd = ad.multiply(bd);
548        //System.out.println("cd = " + cd);
549
550        ar = (RecSolvablePolynomial<BigRational>) PolyUtil.<BigRational> recursive(rsring, ad);
551        br = (RecSolvablePolynomial<BigRational>) PolyUtil.<BigRational> recursive(rsring, bd);
552        //System.out.println("ar = " + ar);
553        //System.out.println("br = " + br);
554
555        cr = ar.multiply(br);
556        //System.out.println("cr = " + cr);
557
558        dr = (RecSolvablePolynomial<BigRational>) PolyUtil.<BigRational> recursive(rsring, cd);
559        //System.out.println("dr = " + dr);
560
561        assertEquals("dr.ring == cr.ring", dr.ring, cr.ring);
562        assertEquals("dr == cr", dr, cr);
563
564        dd = (GenSolvablePolynomial<BigRational>) PolyUtil.<BigRational> distribute(sring, cr);
565        //System.out.println("dd = " + dd);
566        assertEquals("dd == cd", dd, cd);
567    }
568
569}