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