001/*
002 * $Id: ModGenSolvablePolynomialTest.java 5905 2018-08-24 10:23:58Z kredel $
003 */
004
005package edu.jas.poly;
006
007
008import junit.framework.Test;
009import junit.framework.TestCase;
010import junit.framework.TestSuite;
011
012
013import edu.jas.arith.ModInteger;
014import edu.jas.arith.ModIntegerRing;
015
016
017// import edu.jas.structure.RingElem;
018
019
020/**
021 * ModInteger coefficients GenSolvablePolynomial tests with JUnit.
022 * @author Heinz Kredel
023 */
024
025public class ModGenSolvablePolynomialTest extends TestCase {
026
027
028    /**
029     * main
030     */
031    public static void main(String[] args) {
032        junit.textui.TestRunner.run(suite());
033    }
034
035
036    /**
037     * Constructs a <CODE>ModGenSolvablePolynomialTest</CODE> object.
038     * @param name String.
039     */
040    public ModGenSolvablePolynomialTest(String name) {
041        super(name);
042    }
043
044
045    /**
046     * suite.
047     */
048    public static Test suite() {
049        TestSuite suite = new TestSuite(ModGenSolvablePolynomialTest.class);
050        return suite;
051    }
052
053
054    GenSolvablePolynomial<ModInteger> a;
055
056
057    GenSolvablePolynomial<ModInteger> b;
058
059
060    GenSolvablePolynomial<ModInteger> c;
061
062
063    GenSolvablePolynomial<ModInteger> d;
064
065
066    GenSolvablePolynomial<ModInteger> e;
067
068
069    GenSolvablePolynomial<ModInteger> f;
070
071
072    GenSolvablePolynomial<ModInteger> x1;
073
074
075    GenSolvablePolynomial<ModInteger> x2;
076
077
078    int ml = 19; // modul 
079
080
081    int rl = 5;
082
083
084    int kl = 10;
085
086
087    int ll = 5;
088
089
090    int el = 3;
091
092
093    float q = 0.5f;
094
095
096    RelationTable<ModInteger> table;
097
098
099    GenSolvablePolynomialRing<ModInteger> ring;
100
101
102    ModIntegerRing cfac;
103
104
105    @Override
106    protected void setUp() {
107        cfac = new ModIntegerRing(ml);
108        ring = new GenSolvablePolynomialRing<ModInteger>(cfac, rl);
109        table = null; //ring.table;
110        a = b = c = d = e = null;
111    }
112
113
114    @Override
115    protected void tearDown() {
116        table = null;
117        ring = null;
118        a = b = c = d = e = null;
119    }
120
121
122    /**
123     * Test constructor and toString.
124     */
125    public void testConstructor() {
126        a = new GenSolvablePolynomial<ModInteger>(ring);
127        assertTrue("length( a ) = 0", a.length() == 0);
128        assertTrue("isZERO( a )", a.isZERO());
129        assertTrue("isONE( a )", !a.isONE());
130
131        c = ring.getONE();
132        assertTrue("length( c ) = 1", c.length() == 1);
133        assertTrue("isZERO( c )", !c.isZERO());
134        assertTrue("isONE( c )", c.isONE());
135
136        d = ring.getZERO();
137        assertTrue("length( d ) = 0", d.length() == 0);
138        assertTrue("isZERO( d )", d.isZERO());
139        assertTrue("isONE( d )", !d.isONE());
140    }
141
142
143    /**
144     * Test random polynomial.
145     */
146    public void testRandom() {
147        assertTrue("isCommutative()", ring.isCommutative());
148
149        for (int i = 0; i < 2; i++) {
150            // a = ring.random(ll+2*i);
151            a = ring.random(kl * (i + 1), ll + 2 * i, el + i, q);
152            assertTrue("length( a" + i + " ) <> 0", a.length() >= 0);
153            assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
154            assertTrue(" not isONE( a" + i + " )", !a.isONE());
155        }
156    }
157
158
159    /**
160     * Test addition.
161     */
162    public void testAddition() {
163        a = ring.random(kl, ll, el, q);
164
165        c = (GenSolvablePolynomial<ModInteger>) a.subtract(a);
166        assertTrue("a-a = 0", c.isZERO());
167
168        b = (GenSolvablePolynomial<ModInteger>) a.sum(a);
169        c = (GenSolvablePolynomial<ModInteger>) b.subtract(a);
170
171        assertEquals("a+a-a = a", c, a);
172        assertTrue("a+a-a = a", c.equals(a));
173
174        b = ring.random(kl, ll, el, q);
175        c = (GenSolvablePolynomial<ModInteger>) b.sum(a);
176        d = (GenSolvablePolynomial<ModInteger>) a.sum(b);
177
178        assertEquals("a+b = b+a", c, d);
179        assertTrue("a+b = b+a", c.equals(d));
180
181        c = ring.random(kl, ll, el, q);
182        d = (GenSolvablePolynomial<ModInteger>) a.sum(b.sum(c));
183        e = (GenSolvablePolynomial<ModInteger>) a.sum(b).sum(c);
184
185        assertEquals("a+(b+c) = (a+b)+c", d, e);
186        assertTrue("a+(b+c) = (a+b)+c", d.equals(e));
187
188        ExpVector u = ExpVector.random(rl, el, q);
189        ModInteger x = cfac.random(kl);
190
191        b = ring.getONE().multiply(x, u);
192        c = (GenSolvablePolynomial<ModInteger>) a.sum(b);
193        d = (GenSolvablePolynomial<ModInteger>) a.sum(x, u);
194        assertEquals("a+p(x,u) = a+(x,u)", c, d);
195
196        c = (GenSolvablePolynomial<ModInteger>) a.subtract(b);
197        d = (GenSolvablePolynomial<ModInteger>) a.subtract(x, u);
198        assertEquals("a-p(x,u) = a-(x,u)", c, d);
199
200        a = ring.getZERO();
201        b = ring.getONE().multiply(x, u);
202        c = (GenSolvablePolynomial<ModInteger>) b.sum(a);
203        d = (GenSolvablePolynomial<ModInteger>) a.sum(x, u);
204        assertEquals("a+p(x,u) = a+(x,u)", c, d);
205
206        c = (GenSolvablePolynomial<ModInteger>) a.subtract(b);
207        d = (GenSolvablePolynomial<ModInteger>) a.subtract(x, u);
208        assertEquals("a-p(x,u) = a-(x,u)", c, d);
209    }
210
211
212    /**
213     * Test multiplication.
214     */
215    @SuppressWarnings("cast")
216    public void testMultiplication() {
217        a = ring.random(kl, ll, el, q);
218        assertTrue("not isZERO( a )", !a.isZERO());
219        //a = ModGenSolvablePolynomial.DIRRAS(1, kl, 4, el, q );
220
221        b = ring.random(kl, ll, el, q);
222        assertTrue("not isZERO( b )", !b.isZERO());
223
224        c = b.multiply(a);
225        d = a.multiply(b);
226        assertTrue("not isZERO( c )", !c.isZERO());
227        assertTrue("not isZERO( d )", !d.isZERO());
228
229        e = (GenSolvablePolynomial<ModInteger>) d.subtract(c);
230        assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO());
231
232        assertEquals("a*b = b*a", c, d);
233        assertTrue("a*b = b*a", c.equals(d));
234
235        c = ring.random(kl, ll, el, q);
236        d = a.multiply(b.multiply(c));
237        e = (a.multiply(b)).multiply(c);
238
239        assertEquals("a(bc) = (ab)c", d, e);
240        assertTrue("a(bc) = (ab)c", d.equals(e));
241
242        ModInteger x = a.leadingBaseCoefficient().inverse();
243        c = (GenSolvablePolynomial<ModInteger>) a.monic();
244        d = a.multiply(x);
245        assertEquals("a.monic() = a(1/ldcf(a))", c, d);
246
247        ExpVector u = ring.evzero;
248        ModInteger y = b.leadingBaseCoefficient().inverse();
249        c = (GenSolvablePolynomial<ModInteger>) b.monic();
250        d = b.multiply(y, u);
251        assertEquals("b.monic() = b(1/ldcf(b))", c, d);
252
253        e = ring.getONE().multiply(y, u);
254        d = b.multiply(e);
255        assertEquals("b.monic() = b(1/ldcf(b))", c, d);
256
257        d = e.multiply(b);
258        assertEquals("b.monic() = (1/ldcf(b) (0))*b", c, d);
259
260        d = a.monic();
261        assertTrue("a.monic(): ", d.leadingBaseCoefficient().isONE());
262    }
263
264
265    /**
266     * Test Weyl polynomials.
267     */
268    public void testWeyl() {
269        int rloc = 4;
270        ring = new GenSolvablePolynomialRing<ModInteger>(cfac, rloc);
271
272        RelationGenerator<ModInteger> wl = new WeylRelations<ModInteger>();
273        wl.generate(ring);
274        //table = ring.table;
275        //System.out.println("table = " + table);
276        //System.out.println("ring = " + ring);
277
278        assertFalse("isCommutative()", ring.isCommutative());
279        assertTrue("isAssociative()", ring.isAssociative());
280
281        a = ring.random(kl, ll, el + 2, q);
282        assertTrue("not isZERO( a )", !a.isZERO());
283        //System.out.println("a = " + a);
284
285        b = ring.random(kl, ll, el + 2, q);
286        assertTrue("not isZERO( b )", !b.isZERO());
287        //System.out.println("b = " + b);
288
289
290        // non commutative
291        c = b.multiply(a);
292        d = a.multiply(b);
293        //System.out.println("c = " + c);
294        //System.out.println("d = " + d);
295        assertTrue("not isZERO( c )", !c.isZERO());
296        assertTrue("not isZERO( d )", !d.isZERO());
297
298        e = (GenSolvablePolynomial<ModInteger>) d.subtract(c);
299        assertTrue("!isZERO( a*b-b*a ) " + e, !e.isZERO());
300        assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector()));
301
302        c = ring.random(kl, ll, el, q);
303        //System.out.println("\na = " + a);
304        //System.out.println("\nb = " + b);
305        //System.out.println("\nc = " + c);
306
307        // associative
308        //x1 = b.multiply(c);
309        //System.out.println("\nx1 = " + x1);
310        d = a.multiply(b.multiply(c));
311
312        //x2 = a.multiply(b);
313        //System.out.println("\nx2 = " + x2);
314        e = a.multiply(b).multiply(c);
315
316        //System.out.println("\nd = " + d);
317        //System.out.println("\ne = " + e);
318
319        //f = (GenSolvablePolynomial<ModInteger>)d.subtract(e);
320        //System.out.println("\nf = " + f);
321
322        assertEquals("a(bc) = (ab)c", d, e);
323        assertTrue("a(bc) = (ab)c", d.equals(e));
324    }
325
326
327    /**
328     * Test distributive law.
329     */
330    public void testDistributive() {
331        int rloc = 4;
332        ring = new GenSolvablePolynomialRing<ModInteger>(cfac, rloc);
333
334        RelationGenerator<ModInteger> wl = new WeylRelations<ModInteger>();
335        wl.generate(ring);
336        //table = ring.table;
337        //System.out.println("table = " + table);
338        //System.out.println("ring = " + ring);
339
340        a = ring.random(kl, ll, el, q);
341        b = ring.random(kl, ll, el, q);
342        c = ring.random(kl, ll, el, q);
343
344        d = a.multiply((GenSolvablePolynomial<ModInteger>) b.sum(c));
345        e = (GenSolvablePolynomial<ModInteger>) a.multiply(b).sum(a.multiply(c));
346
347        assertEquals("a(b+c) = ab+ac", d, e);
348    }
349
350}