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