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