001/*
002 * $Id: RatGenPolynomialTest.java 4284 2012-11-03 18:32:04Z kredel $
003 */
004
005package edu.jas.poly;
006
007import junit.framework.Test;
008import junit.framework.TestCase;
009import junit.framework.TestSuite;
010import edu.jas.arith.BigRational;
011
012
013/**
014 * BigRational coefficients GenPolynomial tests with JUnit.
015 * @author Heinz Kredel.
016 */
017
018public class RatGenPolynomialTest extends TestCase {
019
020/**
021 * main.
022 */
023   public static void main (String[] args) {
024          junit.textui.TestRunner.run( suite() );
025   }
026
027/**
028 * Constructs a <CODE>RatGenPolynomialTest</CODE> object.
029 * @param name String.
030 */
031   public RatGenPolynomialTest(String name) {
032          super(name);
033   }
034
035/**
036 */ 
037 public static Test suite() {
038     TestSuite suite= new TestSuite(RatGenPolynomialTest.class);
039     return suite;
040   }
041
042   //private final static int bitlen = 100;
043
044   GenPolynomialRing<BigRational> fac;
045
046   GenPolynomial<BigRational> a;
047   GenPolynomial<BigRational> b;
048   GenPolynomial<BigRational> c;
049   GenPolynomial<BigRational> d;
050   GenPolynomial<BigRational> e;
051
052   int rl = 7; 
053   int kl = 10;
054   int ll = 10;
055   int el = 5;
056   float q = 0.5f;
057
058   protected void setUp() {
059       a = b = c = d = e = null;
060       fac = new GenPolynomialRing<BigRational>(new BigRational(1),rl);
061   }
062
063   protected void tearDown() {
064       a = b = c = d = e = null;
065       fac = null;
066   }
067
068
069/**
070 * Test constructor and toString.
071 */
072 public void testConstruction() {
073     c = fac.getONE();
074     assertTrue("length( c ) = 1", c.length() == 1);
075     assertTrue("isZERO( c )", !c.isZERO() );
076     assertTrue("isONE( c )", c.isONE() );
077
078     d = fac.getZERO();
079     assertTrue("length( d ) = 0", d.length() == 0);
080     assertTrue("isZERO( d )", d.isZERO() );
081     assertTrue("isONE( d )", !d.isONE() );
082 }
083
084
085/**
086 * Test random polynomial.
087 */
088 public void testRandom() {
089     for (int i = 0; i < 7; i++) {
090         a = fac.random(ll);
091         //System.out.println("a = " + a);
092
093             // fac.random(rl+i, kl*(i+1), ll+2*i, el+i, q );
094         assertTrue("length( a"+i+" ) <> 0", a.length() >= 0);
095         assertTrue(" not isZERO( a"+i+" )", !a.isZERO() );
096         assertTrue(" not isONE( a"+i+" )", !a.isONE() );
097     }
098 }
099
100
101/**
102 * Test addition.
103 */
104 public void testAddition() {
105
106     a = fac.random(ll);
107     b = fac.random(ll);
108
109     c = a.sum(b);
110     d = c.subtract(b);
111     assertEquals("a+b-b = a",a,d);
112
113     c = fac.random(ll);
114
115     ExpVector u = ExpVector.EVRAND(rl,el,q);
116     BigRational x = BigRational.RNRAND(kl);
117
118     b = new GenPolynomial<BigRational>(fac,x, u);
119     c = a.sum(b);
120     d = a.sum(x,u);
121     assertEquals("a+p(x,u) = a+(x,u)",c,d);
122
123     c = a.subtract(b);
124     d = a.subtract(x,u);
125     assertEquals("a-p(x,u) = a-(x,u)",c,d);
126
127     a = new GenPolynomial<BigRational>(fac);
128     b = new GenPolynomial<BigRational>(fac,x, u);
129     c = b.sum(a);
130     d = a.sum(x,u);
131     assertEquals("a+p(x,u) = a+(x,u)",c,d);
132
133     c = a.subtract(b);
134     d = a.subtract(x,u);
135     assertEquals("a-p(x,u) = a-(x,u)",c,d);
136 }
137
138
139/**
140 * Test object multiplication.
141 */
142 public void testMultiplication() {
143
144     a = fac.random(ll);
145     assertTrue("not isZERO( a )", !a.isZERO() );
146
147     b = fac.random(ll);
148     assertTrue("not isZERO( b )", !b.isZERO() );
149
150     c = b.multiply(a);
151     d = a.multiply(b);
152     assertTrue("not isZERO( c )", !c.isZERO() );
153     assertTrue("not isZERO( d )", !d.isZERO() );
154
155     //System.out.println("a = " + a);
156     //System.out.println("b = " + b);
157     e = d.subtract(c);
158     assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() );
159
160     assertTrue("a*b = b*a", c.equals(d) );
161     assertEquals("a*b = b*a",c,d);
162
163     c = fac.random(ll);
164     //System.out.println("c = " + c);
165     d = a.multiply( b.multiply(c) );
166     e = (a.multiply(b)).multiply(c);
167
168     //System.out.println("d = " + d);
169     //System.out.println("e = " + e);
170
171     //System.out.println("d-e = " + d.subtract(c) );
172
173     assertEquals("a(bc) = (ab)c",d,e);
174     assertTrue("a(bc) = (ab)c", d.equals(e) );
175
176     BigRational x = a.leadingBaseCoefficient().inverse();
177     c = a.monic();
178     d = a.multiply(x);
179     assertEquals("a.monic() = a(1/ldcf(a))",c,d);
180
181     BigRational y = b.leadingBaseCoefficient().inverse();
182     c = b.monic();
183     d = b.multiply(y);
184     assertEquals("b.monic() = b(1/ldcf(b))",c,d);
185
186     e = new GenPolynomial<BigRational>(fac,y);
187     d = b.multiply(e);
188     assertEquals("b.monic() = b(1/ldcf(b))",c,d);
189
190     d = e.multiply(b);
191     assertEquals("b.monic() = (1/ldcf(b) (0))*b",c,d);
192 }
193
194
195/**
196 * Test BLAS level 1.
197 */
198 public void testBLAS1() {
199     a = fac.random(kl,ll,el,q);
200     b = fac.random(kl,ll,el,q);
201     c = fac.random(kl,3,el*el,q);
202     ExpVector ev = ExpVector.EVRAND(rl,el,q);
203     BigRational lc = BigRational.RNRAND(kl);
204
205     d = a.subtractMultiple(lc,b);
206     e = a.subtract( b.multiply(lc) );
207     assertEquals("a - (lc) b == a - ((lc) b)",d,e);
208
209     d = a.subtractMultiple(lc,ev,b);
210     e = a.subtract( b.multiply(lc,ev) );
211     assertEquals("a - (lc ev) b == a - ((lc ev) b)",d,e);
212
213     ExpVector fv = ExpVector.EVRAND(rl,el,q);
214     BigRational tc = BigRational.RNRAND(kl);
215
216     d = a.scaleSubtractMultiple(tc,lc,ev,b);
217     e = a.multiply(tc).subtract( b.multiply(lc,ev) );
218     assertEquals("(tc) a - (lc ev) b == ((tc) a - ((lc ev) b))",d,e);
219
220     d = a.scaleSubtractMultiple(tc,fv,lc,ev,b);
221     e = a.multiply(tc,fv).subtract( b.multiply(lc,ev) );
222     assertEquals("(tc fv) a - (lc ev) b == ((tc fv) a - ((lc ev) b))",d,e);
223 }
224
225
226/**
227 * Test distributive law.
228 */
229 public void testDistributive() {
230     a = fac.random(kl,ll,el,q);
231     b = fac.random(kl,ll,el,q);
232     c = fac.random(kl,ll,el,q);
233
234     d = a.multiply( b.sum(c) );
235     e = a.multiply( b ).sum( a.multiply(c) );
236
237     assertEquals("a(b+c) == ab+ac",d,e);
238 }
239
240
241/**
242 * Test object quotient and remainder.
243 */
244 public void testQuotRem() {
245
246     fac = new GenPolynomialRing<BigRational>(new BigRational(1),1);
247
248     a = fac.random(ll).monic();
249     assertTrue("not isZERO( a )", !a.isZERO() );
250
251     b = fac.random(ll).monic();
252     assertTrue("not isZERO( b )", !b.isZERO() );
253
254     GenPolynomial<BigRational> h = a;
255     GenPolynomial<BigRational> g = fac.random(ll).monic();
256     assertTrue("not isZERO( g )", !g.isZERO() );
257     a = a.multiply(g);
258     b = b.multiply(g);
259     //System.out.println("a = " + a);
260     //System.out.println("b = " + b);
261     //System.out.println("g = " + g);
262
263     GenPolynomial<BigRational>[] qr;
264     qr = b.divideAndRemainder(a);
265     c = qr[0];
266     d = qr[1];
267     //System.out.println("q = " + c);
268     //System.out.println("r = " + d);
269     e = c.multiply(a).sum(d);
270     assertEquals("b = q a + r", b, e );
271
272     qr = a.divideAndRemainder(b);
273     c = qr[0];
274     d = qr[1];
275     //System.out.println("q = " + c);
276     //System.out.println("r = " + d);
277     e = c.multiply(b).sum(d);
278     assertEquals("a = q b + r", a, e );
279
280
281     // gcd tests -------------------------------
282     c = a.gcd(b);
283     //System.out.println("gcd = " + c);
284     assertTrue("a mod gcd(a,b) = 0", a.remainder(c).isZERO() );
285     assertTrue("b mod gcd(a,b) = 0", b.remainder(c).isZERO() );
286     assertEquals("g = gcd(a,b)", c, g );
287
288
289     GenPolynomial<BigRational>[] gst;
290     gst = a.egcd(b);
291     //System.out.println("egcd = " + gst[0]);
292     //System.out.println(", s = " + gst[1] + ", t = " + gst[2]);
293     c = gst[0];
294     d = gst[1];
295     e = gst[2];
296     assertEquals("g = gcd(a,b)", c, g );
297
298     GenPolynomial<BigRational> x;
299     x = a.multiply(d).sum( b.multiply(e) ).monic(); 
300     //System.out.println("x = " + x);
301     assertEquals("gcd(a,b) = a s + b t", c, x );
302
303
304     gst = a.hegcd(b);
305     //System.out.println("hegcd = " + gst[0]);
306     //System.out.println("s = " + gst[1]);
307     c = gst[0];
308     d = gst[1];
309     assertEquals("g = gcd(a,b)", c, g );
310
311     x = a.multiply(d).remainder(b).monic(); 
312     //System.out.println("x = " + x);
313     assertEquals("gcd(a,b) = a s mod b", c, x );
314
315     //System.out.println("g = " + g);
316     //System.out.println("h = " + h);
317     c = h.modInverse(g);
318     //System.out.println("c = " + c);
319     x = c.multiply(h).remainder( g ).monic(); 
320     //System.out.println("x = " + x);
321     assertTrue("h invertible mod g", x.isONE() );
322
323 }
324
325}