001/*
002 * $Id$
003 */
004
005package edu.jas.poly;
006
007
008import java.util.List;
009
010import junit.framework.Test;
011import junit.framework.TestCase;
012import junit.framework.TestSuite;
013
014
015import edu.jas.arith.BigRational;
016
017
018/**
019 * BigRational coefficients RecSolvableWordPolynomial tests with JUnit.
020 * @author Heinz Kredel
021 */
022
023public class RecSolvableWordPolynomialTest extends TestCase {
024
025
026    /**
027     * main.
028     */
029    public static void main(String[] args) {
030        junit.textui.TestRunner.run(suite());
031    }
032
033
034    /**
035     * Constructs a <CODE>RecSolvableWordPolynomialTest</CODE> object.
036     * @param name String.
037     */
038    public RecSolvableWordPolynomialTest(String name) {
039        super(name);
040    }
041
042
043    /**
044     */
045    public static Test suite() {
046        TestSuite suite = new TestSuite(RecSolvableWordPolynomialTest.class);
047        return suite;
048    }
049
050
051    RecSolvableWordPolynomial<BigRational> a, b, c, d, e, f, x1, x2;
052
053
054    int rl = 4;
055
056
057    int kl = 5;
058
059
060    int ll = 4;
061
062
063    int el = 3;
064
065
066    float q = 0.3f;
067
068
069    String[] cvars = new String[] { "a", "b" };
070
071
072    String[] vars = new String[] { "w", "x", "y", "z" };
073
074
075    RelationTable<GenWordPolynomial<BigRational>> table;
076
077
078    RecSolvableWordPolynomialRing<BigRational> ring;
079
080
081    BigRational cfac;
082
083
084    GenSolvablePolynomialRing<GenWordPolynomial<BigRational>> sring;
085
086
087    GenWordPolynomialRing<BigRational> cring;
088
089
090    TermOrder tord = new TermOrder(TermOrder.INVLEX);
091
092
093    @Override
094    protected void setUp() {
095        cfac = new BigRational(1);
096        cring = new GenWordPolynomialRing<BigRational>(cfac, cvars);
097        //sring = new GenSolvablePolynomialRing<GenWordPolynomial<BigRational>>(cring,rl,tord);
098        ring = new RecSolvableWordPolynomialRing<BigRational>(cring, tord, vars);
099        //System.out.println("ring = " + ring.toScript());
100        RelationGenerator<GenWordPolynomial<BigRational>> wl = new WeylRelations<GenWordPolynomial<BigRational>>();
101        ring.addRelations(wl);
102        table = ring.table;
103        //System.out.println("ring = " + ring.toScript());
104        a = b = c = d = e = null;
105    }
106
107
108    @Override
109    protected void tearDown() {
110        table = null;
111        ring = null;
112        a = b = c = d = e = null;
113    }
114
115
116    /**
117     * Test constructor, generators and properties.
118     */
119    public void testConstructor() {
120        assertFalse("not commutative", ring.isCommutative());
121        assertTrue("associative", ring.isAssociative());
122
123        a = new RecSolvableWordPolynomial<BigRational>(ring);
124        assertTrue("length( a ) = 0", a.length() == 0);
125        assertTrue("isZERO( a )", a.isZERO());
126        assertTrue("isONE( a )", !a.isONE());
127
128        c = ring.getONE();
129        assertTrue("length( c ) = 1", c.length() == 1);
130        assertTrue("isZERO( c )", !c.isZERO());
131        assertTrue("isONE( c )", c.isONE());
132
133        d = ring.getZERO();
134        assertTrue("length( d ) = 0", d.length() == 0);
135        assertTrue("isZERO( d )", d.isZERO());
136        assertTrue("isONE( d )", !d.isONE());
137        //System.out.println("d = " + d);
138
139        //System.out.println("");
140        for (GenPolynomial<GenWordPolynomial<BigRational>> g : ring.generators()) {
141            //System.out.print("g = " + g + ", ");
142            assertFalse("not isZERO( g )", g.isZERO());
143        }
144        //System.out.println("");
145    }
146
147
148    /**
149     * Test random polynomial.
150     */
151    public void testRandom() {
152        for (int i = 0; i < 3; i++) {
153            // a = ring.random(ll+2*i);
154            a = ring.random(kl * (i + 1), ll + 2 * i, el + i, q);
155            //System.out.println("a = " + a);
156            assertTrue("length( a" + i + " ) <> 0", a.length() >= 0);
157            assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
158            assertTrue(" not isONE( a" + i + " )", !a.isONE());
159        }
160    }
161
162
163    /**
164     * Test addition.
165     */
166    public void testAddition() {
167        a = ring.random(kl, ll, el, q);
168        c = (RecSolvableWordPolynomial<BigRational>) a.subtract(a);
169        assertTrue("a-a = 0", c.isZERO());
170
171        b = (RecSolvableWordPolynomial<BigRational>) a.sum(a);
172        c = (RecSolvableWordPolynomial<BigRational>) b.subtract(a);
173        assertEquals("a+a-a = a", c, a);
174
175        b = ring.random(kl, ll, el, q);
176        c = (RecSolvableWordPolynomial<BigRational>) b.sum(a);
177        d = (RecSolvableWordPolynomial<BigRational>) a.sum(b);
178        assertEquals("a+b = b+a", c, d);
179
180        c = ring.random(kl, ll, el, q);
181        d = (RecSolvableWordPolynomial<BigRational>) a.sum(b.sum(c));
182        e = (RecSolvableWordPolynomial<BigRational>) a.sum(b).sum(c);
183        assertEquals("a+(b+c) = (a+b)+c", d, e);
184        //System.out.println("a = " + a);
185        //System.out.println("b = " + b);
186        //System.out.println("c = " + c);
187        //System.out.println("d = " + d);
188        //System.out.println("e = " + e);
189
190        ExpVector u = ExpVector.random(rl, el, q);
191        GenWordPolynomial<BigRational> x = cring.random(kl);
192        //System.out.println("x = " + x);
193        //System.out.println("u = " + u);
194
195        b = ring.getONE().multiply(x, u);
196        c = (RecSolvableWordPolynomial<BigRational>) a.sum(b);
197        d = (RecSolvableWordPolynomial<BigRational>) a.sum(x, u);
198        //System.out.println("a = " + a);
199        //System.out.println("b = " + b);
200        //System.out.println("c = " + c);
201        //System.out.println("d = " + d);
202        assertEquals("a+p(x,u) = a+(x,u)", c, d);
203
204        c = (RecSolvableWordPolynomial<BigRational>) a.subtract(b);
205        d = (RecSolvableWordPolynomial<BigRational>) a.subtract(x, u);
206        assertEquals("a-p(x,u) = a-(x,u)", c, d);
207
208        a = ring.getZERO();
209        b = ring.getONE().multiply(x, u);
210        c = (RecSolvableWordPolynomial<BigRational>) b.sum(a);
211        d = (RecSolvableWordPolynomial<BigRational>) a.sum(x, u);
212        assertEquals("a+p(x,u) = a+(x,u)", c, d);
213
214        c = (RecSolvableWordPolynomial<BigRational>) a.subtract(b);
215        d = (RecSolvableWordPolynomial<BigRational>) a.subtract(x, u);
216        assertEquals("a-p(x,u) = a-(x,u)", c, d);
217    }
218
219
220    /**
221     * Test multiplication.
222     */
223    public void testMultiplication() {
224        //System.out.println("ring = " + ring);
225        a = ring.random(kl, ll, el, q);
226        //a = ring.parse(" b y z + a w z ");  
227        b = ring.random(kl, ll, el, q);
228        //b = ring.parse(" w x - b x "); 
229
230        c = b.multiply(a);
231        d = a.multiply(b);
232        //System.out.println("a = " + a);
233        //System.out.println("b = " + b);
234        //System.out.println("c = " + c);
235        //System.out.println("d = " + d);
236        assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector()));
237
238        c = ring.random(kl, ll, el, q);
239        d = a.multiply(b.multiply(c));
240        e = a.multiply(b).multiply(c);
241        assertEquals("a(bc) = (ab)c", d, e);
242        //System.out.println("a = " + a);
243        //System.out.println("b = " + b);
244        //System.out.println("c = " + c);
245        //System.out.println("d = " + d);
246        //System.out.println("e = " + e);
247
248        BigRational x = a.leadingBaseCoefficient().leadingBaseCoefficient().inverse();
249        GenWordPolynomial<BigRational> xp = new GenWordPolynomial<BigRational>(cring, x);
250        d = (RecSolvableWordPolynomial<BigRational>) a.multiply(xp);
251        assertTrue("monic(a) = a*(1/ldcf(ldcf(a)))", d.leadingBaseCoefficient().leadingBaseCoefficient()
252                        .isONE());
253
254        d = (RecSolvableWordPolynomial<BigRational>) a.monic();
255        assertTrue("a.monic(): " + d.leadingBaseCoefficient() + ", " + a.leadingBaseCoefficient(),
256                   d.leadingBaseCoefficient().isONE()
257                   || d.leadingBaseCoefficient().equals(a.leadingBaseCoefficient()));
258    }
259
260
261    /**
262     * Test commutative ring.
263     */
264    public void testCommutative() {
265        //System.out.println("table = " + table.toString(vars));
266        //System.out.println("table = " + table.toScript());
267        //System.out.println("ring = " + ring);
268        //System.out.println("ring.table = " + ring.table.toScript());
269        //assertEquals("table == ring.table: ", table, ring.table); // ?
270        assertTrue("# relations == 2", ring.table.size() == 2);
271
272        cring = new GenWordPolynomialRing<BigRational>(cfac, new String[] { "a" });
273        ring = new RecSolvableWordPolynomialRing<BigRational>(cring, ring);
274        //table = ring.table;
275        //System.out.println("table = " + table.toString(vars));
276        //System.out.println("ring = " + ring.toScript());
277
278        assertFalse("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((RecSolvableWordPolynomial<BigRational>) b.sum(c));
307        e = (RecSolvableWordPolynomial<BigRational>) a.multiply(b).sum(a.multiply(c));
308        assertEquals("a(b+c) = ab+ac", d, e);
309    }
310
311
312    /**
313     * Test word coefficient ring.
314     */
315    public void testWordCoeffs() {
316        RecSolvableWordPolynomial<BigRational> r1 = ring.parse("x");
317        GenWordPolynomial<BigRational> r2 = ring.parse("b").leadingBaseCoefficient();
318        RecSolvableWordPolynomial<BigRational> rp = ring.parse("b x + a");
319        //System.out.println("r1 = " + r1);
320        //System.out.println("r2 = " + r2);
321        //System.out.println("rp = " + rp);
322        ring.coeffTable.update(r1.leadingExpVector(), r2.leadingWord().leadingExpVector(), rp);
323
324        //table = ring.table;
325        //System.out.println("ring = " + ring.toScript());
326
327        assertFalse("isCommutative()", ring.isCommutative());
328        assertTrue("isAssociative()", ring.isAssociative());
329
330        List<GenPolynomial<GenWordPolynomial<BigRational>>> gens = ring.generators();
331        for (GenPolynomial<GenWordPolynomial<BigRational>> x : gens) {
332            GenSolvablePolynomial<GenWordPolynomial<BigRational>> xx = (GenSolvablePolynomial<GenWordPolynomial<BigRational>>) x;
333            a = new RecSolvableWordPolynomial<BigRational>(ring, xx);
334            //System.out.println("a = " + a);
335            for (GenPolynomial<GenWordPolynomial<BigRational>> y : gens) {
336                GenSolvablePolynomial<GenWordPolynomial<BigRational>> yy = (GenSolvablePolynomial<GenWordPolynomial<BigRational>>) y;
337                b = new RecSolvableWordPolynomial<BigRational>(ring, yy);
338                //System.out.println("b = " + b);
339                c = a.multiply(b);
340                //System.out.println("gens:" + a + " * " + b + " = " + c);
341                ExpVector ev = a.leadingExpVector().sum(b.leadingExpVector());
342                assertTrue("LT(a)*LT(b) == LT(c)", c.leadingExpVector().equals(ev));
343                Word wv = a.leadingBaseCoefficient().leadingWord()
344                                .multiply(b.leadingBaseCoefficient().leadingWord());
345                assertTrue("LT(a)*LT(b) == LT(c)", c.leadingBaseCoefficient().leadingWord().equals(wv));
346            }
347        }
348
349        a = ring.random(kl, ll, el, q);
350        //a = ring.getONE();
351        //System.out.println("a = " + a);
352        b = ring.random(kl, ll, el, q);
353        //b = ring.getONE();
354        //System.out.println("b = " + b);
355
356        // non-commutative
357        c = b.multiply(a);
358        d = a.multiply(b);
359        //System.out.println("c = " + c);
360        //System.out.println("d = " + d);
361        assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector()));
362
363        // relation table list tests
364        //System.out.println("ring.table.rels = " + ring.table.relationList());
365        //System.out.println("ring.coeffTable.rels = " + ring.coeffTable.relationList());
366
367        RecSolvableWordPolynomialRing<BigRational> ring2 = new RecSolvableWordPolynomialRing<BigRational>(
368                        ring.coFac, ring);
369        ring2.table.addSolvRelations(ring.table.relationList());
370        ring2.coeffTable.addSolvRelations(ring.coeffTable.relationList());
371
372        //System.out.println("ring2.table.rels = " + ring2.table.relationList());
373        //System.out.println("ring2.coeffTable.rels = " + ring2.coeffTable.relationList());
374        assertEquals("ring.table == ring2.table: ", ring.table, ring2.table);
375        assertEquals("ring.coeffTable == ring2.coeffTable: ", ring.coeffTable, ring2.coeffTable);
376    }
377
378}