001    
002    /*
003     * $Id: ProductTest.java 3368 2010-10-24 13:53:32Z kredel $
004     */
005    
006    package edu.jas.arith;
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.structure.RingFactory;
019    
020    
021    /**
022     * Product test with JUnit. 
023     * @author Heinz Kredel.
024     */
025    
026    public class ProductTest extends TestCase {
027    
028    /**
029     * main.
030     */
031       public static void main (String[] args) {
032           BasicConfigurator.configure();
033           junit.textui.TestRunner.run( suite() );
034       }
035    
036    /**
037     * Constructs a <CODE>ProductTest</CODE> object.
038     * @param name String.
039     */
040       public ProductTest(String name) {
041              super(name);
042       }
043    
044    /**
045     * suite.
046     */ 
047     public static Test suite() {
048         TestSuite suite= new TestSuite(ProductTest.class);
049         return suite;
050       }
051    
052       ProductRing<BigRational> fac;
053       ModIntegerRing pfac;
054       ProductRing<ModInteger> mfac;
055       ProductRing<BigInteger> ifac;
056    
057       Product< BigRational > a;
058       Product< BigRational > b;
059       Product< BigRational > c;
060       Product< BigRational > d;
061       Product< BigRational > e;
062       Product< BigRational > f;
063    
064       Product< ModInteger > ap;
065       Product< ModInteger > bp;
066       Product< ModInteger > cp;
067       Product< ModInteger > dp;
068       Product< ModInteger > ep;
069       Product< ModInteger > fp;
070    
071       Product< BigInteger > ai;
072       Product< BigInteger > bi;
073       Product< BigInteger > ci;
074       Product< BigInteger > di;
075       Product< BigInteger > ei;
076       Product< BigInteger > fi;
077    
078    
079       int pl = 5; 
080       int rl = 1; 
081       int kl = 13;
082       int ll = 7;
083       int el = 3;
084       float q = 0.9f;
085       int il = 2; 
086       //long p = 1152921504606846883L; // 2^60-93; 
087    
088       protected void setUp() {
089           a = b = c = d = e = null;
090           ap = bp = cp = dp = ep = null;
091           ai = bi = ci = di = ei = null;
092           BigRational cfac = new BigRational(2,3);
093           fac = new ProductRing<BigRational>( cfac, pl );
094           List<RingFactory<ModInteger>> lpfac 
095               = new ArrayList<RingFactory<ModInteger>>();
096           pfac = new ModIntegerRing( 2 );
097           lpfac.add(pfac);
098           pfac = new ModIntegerRing( 3 );
099           lpfac.add(pfac);
100           pfac = new ModIntegerRing( 5 );
101           lpfac.add(pfac);
102           pfac = new ModIntegerRing( 7 );
103           lpfac.add(pfac);
104           mfac = new ProductRing<ModInteger>( lpfac );
105           BigInteger cifac = new BigInteger(3);
106           ifac = new ProductRing<BigInteger>( cifac, pl );
107       }
108    
109       protected void tearDown() {
110           a = b = c = d = e = null;
111           ap = bp = cp = dp = ep = null;
112           ai = bi = ci = di = ei = null;
113           fac = null;
114           pfac = null;
115           mfac = null;
116           ifac = null;
117       }
118    
119    
120    /**
121     * Test constructor for rational.
122     * 
123     */
124     public void testRatConstruction() {
125         c = fac.getONE();
126         //System.out.println("c = " + c);
127         assertTrue("isZERO( c )", !c.isZERO() );
128         assertTrue("isONE( c )", c.isONE() );
129    
130         d = fac.getZERO();
131         //System.out.println("d = " + d);
132         assertTrue("isZERO( d )", d.isZERO() );
133         assertTrue("isONE( d )", !d.isONE() );
134     }
135    
136    
137    /**
138     * Test constructor for modular.
139     * 
140     */
141     public void testModConstruction() {
142         cp = mfac.getONE();
143         //System.out.println("cp = " + cp);
144         assertTrue("isZERO( cp )", !cp.isZERO() );
145         assertTrue("isONE( cp )", cp.isONE() );
146    
147         dp = mfac.getZERO();
148         //System.out.println("dp = " + dp);
149         assertTrue("isZERO( dp )", dp.isZERO() );
150         assertTrue("isONE( dp )", !dp.isONE() );
151     }
152    
153    
154    /**
155     * Test random rational.
156     * 
157     */
158     public void testRatRandom() {
159         for (int i = 0; i < 7; i++) {
160             a = fac.random(kl*(i+1));
161             if ( a.isZERO() ) {
162                continue;
163             }
164             assertTrue(" not isZERO( a"+i+" )", !a.isZERO() );
165             assertTrue(" not isONE( a"+i+" )", !a.isONE() );
166             a = fac.random( kl, q );
167             if ( a.isZERO() ) {
168                continue;
169             }
170             //System.out.println("a = " + a);
171             assertTrue(" not isZERO( a"+i+" )", !a.isZERO() );
172             assertTrue(" not isONE( a"+i+" )", !a.isONE() );
173         }
174     }
175    
176    
177    /**
178     * Test random modular.
179     * 
180     */
181     public void testModRandom() {
182         for (int i = 0; i < 7; i++) {
183             ap = mfac.random(kl,q);
184             if ( ap.isZERO() || ap.isONE() ) {
185                continue;
186             }
187             //System.out.println("ap = " + ap);
188             assertTrue(" not isZERO( ap"+i+" )", !ap.isZERO() );
189             assertTrue(" not isONE( ap"+i+" )", !ap.isONE() );
190         }
191     }
192    
193    
194    /**
195     * Test rational addition.
196     * 
197     */
198     public void testRatAddition() {
199    
200         a = fac.random(kl,q);
201         b = fac.random(kl,q);
202    
203         c = a.sum(b);
204         d = c.subtract(b);
205         assertEquals("a+b-b = a",a,d);
206    
207         //System.out.println("a = " + a);
208         //System.out.println("b = " + b);
209         //System.out.println("c = " + c);
210         //System.out.println("d = " + d);
211    
212         c = a.sum(b);
213         d = b.sum(a);
214         assertEquals("a+b = b+a",c,d);
215    
216         //System.out.println("c = " + c);
217         //System.out.println("d = " + d);
218    
219         c = fac.random(kl,q);
220         d = c.sum( a.sum(b) );
221         e = c.sum( a ).sum(b);
222         assertEquals("c+(a+b) = (c+a)+b",d,e);
223    
224         //System.out.println("c = " + c);
225         //System.out.println("d = " + d);
226         //System.out.println("e = " + e);
227    
228         c = a.sum( fac.getZERO() );
229         d = a.subtract( fac.getZERO() );
230         assertEquals("a+0 = a-0",c,d);
231    
232         //System.out.println("c = " + c);
233         //System.out.println("d = " + d);
234    
235         c = fac.getZERO().sum( a );
236         d = fac.getZERO().subtract( a.negate() );
237         assertEquals("0+a = 0+(-a)",c,d);
238    
239         //System.out.println("c = " + c);
240         //System.out.println("d = " + d);
241     }
242    
243    
244    /**
245     * Test integer addition.
246     * 
247     */
248     public void testIntAddition() {
249    
250         ai = ifac.random(kl,q);
251         bi = ifac.random(kl,q);
252    
253         ci = ai.sum(bi);
254         di = ci.subtract(bi);
255         assertEquals("a+b-b = a",ai,di);
256    
257         //System.out.println("a = " + a);
258         //System.out.println("b = " + b);
259         //System.out.println("c = " + c);
260         //System.out.println("d = " + d);
261    
262         ci = ai.sum(bi);
263         di = bi.sum(ai);
264         assertEquals("a+b = b+a",ci,di);
265    
266         //System.out.println("c = " + c);
267         //System.out.println("d = " + d);
268    
269         ci = ifac.random(kl,q);
270         di = ci.sum( ai.sum(bi) );
271         ei = ci.sum( ai ).sum(bi);
272         assertEquals("c+(a+b) = (c+a)+b",di,ei);
273    
274         //System.out.println("c = " + c);
275         //System.out.println("d = " + d);
276         //System.out.println("e = " + e);
277    
278         ci = ai.sum( ifac.getZERO() );
279         di = ai.subtract( ifac.getZERO() );
280         assertEquals("a+0 = a-0",ci,di);
281    
282         //System.out.println("c = " + c);
283         //System.out.println("d = " + d);
284    
285         ci = ifac.getZERO().sum( ai );
286         di = ifac.getZERO().subtract( ai.negate() );
287         assertEquals("0+a = 0+(-a)",ci,di);
288    
289         //System.out.println("c = " + c);
290         //System.out.println("d = " + d);
291     }
292    
293    
294    /**
295     * Test modular addition.
296     * 
297     */
298     public void testModAddition() {
299    
300         ap = mfac.random(kl,q);
301         bp = mfac.random(kl,q);
302         //System.out.println("a = " + a);
303         //System.out.println("b = " + b);
304    
305         cp = ap.sum(bp);
306         dp = cp.subtract(bp);
307         assertEquals("a+b-b = a",ap,dp);
308    
309         cp = ap.sum(bp);
310         dp = bp.sum(ap);
311         //System.out.println("c = " + c);
312         //System.out.println("d = " + d);
313    
314         assertEquals("a+b = b+a",cp,dp);
315    
316         cp = mfac.random(kl,q);
317         dp = cp.sum( ap.sum(bp) );
318         ep = cp.sum( ap ).sum(bp);
319         assertEquals("c+(a+b) = (c+a)+b",dp,ep);
320    
321    
322         cp = ap.sum( mfac.getZERO() );
323         dp = ap.subtract( mfac.getZERO() );
324         assertEquals("a+0 = a-0",cp,dp);
325    
326         cp = mfac.getZERO().sum( ap );
327         dp = mfac.getZERO().subtract( ap.negate() );
328         assertEquals("0+a = 0+(-a)",cp,dp);
329     }
330    
331    
332    /**
333     * Test rational multiplication.
334     * 
335     */
336     public void testRatMultiplication() {
337    
338         a = fac.random(kl);
339         if ( a.isZERO() ) {
340            return;
341         }
342         assertTrue("not isZERO( a )", !a.isZERO() );
343    
344         b = fac.random(kl,q);
345         if ( b.isZERO() ) {
346            return;
347         }
348         assertTrue("not isZERO( b )", !b.isZERO() );
349    
350         c = b.multiply(a);
351         d = a.multiply(b);
352         //assertTrue("not isZERO( c )", !c.isZERO() );
353         //assertTrue("not isZERO( d )", !d.isZERO() );
354    
355         //System.out.println("a = " + a);
356         //System.out.println("b = " + b);
357         e = d.subtract(c);
358         assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() );
359    
360         assertTrue("a*b = b*a", c.equals(d) );
361         assertEquals("a*b = b*a",c,d);
362    
363         c = fac.random(kl,q);
364         //System.out.println("c = " + c);
365         d = a.multiply( b.multiply(c) );
366         e = (a.multiply(b)).multiply(c);
367    
368         //System.out.println("d = " + d);
369         //System.out.println("e = " + e);
370         //System.out.println("d-e = " + d.subtract(c) );
371    
372         assertEquals("a(bc) = (ab)c",d,e);
373         assertTrue("a(bc) = (ab)c", d.equals(e) );
374    
375         c = a.divide(b);
376         d = a.remainder(b);
377         e = c.multiply(b).sum(d);
378         f = a.multiply( e.idempotent() );
379    
380         //System.out.println("c = " + c);
381         //System.out.println("d = " + d);
382         //System.out.println("e = " + e);
383         //System.out.println("f = " + f);
384         assertEquals("a = (a/b)c+d ",e,f);
385    
386         c = a.multiply( fac.getONE() );
387         d = fac.getONE().multiply( a );
388         assertEquals("a*1 = 1*a",c,d);
389    
390         b = a.idempotent();
391         c = a.idemComplement();
392         d = b.multiply(c);
393         assertEquals("idem(a)*idemComp(a) = 0",d,fac.getZERO());
394         d = b.sum(c);
395         assertEquals("idem(a)+idemComp(a) = 1",d,fac.getONE());
396    
397         if ( a.isUnit() ) {
398            c = a.inverse();
399            d = c.multiply(a);
400            e = a.idempotent();
401            //System.out.println("a = " + a);
402            //System.out.println("c = " + c);
403            //System.out.println("d = " + d);
404            //System.out.println("e = " + e);
405            assertEquals("a*1/a = 1",e,d); 
406         }
407     }
408    
409    
410    /**
411     * Test integer multiplication.
412     * 
413     */
414     public void testIntMultiplication() {
415    
416         ai = ifac.random(kl);
417         while ( ai.isZERO() ) {
418            ai = ifac.random(kl);
419         }
420         assertTrue("not isZERO( a )", !ai.isZERO() );
421    
422         bi = ifac.random(kl,q);
423         if ( bi.isZERO() ) {
424            bi = ifac.random(kl,q);
425         }
426         assertTrue("not isZERO( b )", !bi.isZERO() );
427    
428         ci = bi.multiply(ai);
429         di = ai.multiply(bi);
430         //assertTrue("not isZERO( c )", !c.isZERO() );
431         //assertTrue("not isZERO( d )", !d.isZERO() );
432    
433         //System.out.println("a = " + ai);
434         //System.out.println("b = " + bi);
435         ei = di.subtract(ci);
436         assertTrue("isZERO( a*b-b*a ) " + ei, ei.isZERO() );
437    
438         assertTrue("a*b = b*a", ci.equals(di) );
439         assertEquals("a*b = b*a",ci,di);
440    
441         ci = ifac.random(kl,q);
442         //System.out.println("c = " + ci);
443         di = ai.multiply( bi.multiply(ci) );
444         ei = (ai.multiply(bi)).multiply(ci);
445    
446         //System.out.println("d = " + di);
447         //System.out.println("e = " + ei);
448         //System.out.println("d-e = " + di.subtract(ci) );
449    
450         assertEquals("a(bc) = (ab)c",di,ei);
451         assertTrue("a(bc) = (ab)c", di.equals(ei) );
452    
453         ci = ai.divide(bi);
454         di = ai.remainder(bi);
455         ei = ci.multiply(bi).sum(di);
456         fi = ai.multiply( ei.idempotent() );
457    
458         //System.out.println("c = " + ci);
459         //System.out.println("d = " + di);
460         //System.out.println("e = " + ei);
461         //System.out.println("f = " + fi);
462         assertEquals("a = (a/b)c+d ",ei,fi);
463    
464    
465         ci = ai.gcd(bi);
466         di = ai.remainder(ci);
467         ei = bi.remainder(ci);
468    
469         //System.out.println("c = " + ci);
470         //System.out.println("d = " + di);
471         //System.out.println("e = " + ei);
472         assertTrue("gcd(a,b) | a ",di.isZERO());
473         assertTrue("gcd(a,b) | b ",ei.isZERO());
474    
475    
476         Product< BigInteger >[] gcd;
477         gcd = ai.egcd(bi);
478         ci = gcd[0];
479         di = ai.remainder(ci);
480         ei = bi.remainder(ci);
481    
482         //System.out.println();
483         //System.out.println("c = " + ci);
484         //System.out.println("d = " + di);
485         //System.out.println("e = " + ei);
486         assertTrue("gcd(a,b) | a ",di.isZERO());
487         assertTrue("gcd(a,b) | b ",ei.isZERO());
488    
489         di = ai.multiply(gcd[1]);
490         ei = bi.multiply(gcd[2]);
491         fi = di.sum(ei);
492    
493         //System.out.println("c = " + ci);
494         //System.out.println("c1= " + gcd[1]);
495         //System.out.println("c2= " + gcd[2]);
496         //System.out.println("d = " + di);
497         //System.out.println("e = " + ei);
498         //System.out.println("f = " + fi);
499         assertEquals("gcd(a,b) = c1*a + c2*b ",ci,fi);
500    
501         ci = ai.multiply( ifac.getONE() );
502         di = ifac.getONE().multiply( ai );
503         assertEquals("a*1 = 1*a",ci,di);
504    
505         bi = ai.idempotent();
506         ci = ai.idemComplement();
507         di = bi.multiply(ci);
508         assertEquals("idem(a)*idemComp(a) = 0",di,ifac.getZERO());
509         di = bi.sum(ci);
510         assertEquals("idem(a)+idemComp(a) = 1",di,ifac.getONE());
511    
512         if ( ai.isUnit() ) {
513            ci = ai.inverse();
514            di = ci.multiply(ai);
515            ei = ai.idempotent();
516            //System.out.println("a = " + a);
517            //System.out.println("c = " + c);
518            //System.out.println("d = " + d);
519            //System.out.println("e = " + e);
520            assertEquals("a*1/a = 1",ei,di); 
521         }
522     }
523    
524    
525    /**
526     * Test modular multiplication.
527     * 
528     */
529     public void testModMultiplication() {
530    
531         ap = mfac.random(kl,q);
532         if ( ap.isZERO() ) {
533            return;
534         }
535         assertTrue("not isZERO( a )", !ap.isZERO() );
536    
537         bp = mfac.random(kl,q);
538         if ( bp.isZERO() ) {
539            return;
540         }
541         assertTrue("not isZERO( b )", !bp.isZERO() );
542    
543         cp = bp.multiply(ap);
544         dp = ap.multiply(bp);
545         //assertTrue("not isZERO( c )", !cp.isZERO() );
546         //assertTrue("not isZERO( d )", !dp.isZERO() );
547    
548         //System.out.println("a = " + a);
549         //System.out.println("b = " + b);
550         ep = dp.subtract(cp);
551         assertTrue("isZERO( a*b-b*a ) " + ep, ep.isZERO() );
552    
553         assertTrue("a*b = b*a", cp.equals(dp) );
554         assertEquals("a*b = b*a",cp,dp);
555    
556         cp = mfac.random(kl,q);
557         //System.out.println("c = " + c);
558         dp = ap.multiply( bp.multiply(cp) );
559         ep = (ap.multiply(bp)).multiply(cp);
560    
561         //System.out.println("d = " + d);
562         //System.out.println("e = " + e);
563    
564         //System.out.println("d-e = " + d.subtract(c) );
565    
566         assertEquals("a(bc) = (ab)c",dp,ep);
567         assertTrue("a(bc) = (ab)c", dp.equals(ep) );
568    
569         cp = ap.divide(bp);
570         dp = ap.remainder(bp);
571         ep = cp.multiply(bp).sum(dp);
572         fp = ap.multiply( ep.idempotent() );
573    
574         //System.out.println("cp = " + cp);
575         //System.out.println("dp = " + dp);
576         //System.out.println("ep = " + ep);
577         //System.out.println("fp = " + fp);
578         assertEquals("a = (a/b)c+d ",ep,fp);
579    
580    
581         cp = ap.multiply( mfac.getONE() );
582         dp = mfac.getONE().multiply( ap );
583         assertEquals("a*1 = 1*a",cp,dp);
584    
585         bp = ap.idempotent();
586         cp = ap.idemComplement();
587         dp = bp.multiply(cp);
588         assertEquals("idem(a)*idemComp(a) = 0",dp,mfac.getZERO());
589         dp = bp.sum(cp);
590         assertEquals("idem(a)+idemComp(a) = 1",dp,mfac.getONE());
591    
592         if ( ap.isUnit() ) {
593            cp = ap.inverse();
594            dp = cp.multiply(ap);
595            ep = ap.idempotent();
596            //System.out.println("ap = " + ap);
597            //System.out.println("cp = " + cp);
598            //System.out.println("dp = " + dp);
599            //System.out.println("ep = " + ep);
600            assertEquals("a*1/a = 1",ep,dp); 
601         }
602     }
603    
604    
605    }