001
002/*
003 * $Id: ResidueTest.java 5864 2018-07-20 14:28:52Z kredel $
004 */
005
006package edu.jas.application;
007
008import java.util.ArrayList;
009import java.util.List;
010
011import junit.framework.Test;
012import junit.framework.TestCase;
013import junit.framework.TestSuite;
014
015//
016
017import edu.jas.arith.BigRational;
018
019//import edu.jas.structure.RingElem;
020
021import edu.jas.poly.GenPolynomial;
022import edu.jas.poly.GenPolynomialRing;
023
024
025/**
026 * Residue tests 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       //
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   //private final static int bitlen = 100;
057
058   Ideal<BigRational> id;
059   ResidueRing<BigRational> fac;
060   GenPolynomialRing<BigRational> mfac;
061   List<GenPolynomial<BigRational>> F;
062
063   Residue< BigRational > a;
064   Residue< BigRational > b;
065   Residue< BigRational > c;
066   Residue< BigRational > d;
067   Residue< BigRational > e;
068
069   int rl = 3; 
070   int kl = 3;
071   int ll = 7;
072   int el = 3;
073   float q = 0.4f;
074   int il = ( rl == 1 ? 1 : 2 ); 
075
076   protected void setUp() {
077       a = b = c = d = e = null;
078       mfac = new GenPolynomialRing<BigRational>( new BigRational(1), rl );
079       F = new ArrayList<GenPolynomial<BigRational>>( il );
080       for ( int i = 0; i < il; i++ ) {
081           GenPolynomial<BigRational> mo = mfac.random(kl,ll,el,q);
082           while ( mo.isConstant() ) {
083                 mo = mfac.random(kl,ll,el,q);
084           }
085           F.add( mo );
086       }
087       id = new Ideal<BigRational>(mfac,F);
088       //System.out.println("id = " + id);
089       assert !id.isONE() : "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 || id.isONE());
112     assertTrue("isZERO( c )", !c.isZERO() || id.isONE());
113     assertTrue("isONE( c )", c.isONE() || id.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}