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