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