001    /*
002     * $Id: ModGenSolvablePolynomialTest.java 1255 2007-07-29 10:16:33Z kredel $
003     */
004    
005    package edu.jas.poly;
006    
007    import junit.framework.Test;
008    import junit.framework.TestCase;
009    import junit.framework.TestSuite;
010    
011    import org.apache.log4j.BasicConfigurator;
012    
013    import edu.jas.arith.ModInteger;
014    import 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    
023    public 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    }