001    /*
002     * $Id: ModGenPolynomialTest.java 1888 2008-07-12 13:37:34Z 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 edu.jas.poly.GenPolynomial;
012    import edu.jas.arith.ModInteger;
013    import edu.jas.arith.ModIntegerRing;
014    //import edu.jas.structure.RingElem;
015    
016    
017    /**
018     * ModInteger coefficients GenPolynomial tests with JUnit.
019     * @author Heinz Kredel.
020     */
021    
022    public class ModGenPolynomialTest extends TestCase {
023    
024    /**
025     * main.
026     */
027       public static void main (String[] args) {
028              junit.textui.TestRunner.run( suite() );
029       }
030    
031    /**
032     * Constructs a <CODE>ModGenPolynomialTest</CODE> object.
033     * @param name String.
034     */
035       public ModGenPolynomialTest(String name) {
036              super(name);
037       }
038    
039    /**
040     * suite.
041     */ 
042     public static Test suite() {
043         TestSuite suite= new TestSuite(ModGenPolynomialTest.class);
044         return suite;
045       }
046    
047       //private final static int bitlen = 100;
048    
049       GenPolynomialRing<ModInteger> fac;
050    
051       GenPolynomial<ModInteger> a;
052       GenPolynomial<ModInteger> b;
053       GenPolynomial<ModInteger> c;
054       GenPolynomial<ModInteger> d;
055       GenPolynomial<ModInteger> e;
056    
057       int ml = 19; // modul 
058       int rl = 7; 
059       int kl = 10;
060       int ll = 10;
061       int el = 5;
062       float q = 0.5f;
063    
064       protected void setUp() {
065           a = b = c = d = e = null;
066           fac = new GenPolynomialRing<ModInteger>(new ModIntegerRing(ml),rl);
067       }
068    
069       protected void tearDown() {
070           a = b = c = d = e = null;
071           fac = null;
072       }
073    
074    
075    /**
076     * Test constructor and toString.
077     * 
078     */
079     public void testConstruction() {
080         c = fac.getONE();
081         assertTrue("length( c ) = 1", c.length() == 1);
082         assertTrue("isZERO( c )", !c.isZERO() );
083         assertTrue("isONE( c )", c.isONE() );
084    
085         d = fac.getZERO();
086         assertTrue("length( d ) = 0", d.length() == 0);
087         assertTrue("isZERO( d )", d.isZERO() );
088         assertTrue("isONE( d )", !d.isONE() );
089     }
090    
091    
092    /**
093     * Test random polynomial.
094     * 
095     */
096     public void testRandom() {
097         for (int i = 0; i < 7; i++) {
098             a = fac.random(ll);
099                 // fac.random(rl+i, kl*(i+1), ll+2*i, el+i, q );
100             assertTrue("length( a"+i+" ) <> 0", a.length() >= 0);
101             assertTrue(" not isZERO( a"+i+" )", !a.isZERO() );
102             assertTrue(" not isONE( a"+i+" )", !a.isONE() );
103         }
104     }
105    
106    
107    /**
108     * Test addition.
109     * 
110     */
111     public void testAddition() {
112    
113         a = fac.random(ll);
114         b = fac.random(ll);
115    
116         c = a.sum(b);
117         d = c.subtract(b);
118         assertEquals("a+b-b = a",a,d);
119    
120         c = fac.random(ll);
121    
122         ExpVector u = ExpVector.EVRAND(rl,el,q);
123         ModInteger x = c.leadingBaseCoefficient().ring.random(kl);
124    
125         b = new GenPolynomial<ModInteger>(fac,x, u);
126         c = a.sum(b);
127         d = a.sum(x,u);
128         assertEquals("a+p(x,u) = a+(x,u)",c,d);
129    
130         c = a.subtract(b);
131         d = a.subtract(x,u);
132         assertEquals("a-p(x,u) = a-(x,u)",c,d);
133    
134         a = new GenPolynomial<ModInteger>(fac);
135         b = new GenPolynomial<ModInteger>(fac,x, u);
136         c = b.sum(a);
137         d = a.sum(x,u);
138         assertEquals("a+p(x,u) = a+(x,u)",c,d);
139    
140         c = a.subtract(b);
141         d = a.subtract(x,u);
142         assertEquals("a-p(x,u) = a-(x,u)",c,d);
143     }
144    
145    
146    /**
147     * Test object multiplication.
148     * 
149     */
150    
151     public void testMultiplication() {
152    
153         a = fac.random(ll);
154         assertTrue("not isZERO( a )", !a.isZERO() );
155    
156         b = fac.random(ll);
157         assertTrue("not isZERO( b )", !b.isZERO() );
158    
159         c = b.multiply(a);
160         d = a.multiply(b);
161         assertTrue("not isZERO( c )", !c.isZERO() );
162         assertTrue("not isZERO( d )", !d.isZERO() );
163    
164         //System.out.println("a = " + a);
165         //System.out.println("b = " + b);
166         e = d.subtract(c);
167         assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() );
168    
169         assertTrue("a*b = b*a", c.equals(d) );
170         assertEquals("a*b = b*a",c,d);
171    
172         c = fac.random(ll);
173         //System.out.println("c = " + c);
174         d = a.multiply( b.multiply(c) );
175         e = (a.multiply(b)).multiply(c);
176    
177         //System.out.println("d = " + d);
178         //System.out.println("e = " + e);
179    
180         //System.out.println("d-e = " + d.subtract(c) );
181    
182         assertEquals("a(bc) = (ab)c",d,e);
183         assertTrue("a(bc) = (ab)c", d.equals(e) );
184    
185         ModInteger x = a.leadingBaseCoefficient().inverse();
186         c = a.monic();
187         d = a.multiply(x);
188         assertEquals("a.monic() = a(1/ldcf(a))",c,d);
189    
190         ModInteger y = b.leadingBaseCoefficient().inverse();
191         c = b.monic();
192         d = b.multiply(y);
193         assertEquals("b.monic() = b(1/ldcf(b))",c,d);
194    
195         e = new GenPolynomial<ModInteger>(fac,y);
196         d = b.multiply(e);
197         assertEquals("b.monic() = b(1/ldcf(b))",c,d);
198    
199         d = e.multiply(b);
200         assertEquals("b.monic() = (1/ldcf(b) (0))*b",c,d);
201     }
202    
203    
204    /**
205     * Test distributive law.
206     * 
207     */
208     public void testDistributive() {
209         a = fac.random(kl,ll,el,q);
210         b = fac.random(kl,ll,el,q);
211         c = fac.random(kl,ll,el,q);
212    
213         d = a.multiply( b.sum(c) );
214         e = a.multiply( b ).sum( a.multiply(c) );
215    
216         assertEquals("a(b+c) = ab+ac",d,e);
217     }
218    
219    }