001    
002    /*
003     * $Id: QuotientRatTest.java 3356 2010-10-23 16:41:01Z kredel $
004     */
005    
006    package edu.jas.ufd;
007    
008    
009    import junit.framework.Test;
010    import junit.framework.TestCase;
011    import junit.framework.TestSuite;
012    
013    import org.apache.log4j.BasicConfigurator;
014    //import org.apache.log4j.Logger;
015    
016    import edu.jas.arith.BigRational;
017    
018    import edu.jas.poly.GenPolynomialRing;
019    import edu.jas.poly.TermOrder;
020    
021    import edu.jas.kern.PrettyPrint;
022    import edu.jas.kern.ComputerThreads;
023    
024    
025    /**
026     * Quotient over BigRational GenPolynomial tests with JUnit. 
027     * @author Heinz Kredel.
028     */
029    
030    public class QuotientRatTest 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>QuotientRatTest</CODE> object.
042     * @param name String.
043     */
044       public QuotientRatTest(String name) {
045              super(name);
046       }
047    
048    /**
049     * suite.
050     */ 
051     public static Test suite() {
052         TestSuite suite= new TestSuite(QuotientRatTest.class);
053         return suite;
054       }
055    
056       //private final static int bitlen = 100;
057    
058       QuotientRing<BigRational> zFac;
059       QuotientRing<BigRational> efac;
060       GenPolynomialRing<BigRational> mfac;
061    
062       Quotient< BigRational > a;
063       Quotient< BigRational > b;
064       Quotient< BigRational > c;
065       Quotient< BigRational > d;
066       Quotient< BigRational > e;
067       Quotient< BigRational > az;
068       Quotient< BigRational > bz;
069       Quotient< BigRational > cz;
070       Quotient< BigRational > dz;
071       Quotient< BigRational > ez;
072    
073       int rl = 3; 
074       int kl = 5;
075       int ll = 3; //6;
076       int el = 2;
077       float q = 0.4f;
078    
079       protected void setUp() {
080           a = b = c = d = e = null;
081           TermOrder to = new TermOrder( TermOrder.INVLEX );
082           mfac = new GenPolynomialRing<BigRational>( new BigRational(1), rl, to );
083           efac = new QuotientRing<BigRational>( mfac );
084           zFac = new QuotientRing<BigRational>( mfac, false );
085       }
086    
087       protected void tearDown() {
088           a = b = c = d = e = null;
089           //efac.terminate();
090           efac = null;
091           zFac = null;
092           ComputerThreads.terminate();
093       }
094    
095    
096    /**
097     * Test constructor and toString.
098     * 
099     */
100     public void testConstruction() {
101         c = efac.getONE();
102         //System.out.println("c = " + c);
103         //System.out.println("c.val = " + c.val);
104         assertTrue("length( c ) = 1", c.num.length() == 1);
105         assertTrue("isZERO( c )", !c.isZERO() );
106         assertTrue("isONE( c )", c.isONE() );
107    
108         d = efac.getZERO();
109         //System.out.println("d = " + d);
110         //System.out.println("d.val = " + d.val);
111         assertTrue("length( d ) = 0", d.num.length() == 0);
112         assertTrue("isZERO( d )", d.isZERO() );
113         assertTrue("isONE( d )", !d.isONE() );
114     }
115    
116    
117    /**
118     * Test random polynomial.
119     * 
120     */
121     public void testRandom() {
122         for (int i = 0; i < 7; i++) {
123             //a = efac.random(ll+i);
124             a = efac.random(kl*(i+1), ll+2+2*i, el, q );
125             //System.out.println("a = " + a);
126             if ( a.isZERO() || a.isONE() ) {
127                continue;
128             }
129             assertTrue("length( a"+i+" ) <> 0", a.num.length() >= 0);
130             assertTrue(" not isZERO( a"+i+" )", !a.isZERO() );
131             assertTrue(" not isONE( a"+i+" )", !a.isONE() );
132         }
133     }
134    
135    
136    /**
137     * Test addition.
138     * 
139     */
140     public void testAddition() {
141    
142         a = efac.random(kl,ll,el,q);
143         b = efac.random(kl,ll,el,q);
144         //System.out.println("a = " + a);
145         //System.out.println("b = " + b);
146    
147         c = a.sum(b);
148         d = c.subtract(b);
149         //System.out.println("c = " + c);
150         //System.out.println("d = " + d);
151         d = d.monic();
152         //System.out.println("d = " + d);
153         assertEquals("a+b-b = a",a,d);
154    
155         c = a.sum(b);
156         d = b.sum(a);
157         //System.out.println("c = " + c);
158         //System.out.println("d = " + d);
159         assertEquals("a+b = b+a",c,d);
160    
161         //System.out.println("monic(d) = " + d.monic());
162    
163         c = efac.random(kl,ll,el,q);
164         //System.out.println("c = " + c);
165         d = c.sum( a.sum(b) );
166         e = c.sum( a ).sum(b);
167         //System.out.println("d = " + d);
168         //System.out.println("e = " + e);
169         assertEquals("c+(a+b) = (c+a)+b",d,e);
170    
171    
172         c = a.sum( efac.getZERO() );
173         d = a.subtract( efac.getZERO() );
174         assertEquals("a+0 = a-0",c,d);
175    
176         c = efac.getZERO().sum( a );
177         d = efac.getZERO().subtract( a.negate() );
178         assertEquals("0+a = 0+(-a)",c,d);
179     }
180    
181    
182    /**
183     * Test object multiplication.
184     * 
185     */
186     public void testMultiplication() {
187    
188         a = efac.random(kl,ll,el,q);
189         //assertTrue("not isZERO( a )", !a.isZERO() );
190    
191         b = efac.random(kl,ll,el,q);
192         //assertTrue("not isZERO( b )", !b.isZERO() );
193    
194         c = b.multiply(a);
195         d = a.multiply(b);
196         //assertTrue("not isZERO( c )", !c.isZERO() );
197         //assertTrue("not isZERO( d )", !d.isZERO() );
198    
199         //System.out.println("a = " + a);
200         //System.out.println("b = " + b);
201         e = d.subtract(c);
202         assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() );
203    
204         assertTrue("a*b = b*a", c.equals(d) );
205         assertEquals("a*b = b*a",c,d);
206    
207         c = efac.random(kl,ll,el,q);
208         //System.out.println("c = " + c);
209         d = a.multiply( b.multiply(c) );
210         e = (a.multiply(b)).multiply(c);
211    
212         //System.out.println("d = " + d);
213         //System.out.println("e = " + e);
214    
215         //System.out.println("d-e = " + d.subtract(c) );
216    
217         assertEquals("a(bc) = (ab)c",d,e);
218         assertTrue("a(bc) = (ab)c", d.equals(e) );
219    
220         c = a.multiply( efac.getONE() );
221         d = efac.getONE().multiply( a );
222         assertEquals("a*1 = 1*a",c,d);
223    
224         if ( a.isUnit() ) {
225            c = a.inverse();
226            d = c.multiply(a);
227            //System.out.println("a = " + a);
228            //System.out.println("c = " + c);
229            //System.out.println("d = " + d);
230            assertTrue("a*1/a = 1",d.isONE()); 
231         }
232     }
233    
234    
235    /**
236     * Test addition with syzygy gcd and euclids gcd.
237     * 
238     */
239     public void xtestAdditionGcd() {
240    
241         long te, tz;
242    
243         a = efac.random(kl,ll,el,q);
244         b = efac.random(kl,ll,el,q);
245         //System.out.println("a = " + a);
246         //System.out.println("b = " + b);
247    
248         az = new Quotient<BigRational>(zFac,a.num,a.den,true);
249         bz = new Quotient<BigRational>(zFac,b.num,b.den,true);
250    
251         te = System.currentTimeMillis();
252         c = a.sum(b);
253         d = c.subtract(b);
254         d = d.monic();
255         te = System.currentTimeMillis() - te;
256         assertEquals("a+b-b = a",a,d);
257    
258         tz = System.currentTimeMillis();
259         cz = az.sum(bz);
260         dz = cz.subtract(bz);
261         dz = dz.monic();
262         tz = System.currentTimeMillis() - tz;
263         assertEquals("a+b-b = a",az,dz);
264    
265         System.out.println("te = " + te);
266         System.out.println("tz = " + tz);
267    
268         c = a.sum(b);
269         d = b.sum(a);
270         //System.out.println("c = " + c);
271         //System.out.println("d = " + d);
272         assertEquals("a+b = b+a",c,d);
273    
274         c = efac.random(kl,ll,el,q);
275         cz = new Quotient<BigRational>(zFac,c.num,c.den,true);
276    
277    
278         te = System.currentTimeMillis();
279         d = c.sum( a.sum(b) );
280         e = c.sum( a ).sum(b);
281         te = System.currentTimeMillis() - te;
282         assertEquals("c+(a+b) = (c+a)+b",d,e);
283    
284         tz = System.currentTimeMillis();
285         dz = cz.sum( az.sum(bz) );
286         ez = cz.sum( az ).sum(bz);
287         tz = System.currentTimeMillis() - tz;
288         assertEquals("c+(a+b) = (c+a)+b",dz,ez);
289    
290         System.out.println("te = " + te);
291         System.out.println("tz = " + tz);
292    
293         c = a.sum( efac.getZERO() );
294         d = a.subtract( efac.getZERO() );
295         assertEquals("a+0 = a-0",c,d);
296    
297         c = efac.getZERO().sum( a );
298         d = efac.getZERO().subtract( a.negate() );
299         assertEquals("0+a = 0+(-a)",c,d);
300     }
301    
302    
303    /**
304     * Test parse().
305     * 
306     */
307     public void testParse() {
308         a = efac.random(kl*2,ll*2,el*2,q*2);
309         //assertTrue("not isZERO( a )", !a.isZERO() );
310    
311         //PrettyPrint.setInternal();
312         //System.out.println("a = " + a);
313         PrettyPrint.setPretty();
314         //System.out.println("a = " + a);
315         String p = a.toString();
316         //System.out.println("p = " + p);
317         b = efac.parse(p);
318         //System.out.println("b = " + b);
319    
320         //c = a.subtract(b);
321         //System.out.println("c = " + c);
322         assertEquals("parse(a.toSting()) = a",a,b);
323     }
324    
325    }