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