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 }