001/*
002 * $Id$
003 */
004
005package edu.jas.poly;
006
007import java.util.List;
008import java.util.Set;
009import java.util.HashSet;
010
011import junit.framework.Test;
012import junit.framework.TestCase;
013import junit.framework.TestSuite;
014
015
016import edu.jas.arith.BigRational;
017
018
019/**
020 * BigRational coefficients GenSolvablePolynomial tests with JUnit.
021 * @author Heinz Kredel
022 */
023
024public class RatGenSolvablePolynomialTest extends TestCase {
025
026
027    /**
028     * main.
029     */
030    public static void main(String[] args) {
031        junit.textui.TestRunner.run(suite());
032    }
033
034
035    /**
036     * Constructs a <CODE>RatGenSolvablePolynomialTest</CODE> object.
037     * @param name String.
038     */
039    public RatGenSolvablePolynomialTest(String name) {
040        super(name);
041    }
042
043
044    /**
045     */
046    public static Test suite() {
047        TestSuite suite = new TestSuite(RatGenSolvablePolynomialTest.class);
048        return suite;
049    }
050
051
052    GenSolvablePolynomial<BigRational> a, b, c, d, e, f, x1, x2;
053
054
055    int rl = 6;
056
057
058    int kl = 10;
059
060
061    int ll = 5;
062
063
064    int el = 3;
065
066
067    float q = 0.5f;
068
069
070    RelationTable<BigRational> table;
071
072
073    GenSolvablePolynomialRing<BigRational> ring, fac;
074
075
076    BigRational cfac;
077
078
079    @Override
080    protected void setUp() {
081        cfac = new BigRational(1);
082        ring = new GenSolvablePolynomialRing<BigRational>(cfac, rl);
083        fac = ring;
084        table = ring.table;
085        a = b = c = d = e = null;
086    }
087
088
089    @Override
090    protected void tearDown() {
091        table = null;
092        ring = null;
093        a = b = c = d = e = null;
094    }
095
096
097    /**
098     * Test generate.
099     */
100    public void testGenerate() {
101        String s = fac.toScript();
102        //System.out.println("fac.toScript: " + s + ", " + s.length());
103        assertTrue("#s == 51: " + s, s.length() == 51);
104
105        List<GenPolynomial<BigRational>> gens = fac.generators();
106        assertFalse("#gens != () ", gens.isEmpty());
107        //System.out.println("generators: " + gens);
108
109        // test equals
110        Set<GenPolynomial<BigRational>> set = new HashSet<GenPolynomial<BigRational>>(gens);
111        //System.out.println("gen set: " + set);
112        assertEquals("#gens == #set: ", gens.size(), set.size());
113
114        // test for elements 0, 1
115        a = fac.getZERO();
116        b = fac.getONE();
117        assertFalse("0 not in #set: ", set.contains(a));
118        assertTrue("1 in #set: ", set.contains(b));
119
120        // specific tests
121        assertEquals("#gens == rl+1 ", rl + 1, gens.size());
122        Set<Integer> iset = new HashSet<Integer>(set.size());
123        for (GenPolynomial<BigRational> p : gens) {
124            //System.out.println("p = " + p.toScript() + ", # = " + p.hashCode() + ", red = " + p.reductum());
125            assertTrue("red(p) == 0 ", p.reductum().isZERO());
126            iset.add(p.hashCode());
127        }
128        assertEquals("#gens == #iset: ", gens.size(), iset.size());
129    }
130
131
132    /**
133     * Test constructor and toString.
134     */
135    public void testConstructor() {
136        a = new GenSolvablePolynomial<BigRational>(ring);
137        assertTrue("length( a ) = 0", a.length() == 0);
138        assertTrue("isZERO( a )", a.isZERO());
139        assertTrue("isONE( a )", !a.isONE());
140
141        c = ring.getONE();
142        assertTrue("length( c ) = 1", c.length() == 1);
143        assertTrue("isZERO( c )", !c.isZERO());
144        assertTrue("isONE( c )", c.isONE());
145
146        d = ring.getZERO();
147        assertTrue("length( d ) = 0", d.length() == 0);
148        assertTrue("isZERO( d )", d.isZERO());
149        assertTrue("isONE( d )", !d.isONE());
150    }
151
152
153    /**
154     * Test random polynomial.
155     */
156    public void testRandom() {
157        assertTrue("isCommutative()", ring.isCommutative());
158
159        for (int i = 0; i < 2; i++) {
160            // a = ring.random(ll+2*i);
161            a = ring.random(kl * (i + 1), ll + 2 * i, el + i, q);
162            assertTrue("length( a" + i + " ) <> 0", a.length() >= 0);
163            assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
164            assertTrue(" not isONE( a" + i + " )", !a.isONE());
165        }
166    }
167
168
169    /**
170     * Test addition.
171     */
172    public void testAddition() {
173        a = ring.random(kl, ll, el, q);
174
175        c = (GenSolvablePolynomial<BigRational>) a.subtract(a);
176        assertTrue("a-a = 0", c.isZERO());
177
178        b = (GenSolvablePolynomial<BigRational>) a.sum(a);
179        c = (GenSolvablePolynomial<BigRational>) b.subtract(a);
180
181        assertEquals("a+a-a = a", c, a);
182        assertTrue("a+a-a = a", c.equals(a));
183
184        b = ring.random(kl, ll, el, q);
185        c = (GenSolvablePolynomial<BigRational>) b.sum(a);
186        d = (GenSolvablePolynomial<BigRational>) a.sum(b);
187
188        assertEquals("a+b = b+a", c, d);
189        assertTrue("a+b = b+a", c.equals(d));
190
191        c = ring.random(kl, ll, el, q);
192        d = (GenSolvablePolynomial<BigRational>) a.sum(b.sum(c));
193        e = (GenSolvablePolynomial<BigRational>) a.sum(b).sum(c);
194
195        assertEquals("a+(b+c) = (a+b)+c", d, e);
196        assertTrue("a+(b+c) = (a+b)+c", d.equals(e));
197
198        ExpVector u = ExpVector.random(rl, el, q);
199        BigRational x = cfac.random(kl);
200
201        b = ring.getONE().multiply(x, u);
202        c = (GenSolvablePolynomial<BigRational>) a.sum(b);
203        d = (GenSolvablePolynomial<BigRational>) a.sum(x, u);
204        assertEquals("a+p(x,u) = a+(x,u)", c, d);
205
206        c = (GenSolvablePolynomial<BigRational>) a.subtract(b);
207        d = (GenSolvablePolynomial<BigRational>) a.subtract(x, u);
208        assertEquals("a-p(x,u) = a-(x,u)", c, d);
209
210        a = ring.getZERO();
211        b = ring.getONE().multiply(x, u);
212        c = (GenSolvablePolynomial<BigRational>) b.sum(a);
213        d = (GenSolvablePolynomial<BigRational>) a.sum(x, u);
214        assertEquals("a+p(x,u) = a+(x,u)", c, d);
215
216        c = (GenSolvablePolynomial<BigRational>) a.subtract(b);
217        d = (GenSolvablePolynomial<BigRational>) a.subtract(x, u);
218        assertEquals("a-p(x,u) = a-(x,u)", c, d);
219    }
220
221
222    /**
223     * Test object multiplication.
224     */
225    @SuppressWarnings("cast")
226    public void testMultiplication() {
227        a = ring.random(kl, ll, el, q);
228        assertTrue("not isZERO( a )", !a.isZERO());
229        //a = RatGenSolvablePolynomial.DIRRAS(1, kl, 4, el, q );
230
231        b = ring.random(kl, ll, el, q);
232        assertTrue("not isZERO( b )", !b.isZERO());
233
234        c = b.multiply(a);
235        d = a.multiply(b);
236        assertTrue("not isZERO( c )", !c.isZERO());
237        assertTrue("not isZERO( d )", !d.isZERO());
238
239        e = (GenSolvablePolynomial<BigRational>) d.subtract(c);
240        assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO());
241
242        assertEquals("a*b = b*a", c, d);
243        assertTrue("a*b = b*a", c.equals(d));
244
245        c = ring.random(kl, ll, el, q);
246        d = a.multiply(b.multiply(c));
247        e = (a.multiply(b)).multiply(c);
248
249        assertEquals("a(bc) = (ab)c", d, e);
250        assertTrue("a(bc) = (ab)c", d.equals(e));
251
252        BigRational x = a.leadingBaseCoefficient().inverse();
253        c = (GenSolvablePolynomial<BigRational>) a.monic();
254        d = a.multiply(x);
255        assertEquals("a.monic() = a(1/ldcf(a))", c, d);
256
257        ExpVector u = ring.evzero;
258        BigRational y = b.leadingBaseCoefficient().inverse();
259        c = (GenSolvablePolynomial<BigRational>) b.monic();
260        d = b.multiply(y, u);
261        assertEquals("b.monic() = b(1/ldcf(b))", c, d);
262
263        e = ring.getONE().multiply(y, u);
264        d = b.multiply(e);
265        assertEquals("b.monic() = b(1/ldcf(b))", c, d);
266
267        d = e.multiply(b);
268        assertEquals("b.monic() = (1/ldcf(b) (0))*b", c, d);
269
270        d = a.monic();
271        assertTrue("a.monic(): ", d.leadingBaseCoefficient().isONE());
272    }
273
274
275    /**
276     * Test Weyl polynomials.
277     */
278    public void testWeyl() {
279        int rloc = 4;
280        ring = new GenSolvablePolynomialRing<BigRational>(cfac, rloc);
281
282        RelationGenerator<BigRational> wl = new WeylRelations<BigRational>();
283        wl.generate(ring);
284        table = ring.table;
285        //System.out.println("table = " + table);
286        //System.out.println("ring = " + ring);
287
288        assertFalse("isCommutative()", ring.isCommutative());
289        assertTrue("isAssociative()", ring.isAssociative());
290
291        a = ring.random(kl, ll, el, q);
292        assertTrue("not isZERO( a )", !a.isZERO());
293        //System.out.println("a = " + a);
294
295        b = ring.random(kl, ll, el, q);
296        assertTrue("not isZERO( b )", !b.isZERO());
297        //System.out.println("b = " + b);
298
299
300        // non commutative
301        c = b.multiply(a);
302        d = a.multiply(b);
303        //System.out.println("c = " + c);
304        //System.out.println("d = " + d);
305        assertTrue("not isZERO( c )", !c.isZERO());
306        assertTrue("not isZERO( d )", !d.isZERO());
307
308        e = (GenSolvablePolynomial<BigRational>) d.subtract(c);
309        assertTrue("!isZERO( a*b-b*a ) " + e, !e.isZERO());
310        assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector()));
311
312        c = ring.random(kl, ll, el, q);
313        //System.out.println("\na = " + a);
314        //System.out.println("\nb = " + b);
315        //System.out.println("\nc = " + c);
316
317        // associative
318        //x1 = b.multiply(c);
319        //System.out.println("\nx1 = " + x1);
320        d = a.multiply(b.multiply(c));
321
322        //x2 = a.multiply(b);
323        //System.out.println("\nx2 = " + x2);
324        e = a.multiply(b).multiply(c);
325
326        //System.out.println("\nd = " + d);
327        //System.out.println("\ne = " + e);
328
329        //f = (GenSolvablePolynomial<BigRational>)d.subtract(e);
330        //System.out.println("\nf = " + f);
331
332        assertEquals("a(bc) = (ab)c", d, e);
333        assertTrue("a(bc) = (ab)c", d.equals(e));
334    }
335
336
337    /**
338     * Test division of polynomials.
339     */
340    public void testDivide() {
341        int rloc = 4;
342        ring = new GenSolvablePolynomialRing<BigRational>(cfac, rloc);
343
344        RelationGenerator<BigRational> wl = new WeylRelations<BigRational>();
345        wl.generate(ring);
346        //System.out.println("ring = " + ring.toScript());
347
348        assertFalse("isCommutative()", ring.isCommutative());
349        assertTrue("isAssociative()", ring.isAssociative());
350
351        do {
352            a = ring.random(kl, ll, el, q);
353        } while(a.isZERO());
354        //System.out.println("a = " + a);
355
356        do {
357            b = ring.random(kl, ll, el, q);
358        } while(b.isZERO());
359        //System.out.println("b = " + b);
360
361        // non commutative
362        c = b.multiply(a);
363        d = a.multiply(b);
364        //System.out.println("c = " + c);
365        //System.out.println("d = " + d);
366        assertTrue("not isZERO( c )", !c.isZERO());
367        assertTrue("not isZERO( d )", !d.isZERO());
368
369        e = (GenSolvablePolynomial<BigRational>) d.subtract(c);
370        assertTrue("a*b != b*a", !c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector()));
371
372        // divide 
373        e = c.divide(a);
374        //System.out.println("e = " + e);
375        f = c.rightDivide(b);
376        //System.out.println("f = " + f);
377        assertEquals("b == b*a/a: " + e, e, b);
378        assertEquals("a == b*a/b: " + e, f, a);
379
380        e = d.rightDivide(a);
381        //System.out.println("e = " + e);
382        f = d.divide(b);
383        //System.out.println("f = " + f);
384        assertEquals("b == a*b/a: " + e, e, b);
385        assertEquals("a == a*b/b: " + e, f, a);
386    }
387
388
389    /**
390     * Test BLAS level 1.
391     */
392    public void testBLAS1() {
393        int rloc = 4;
394        ring = new GenSolvablePolynomialRing<BigRational>(cfac, rloc);
395        RelationGenerator<BigRational> wl = new WeylRelations<BigRational>();
396        wl.generate(ring);
397        table = ring.table;
398        //System.out.println("table = " + table);
399        //System.out.println("ring = " + ring);
400
401        a = ring.random(kl,ll,el,q);
402        b = ring.random(kl,ll,el,q);
403        ExpVector ev = ExpVector.random(rloc,el,q);
404        BigRational lc = BigRational.ONE.random(kl);
405
406        d = a.subtractMultiple(lc,b);
407        e = (GenSolvablePolynomial<BigRational>) a.subtract( b.multiplyLeft(lc) );
408        assertEquals("a - (lc) b == a - ((lc) b)",d,e);
409
410        d = a.subtractMultiple(lc,ev,b);
411        e = (GenSolvablePolynomial<BigRational>) a.subtract( b.multiplyLeft(lc,ev) );
412        assertEquals("a - (lc ev) b == a - ((lc ev) b)",d,e);
413
414        ExpVector fv = ExpVector.random(rloc,el,q);
415        BigRational tc = BigRational.ONE.random(kl);
416
417        d = a.scaleSubtractMultiple(tc,lc,ev,b);
418        e = (GenSolvablePolynomial<BigRational>) a.multiplyLeft(tc).subtract( b.multiplyLeft(lc,ev) );
419        assertEquals("(tc) a - (lc ev) b == ((tc) a - ((lc ev) b))",d,e);
420
421        d = a.scaleSubtractMultiple(tc,fv,lc,ev,b);
422        e = (GenSolvablePolynomial<BigRational>) a.multiplyLeft(tc,fv).subtract( b.multiplyLeft(lc,ev) );
423        assertEquals("(tc fv) a - (lc ev) b == ((tc fv) a - ((lc ev) b))",d,e);
424
425        d = a.scaleSubtractMultiple(tc,lc,b);
426        e = (GenSolvablePolynomial<BigRational>) a.multiplyLeft(tc).subtract( b.multiplyLeft(lc) );
427        assertEquals("tc a - lc b == (tc a) - (lc b)",d,e);
428    }
429
430
431    /**
432     * Test distributive law.
433     */
434    public void testDistributive() {
435        int rloc = 4;
436        ring = new GenSolvablePolynomialRing<BigRational>(cfac, rloc);
437
438        RelationGenerator<BigRational> wl = new WeylRelations<BigRational>();
439        wl.generate(ring);
440        //table = ring.table;
441        //System.out.println("table = " + table);
442        //System.out.println("ring = " + ring);
443
444        a = ring.random(kl, ll, el, q);
445        b = ring.random(kl, ll, el, q);
446        c = ring.random(kl, ll, el, q);
447
448        d = a.multiply((GenSolvablePolynomial<BigRational>) b.sum(c));
449        e = (GenSolvablePolynomial<BigRational>) a.multiply(b).sum(a.multiply(c));
450
451        assertEquals("a(b+c) = ab+ac", d, e);
452    }
453
454}