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