001
002/*
003 * $Id: ResidueTest.java 3789 2011-10-01 18:54:43Z kredel $
004 */
005
006package edu.jas.poly;
007
008//import java.util.ArrayList;
009//import java.util.List;
010
011import junit.framework.Test;
012import junit.framework.TestCase;
013import junit.framework.TestSuite;
014
015import org.apache.log4j.BasicConfigurator;
016//import org.apache.log4j.Logger;
017
018import edu.jas.arith.BigRational;
019import edu.jas.arith.BigInteger;
020
021//import edu.jas.structure.RingElem;
022
023
024
025/**
026 * Residue test with JUnit. 
027 * @author Heinz Kredel.
028 */
029
030public class ResidueTest extends TestCase {
031
032/**
033 * main.
034 */
035   public static void main (String[] args) {
036       BasicConfigurator.configure();
037       junit.textui.TestRunner.run( suite() );
038   }
039
040/**
041 * Constructs a <CODE>ResidueTest</CODE> object.
042 * @param name String.
043 */
044   public ResidueTest(String name) {
045          super(name);
046   }
047
048/**
049 * suite.
050 */ 
051 public static Test suite() {
052     TestSuite suite= new TestSuite(ResidueTest.class);
053     return suite;
054   }
055
056   ResidueRing<BigInteger> fac;
057   GenPolynomialRing<BigRational> pfac;
058   ResidueRing< GenPolynomial<BigRational> > mfac;
059
060   Residue< BigInteger > a;
061   Residue< BigInteger > b;
062   Residue< BigInteger > c;
063   Residue< BigInteger > d;
064   Residue< BigInteger > e;
065
066   Residue< GenPolynomial<BigRational> > ap;
067   Residue< GenPolynomial<BigRational> > bp;
068   Residue< GenPolynomial<BigRational> > cp;
069   Residue< GenPolynomial<BigRational> > dp;
070   Residue< GenPolynomial<BigRational> > ep;
071
072
073   int rl = 1; 
074   int kl = 13;
075   int ll = 7;
076   int el = 3;
077   float q = 0.4f;
078   int il = 2; 
079   long p = 1152921504606846883L; // 2^60-93; 
080
081   @Override
082   protected void setUp() {
083       a = b = c = d = e = null;
084       ap = bp = cp = dp = ep = null;
085       BigInteger cfac = new BigInteger(1);
086       fac = new ResidueRing<BigInteger>( cfac, new BigInteger( p ) );
087       pfac = new GenPolynomialRing<BigRational>( new BigRational(1), 1 );
088       GenPolynomial<BigRational> mo = pfac.random(kl,ll,el,q);
089       while ( mo.isConstant() ) {
090             mo = pfac.random(kl,ll,el,q);
091       }
092       mfac = new ResidueRing<GenPolynomial<BigRational>>( pfac, mo );
093   }
094
095   @Override
096   protected void tearDown() {
097       a = b = c = d = e = null;
098       ap = bp = cp = dp = ep = null;
099       fac = null;
100       pfac = null;
101       mfac = null;
102   }
103
104
105/**
106 * Test constructor for integer.
107 * 
108 */
109 public void testIntConstruction() {
110     c = fac.getONE();
111     //System.out.println("c = " + c);
112     assertTrue("isZERO( c )", !c.isZERO() );
113     assertTrue("isONE( c )", c.isONE() );
114
115     d = fac.getZERO();
116     //System.out.println("d = " + d);
117     assertTrue("isZERO( d )", d.isZERO() );
118     assertTrue("isONE( d )", !d.isONE() );
119 }
120
121
122/**
123 * Test constructor for polynomial.
124 * 
125 */
126 public void testPolyConstruction() {
127     cp = mfac.getONE();
128     assertTrue("isZERO( cp )", !cp.isZERO() );
129     assertTrue("isONE( cp )", cp.isONE() );
130
131     dp = mfac.getZERO();
132     assertTrue("isZERO( dp )", dp.isZERO() );
133     assertTrue("isONE( dp )", !dp.isONE() );
134 }
135
136
137/**
138 * Test random integer.
139 * 
140 */
141 public void testIntRandom() {
142     for (int i = 0; i < 7; i++) {
143         a = fac.random(kl*(i+1));
144        if ( a.isZERO() ) {
145            continue;
146         }
147         //a = fac.random(kl*(i+1), ll+2*i, el+i, q );
148         //System.out.println("a = " + a);
149         assertTrue(" not isZERO( a"+i+" )", !a.isZERO() );
150         assertTrue(" not isONE( a"+i+" )", !a.isONE() );
151     }
152 }
153
154
155/**
156 * Test random polynomial.
157 * 
158 */
159 public void testPolyRandom() {
160     for (int i = 0; i < 7; i++) {
161         ap = mfac.random(kl+i);
162         if ( ap.isZERO() ) {
163            continue;
164         }
165         assertTrue(" not isZERO( ap"+i+" )", !ap.isZERO() );
166         assertTrue(" not isONE( ap"+i+" )", !ap.isONE() );
167     }
168 }
169
170
171/**
172 * Test integer addition.
173 * 
174 */
175 public void testIntAddition() {
176
177     a = fac.random(kl);
178     b = fac.random(kl);
179
180     c = a.sum(b);
181     d = c.subtract(b);
182     assertEquals("a+b-b = a",a,d);
183
184     c = a.sum(b);
185     d = b.sum(a);
186     assertEquals("a+b = b+a",c,d);
187
188     c = fac.random(kl);
189     d = c.sum( a.sum(b) );
190     e = c.sum( a ).sum(b);
191     assertEquals("c+(a+b) = (c+a)+b",d,e);
192
193
194     c = a.sum( fac.getZERO() );
195     d = a.subtract( fac.getZERO() );
196     assertEquals("a+0 = a-0",c,d);
197
198     c = fac.getZERO().sum( a );
199     d = fac.getZERO().subtract( a.negate() );
200     assertEquals("0+a = 0+(-a)",c,d);
201 }
202
203
204/**
205 * Test polynomial addition.
206 * 
207 */
208 public void testPolyAddition() {
209
210     ap = mfac.random(kl);
211     bp = mfac.random(kl);
212     //System.out.println("a = " + a);
213     //System.out.println("b = " + b);
214
215     cp = ap.sum(bp);
216     dp = cp.subtract(bp);
217     assertEquals("a+b-b = a",ap,dp);
218
219     cp = ap.sum(bp);
220     dp = bp.sum(ap);
221     //System.out.println("c = " + c);
222     //System.out.println("d = " + d);
223
224     assertEquals("a+b = b+a",cp,dp);
225
226     cp = mfac.random(kl);
227     dp = cp.sum( ap.sum(bp) );
228     ep = cp.sum( ap ).sum(bp);
229     assertEquals("c+(a+b) = (c+a)+b",dp,ep);
230
231
232     cp = ap.sum( mfac.getZERO() );
233     dp = ap.subtract( mfac.getZERO() );
234     assertEquals("a+0 = a-0",cp,dp);
235
236     cp = mfac.getZERO().sum( ap );
237     dp = mfac.getZERO().subtract( ap.negate() );
238     assertEquals("0+a = 0+(-a)",cp,dp);
239 }
240
241
242/**
243 * Test integer multiplication.
244 * 
245 */
246
247 public void testIntMultiplication() {
248
249     a = fac.random(kl);
250     if ( a.isZERO() ) {
251        return;
252     }
253     assertTrue("not isZERO( a )", !a.isZERO() );
254
255     b = fac.random(kl);
256     if ( b.isZERO() ) {
257        return;
258     }
259     assertTrue("not isZERO( b )", !b.isZERO() );
260
261     c = b.multiply(a);
262     d = a.multiply(b);
263     assertTrue("not isZERO( c )", !c.isZERO() );
264     assertTrue("not isZERO( d )", !d.isZERO() );
265
266     //System.out.println("a = " + a);
267     //System.out.println("b = " + b);
268     e = d.subtract(c);
269     assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() );
270
271     assertTrue("a*b = b*a", c.equals(d) );
272     assertEquals("a*b = b*a",c,d);
273
274     c = fac.random(kl);
275     //System.out.println("c = " + c);
276     d = a.multiply( b.multiply(c) );
277     e = (a.multiply(b)).multiply(c);
278
279     //System.out.println("d = " + d);
280     //System.out.println("e = " + e);
281
282     //System.out.println("d-e = " + d.subtract(c) );
283
284     assertEquals("a(bc) = (ab)c",d,e);
285     assertTrue("a(bc) = (ab)c", d.equals(e) );
286
287     c = a.multiply( fac.getONE() );
288     d = fac.getONE().multiply( a );
289     assertEquals("a*1 = 1*a",c,d);
290
291     if ( a.isUnit() ) {
292        c = a.inverse();
293        d = c.multiply(a);
294        //System.out.println("a = " + a);
295        //System.out.println("c = " + c);
296        //System.out.println("d = " + d);
297        assertTrue("a*1/a = 1",d.isONE()); 
298     }
299 }
300
301
302/**
303 * Test polynomial multiplication.
304 * 
305 */
306 public void testPolyMultiplication() {
307
308     ap = mfac.random(kl);
309     if ( ap.isZERO() ) {
310        return;
311     }
312     assertTrue("not isZERO( a )", !ap.isZERO() );
313
314     bp = mfac.random(kl);
315     if ( bp.isZERO() ) {
316        return;
317     }
318     assertTrue("not isZERO( b )", !bp.isZERO() );
319
320     cp = bp.multiply(ap);
321     dp = ap.multiply(bp);
322     assertTrue("not isZERO( c )", !cp.isZERO() );
323     assertTrue("not isZERO( d )", !dp.isZERO() );
324
325     //System.out.println("a = " + a);
326     //System.out.println("b = " + b);
327     ep = dp.subtract(cp);
328     assertTrue("isZERO( a*b-b*a ) " + ep, ep.isZERO() );
329
330     assertTrue("a*b = b*a", cp.equals(dp) );
331     assertEquals("a*b = b*a",cp,dp);
332
333     cp = mfac.random(kl);
334     //System.out.println("c = " + c);
335     dp = ap.multiply( bp.multiply(cp) );
336     ep = (ap.multiply(bp)).multiply(cp);
337
338     //System.out.println("d = " + d);
339     //System.out.println("e = " + e);
340
341     //System.out.println("d-e = " + d.subtract(c) );
342
343     assertEquals("a(bc) = (ab)c",dp,ep);
344     assertTrue("a(bc) = (ab)c", dp.equals(ep) );
345
346     cp = ap.multiply( mfac.getONE() );
347     dp = mfac.getONE().multiply( ap );
348     assertEquals("a*1 = 1*a",cp,dp);
349
350     if ( ap.isUnit() ) {
351        cp = ap.inverse();
352        dp = cp.multiply(ap);
353        //System.out.println("a = " + a);
354        //System.out.println("c = " + c);
355        //System.out.println("d = " + d);
356        assertTrue("a*1/a = 1",dp.isONE()); 
357     }
358 }
359
360
361}