001/*
002 * $Id: QuatGenSolvablePolynomialTest.java 4142 2012-08-26 13:30:59Z kredel $
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
014import org.apache.log4j.BasicConfigurator;
015
016import edu.jas.arith.BigQuaternion;
017
018
019/**
020 * BigQuaternion coefficients GenSolvablePolynomial tests with JUnit.
021 * @author Heinz Kredel.
022 */
023
024public class QuatGenSolvablePolynomialTest extends TestCase {
025
026    /**
027     * main
028     */
029    public static void main (String[] args) {
030        BasicConfigurator.configure();
031        junit.textui.TestRunner.run( suite() );
032    }
033
034    /**
035     * Constructs a <CODE>QuatGenSolvablePolynomialTest</CODE> object.
036     * @param name String.
037     */
038    public QuatGenSolvablePolynomialTest(String name) {
039        super(name);
040    }
041
042    /**
043     */ 
044    public static Test suite() {
045        TestSuite suite= new TestSuite(QuatGenSolvablePolynomialTest.class);
046        return suite;
047    }
048
049    BigQuaternion cfac;
050    GenSolvablePolynomialRing<BigQuaternion> fac;
051
052    GenSolvablePolynomial<BigQuaternion> a;
053    GenSolvablePolynomial<BigQuaternion> b;
054    GenSolvablePolynomial<BigQuaternion> c;
055    GenSolvablePolynomial<BigQuaternion> d;
056    GenSolvablePolynomial<BigQuaternion> e;
057
058    int rl = 6; 
059    int kl = 3;
060    int ll = 7;
061    int el = 5;
062    float q = 0.33f;
063
064    protected void setUp() {
065        a = b = c = d = e = null;
066        cfac = new BigQuaternion(1);
067        fac = new GenSolvablePolynomialRing<BigQuaternion>(cfac,rl);
068        WeylRelations<BigQuaternion> rel = new WeylRelations<BigQuaternion>(fac);
069        rel.generate();
070    }
071
072    protected void tearDown() {
073        a = b = c = d = e = null;
074        fac = null;
075        cfac = null;
076    }
077
078
079    /**
080     * Test constructor and toString.
081     */
082    public void testConstruction() {
083        c = fac.getONE();
084        assertTrue("length( c ) = 1", c.length() == 1);
085        assertTrue("isZERO( c )", !c.isZERO() );
086        assertTrue("isONE( c )", c.isONE() );
087
088        d = fac.getZERO();
089        assertTrue("length( d ) = 0", d.length() == 0);
090        assertTrue("isZERO( d )", d.isZERO() );
091        assertTrue("isONE( d )", !d.isONE() );
092    }
093
094
095    /**
096     * Test factory.
097     */
098    public void testFactory() {
099        assertFalse("!is comutative", fac.isCommutative() );
100        assertFalse("!is field", fac.isField() );
101        assertTrue("is associative", fac.isAssociative() );
102
103        List<GenPolynomial<BigQuaternion>> gens = fac.generators();
104        //System.out.println("gens = " + gens);
105        assertTrue("#gens = 4+6 ", gens.size() == 10);
106    }
107
108
109    /**
110     * Test random polynomial.
111     */
112    public void testRandom() {
113        for (int i = 0; i < 3; i++) {
114            //a = fac.random(ll);
115            a = fac.random(kl, ll+i, el+(5-i), q );
116            assertTrue("length( a"+i+" ) <> 0", a.length() >= 0);
117            assertTrue(" not isZERO( a"+i+" )", !a.isZERO() );
118            assertTrue(" not isONE( a"+i+" )", !a.isONE() );
119        }
120    }
121
122
123    /**
124     * Test solvable addition.
125     */
126    public void testAddition() {
127        a = fac.random(kl, ll, el, q ); // fac.random(ll);
128        b = fac.random(kl, ll, el, q ); // fac.random(ll);
129
130        c = (GenSolvablePolynomial<BigQuaternion>) a.sum(b);
131        d = (GenSolvablePolynomial<BigQuaternion>) c.subtract(b);
132        assertEquals("a+b-b = a",a,d);
133
134        c = fac.random(kl, ll, el, q ); //fac.random(ll);
135
136        ExpVector u = ExpVector.EVRAND(rl,el,q);
137        BigQuaternion x = BigQuaternion.QRAND(kl);
138
139        b = new GenSolvablePolynomial<BigQuaternion>(fac, x, u);
140        c = (GenSolvablePolynomial<BigQuaternion>) a.sum(b);
141        d = (GenSolvablePolynomial<BigQuaternion>) a.sum(x,u);
142        assertEquals("a+p(x,u) = a+(x,u)",c,d);
143
144        c = (GenSolvablePolynomial<BigQuaternion>) a.subtract(b);
145        d = (GenSolvablePolynomial<BigQuaternion>) a.subtract(x,u);
146        assertEquals("a-p(x,u) = a-(x,u)",c,d);
147
148        a = new GenSolvablePolynomial<BigQuaternion>(fac);
149        assertTrue("a == 0",a.isZERO());
150    }
151
152
153    /**
154     * Test solvable multiplication.
155     */
156    public void testMultiplication() {
157        a = fac.random(kl, ll, el, q ); //fac.random(ll);
158        assertTrue("not isZERO( a )", !a.isZERO() );
159
160        b = fac.random(kl, ll, el, q ); //fac.random(ll);
161        assertTrue("not isZERO( b )", !b.isZERO() );
162
163        c = (GenSolvablePolynomial<BigQuaternion>) b.multiply(a);
164        d = (GenSolvablePolynomial<BigQuaternion>) a.multiply(b);
165        assertTrue("not isZERO( c )", !c.isZERO() );
166        assertTrue("not isZERO( d )", !d.isZERO() );
167        //System.out.println("a = " + a);
168        //System.out.println("b = " + b);
169        //System.out.println("c = " + c);
170        //System.out.println("d = " + d);
171        e = (GenSolvablePolynomial<BigQuaternion>) d.subtract(c);
172        assertTrue("!isZERO( a*b-b*a ) " + e, !e.isZERO() );
173
174        assertTrue("a*b = b*a", !c.equals(d) );
175        //assertEquals("a*b = b*a",c,d);
176
177        c = fac.random(kl, ll, el, q ); //fac.random(ll);
178        //System.out.println("c = " + c);
179        d = (GenSolvablePolynomial<BigQuaternion>) a.multiply( b.multiply(c) );
180        e = (GenSolvablePolynomial<BigQuaternion>) (a.multiply(b)).multiply(c);
181        //System.out.println("d = " + d);
182        //System.out.println("e = " + e);
183        //System.out.println("d-e = " + d.subtract(c) );
184
185        assertEquals("a(bc) = (ab)c",d,e);
186        assertTrue("a(bc) = (ab)c", d.equals(e) );
187
188        BigQuaternion x = a.leadingBaseCoefficient().inverse();
189        c = (GenSolvablePolynomial<BigQuaternion>) a.monic();
190        d = (GenSolvablePolynomial<BigQuaternion>) a.multiply(x);
191        assertEquals("a.monic() = a(1/ldcf(a))",c,d);
192
193        BigQuaternion y = b.leadingBaseCoefficient().inverse();
194        c = (GenSolvablePolynomial<BigQuaternion>) b.monic();
195        d = (GenSolvablePolynomial<BigQuaternion>) b.multiply(y);
196        assertEquals("b.monic() = b(1/ldcf(b))",c,d);
197
198        e = new GenSolvablePolynomial<BigQuaternion>(fac,y);
199        d = (GenSolvablePolynomial<BigQuaternion>) b.multiply(e);
200        assertEquals("b.monic() = b(1/ldcf(b))",c,d);
201    }
202
203
204    /**
205     * Test solvable left and right multiplication.
206     */
207    public void testDoubleMultiplication() {
208        a = fac.random(kl, 3, el, q ); //fac.random(ll);
209        b = fac.random(kl, 2, el, q ); //fac.random(ll);
210        c = fac.random(kl, 3, el, q ); //fac.random(ll);
211
212        d = a.multiply(b).multiply(c);
213        e = b.multiply(a,c);
214        assertEquals("a b c = b.multiply(a,c)",d,e);
215
216        BigQuaternion qa = cfac.random(kl);
217        BigQuaternion qb = cfac.random(kl);
218        BigQuaternion qc = qa.multiply(qb);
219        BigQuaternion qd = qb.multiply(qa);
220        // search non commuting qa, qb
221        while ( qc.equals(qd) ) {
222             qa = cfac.random(kl);
223             qb = cfac.random(kl);
224             qc = qa.multiply(qb);
225             qd = qb.multiply(qa);
226        }
227        //System.out.println("qa = " + qa);
228        //System.out.println("qb = " + qb);
229        //System.out.println("qc = " + qc);
230        //System.out.println("qd = " + qd);
231
232        a = fac.univariate(0);
233        d = a.multiply(qa,qb);
234        e = a.multiply(qb,qa);
235        //System.out.println("a = " + a);
236        //System.out.println("d = " + d);
237        //System.out.println("e = " + e);
238        assertFalse("a.multiply(qa,qb) != a.multiply(qb,qq)", d.equals(e));
239
240        // commuting variables
241        ExpVector ea = fac.univariate(1).leadingExpVector();
242        ExpVector eb = fac.univariate(2).leadingExpVector();
243        //System.out.println("ea = " + ea);
244        //System.out.println("eb = " + eb);
245
246        d = a.multiply(ea,eb);
247        e = a.multiply(eb,ea);
248        //System.out.println("d = " + d);
249        //System.out.println("e = " + e);
250        assertTrue("a.multiply(ea,eb) == a.multiply(eb,eq)", d.equals(e));
251
252        d = a.multiply(qa,ea,qb,eb);
253        e = a.multiply(qb,eb,qa,ea);
254        //System.out.println("d = " + d);
255        //System.out.println("e = " + e);
256        assertFalse("a.multiply(qa,ea,qb,eb) != a.multiply(qb,eb,qa,ea)", d.equals(e));
257    }
258
259}