001 /*
002 * $Id: SquarefreeRatTest.java 2933 2009-12-29 13:13:34Z kredel $
003 */
004
005 package edu.jas.ufd;
006
007
008 import java.util.SortedMap;
009
010 import junit.framework.Test;
011 import junit.framework.TestCase;
012 import junit.framework.TestSuite;
013
014 import edu.jas.arith.BigRational;
015 import edu.jas.kern.ComputerThreads;
016 import edu.jas.poly.ExpVector;
017 import edu.jas.poly.GenPolynomial;
018 import edu.jas.poly.GenPolynomialRing;
019 import edu.jas.poly.PolyUtil;
020 import edu.jas.poly.TermOrder;
021
022
023 /**
024 * Squarefree factorization tests with JUnit.
025 * @author Heinz Kredel.
026 */
027
028 public class SquarefreeRatTest extends TestCase {
029
030
031 /**
032 * main.
033 */
034 public static void main(String[] args) {
035 //BasicConfigurator.configure();
036 junit.textui.TestRunner.run(suite());
037 ComputerThreads.terminate();
038 }
039
040
041 /**
042 * Constructs a <CODE>SquarefreeRatTest</CODE> object.
043 * @param name String.
044 */
045 public SquarefreeRatTest(String name) {
046 super(name);
047 }
048
049
050 /**
051 */
052 public static Test suite() {
053 TestSuite suite = new TestSuite(SquarefreeRatTest.class);
054 return suite;
055 }
056
057
058 TermOrder to = new TermOrder(TermOrder.INVLEX);
059
060
061 int rl = 3;
062
063
064 int kl = 3;
065
066
067 int ll = 4;
068
069
070 int el = 3;
071
072
073 float q = 0.25f;
074
075
076 String[] vars;
077
078
079 String[] cvars;
080
081
082 String[] c1vars;
083
084
085 String[] rvars;
086
087
088 BigRational fac;
089
090
091 GreatestCommonDivisorAbstract<BigRational> ufd;
092
093
094 SquarefreeFieldChar0<BigRational> sqf;
095
096
097 GenPolynomialRing<BigRational> dfac;
098
099
100 GenPolynomial<BigRational> a;
101
102
103 GenPolynomial<BigRational> b;
104
105
106 GenPolynomial<BigRational> c;
107
108
109 GenPolynomial<BigRational> d;
110
111
112 GenPolynomial<BigRational> e;
113
114
115 GenPolynomialRing<BigRational> cfac;
116
117
118 GenPolynomialRing<GenPolynomial<BigRational>> rfac;
119
120
121 GenPolynomial<GenPolynomial<BigRational>> ar;
122
123
124 GenPolynomial<GenPolynomial<BigRational>> br;
125
126
127 GenPolynomial<GenPolynomial<BigRational>> cr;
128
129
130 GenPolynomial<GenPolynomial<BigRational>> dr;
131
132
133 GenPolynomial<GenPolynomial<BigRational>> er;
134
135
136 @Override
137 protected void setUp() {
138 vars = ExpVector.STDVARS(rl);
139 cvars = ExpVector.STDVARS(rl - 1);
140 c1vars = new String[] { cvars[0] };
141 rvars = new String[] { vars[rl - 1] };
142 fac = new BigRational(1);
143 //ufd = new GreatestCommonDivisorSubres<BigRational>();
144 //ufd = GCDFactory.<BigRational> getImplementation(fac);
145 ufd = GCDFactory.getProxy(fac);
146 sqf = new SquarefreeFieldChar0<BigRational>(fac);
147
148 SquarefreeAbstract<BigRational> sqff = SquarefreeFactory.getImplementation(fac);
149 //System.out.println("sqf = " + sqf);
150 //System.out.println("sqff = " + sqff);
151 assertEquals("sqf == sqff ", sqf.getClass(), sqff.getClass());
152
153 a = b = c = d = e = null;
154 ar = br = cr = dr = er = null;
155 }
156
157
158 @Override
159 protected void tearDown() {
160 a = b = c = d = e = null;
161 ar = br = cr = dr = er = null;
162 // ComputerThreads.terminate();
163 }
164
165
166 /**
167 * Test base squarefree.
168 *
169 */
170 public void testBaseSquarefree() {
171 //System.out.println("\nbase:");
172
173 dfac = new GenPolynomialRing<BigRational>(fac, 1, to, rvars);
174
175 a = dfac.random(kl, ll, el + 2, q);
176 b = dfac.random(kl, ll, el + 2, q);
177 c = dfac.random(kl, ll, el, q);
178 //System.out.println("a = " + a);
179 //System.out.println("b = " + b);
180 //System.out.println("c = " + c);
181
182 if (a.isZERO() || b.isZERO() || c.isZERO()) {
183 // skip for this turn
184 return;
185 }
186
187 // a a b b b c
188 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
189 c = a.multiply(b).multiply(c);
190 //System.out.println("d = " + d);
191 //System.out.println("c = " + c);
192
193 c = sqf.baseSquarefreePart(c);
194 d = sqf.baseSquarefreePart(d);
195 //System.out.println("d = " + d);
196 //System.out.println("c = " + c);
197 assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
198 assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
199
200 e = PolyUtil.<BigRational> basePseudoRemainder(d, c);
201 //System.out.println("e = " + e);
202 assertTrue("squarefree(abc) | squarefree(aabbbc) " + e, e.isZERO());
203 }
204
205
206 /**
207 * Test base squarefree factors.
208 *
209 */
210 public void testBaseSquarefreeFactors() {
211
212 dfac = new GenPolynomialRing<BigRational>(fac, 1, to, rvars);
213
214 a = dfac.random(kl, ll, el + 3, q);
215 b = dfac.random(kl, ll, el + 3, q);
216 c = dfac.random(kl, ll, el + 2, q);
217 //System.out.println("a = " + a);
218 //System.out.println("b = " + b);
219 //System.out.println("c = " + c);
220
221 if (a.isZERO() || b.isZERO() || c.isZERO()) {
222 // skip for this turn
223 return;
224 }
225
226 // a a b b b c
227 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
228 //System.out.println("d = " + d);
229
230 SortedMap<GenPolynomial<BigRational>, Long> sfactors;
231 sfactors = sqf.baseSquarefreeFactors(d);
232 //System.out.println("sfactors = " + sfactors);
233
234 assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
235 }
236
237
238 /**
239 * Test recursive squarefree.
240 *
241 */
242 public void testRecursiveSquarefree() {
243 //System.out.println("\nrecursive:");
244
245 cfac = new GenPolynomialRing<BigRational>(fac, 2 - 1, to, c1vars);
246 rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(cfac, 1, to, rvars);
247
248 ar = rfac.random(kl, ll, el, q);
249 br = rfac.random(kl, ll, el, q);
250 cr = rfac.random(kl, ll, el, q);
251 //System.out.println("ar = " + ar);
252 //System.out.println("br = " + br);
253 //System.out.println("cr = " + cr);
254
255 if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
256 // skip for this turn
257 return;
258 }
259
260 dr = ar.multiply(ar).multiply(br).multiply(br);
261 cr = ar.multiply(br);
262 //System.out.println("dr = " + dr);
263 //System.out.println("cr = " + cr);
264
265 cr = sqf.recursiveUnivariateSquarefreePart(cr);
266 dr = sqf.recursiveUnivariateSquarefreePart(dr);
267 //System.out.println("dr = " + dr);
268 //System.out.println("cr = " + cr);
269 assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr));
270 assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr));
271
272 er = PolyUtil.<BigRational> recursivePseudoRemainder(dr, cr);
273 //System.out.println("er = " + er);
274 assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO());
275 }
276
277
278 /**
279 * Test recursive squarefree factors.
280 *
281 */
282 public void testRecursiveSquarefreeFactors() {
283
284 cfac = new GenPolynomialRing<BigRational>(fac, 2 - 1, to, c1vars);
285 rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(cfac, 1, to, rvars);
286
287 ar = rfac.random(kl, 3, 2, q);
288 br = rfac.random(kl, 3, 2, q);
289 cr = rfac.random(kl, 3, 2, q);
290 //System.out.println("ar = " + ar);
291 //System.out.println("br = " + br);
292 //System.out.println("cr = " + cr);
293
294 if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
295 // skip for this turn
296 return;
297 }
298
299 dr = ar.multiply(cr).multiply(br).multiply(br);
300 //System.out.println("dr = " + dr);
301
302 SortedMap<GenPolynomial<GenPolynomial<BigRational>>, Long> sfactors;
303 sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr);
304 //System.out.println("sfactors = " + sfactors);
305 assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors));
306 }
307
308
309 /**
310 * Test squarefree.
311 *
312 */
313 public void testSquarefree() {
314 //System.out.println("\nfull:");
315
316 dfac = new GenPolynomialRing<BigRational>(fac, rl, to, vars);
317
318 a = dfac.random(kl, ll, 2, q);
319 b = dfac.random(kl, ll, 2, q);
320 c = dfac.random(kl, ll, 2, q);
321 //System.out.println("a = " + a);
322 //System.out.println("b = " + b);
323 //System.out.println("c = " + c);
324
325 if (a.isZERO() || b.isZERO() || c.isZERO()) {
326 // skip for this turn
327 return;
328 }
329
330 d = a.multiply(a).multiply(b).multiply(b).multiply(c);
331 c = a.multiply(b).multiply(c);
332 //System.out.println("d = " + d);
333 //System.out.println("c = " + c);
334
335 c = sqf.squarefreePart(c);
336 d = sqf.squarefreePart(d);
337 //System.out.println("c = " + c);
338 //System.out.println("d = " + d);
339 assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
340 assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
341
342 e = PolyUtil.<BigRational> basePseudoRemainder(d, c);
343 //System.out.println("e = " + e);
344 assertTrue("squarefree(abc) | squarefree(aabbc) " + e, e.isZERO());
345 }
346
347
348 /**
349 * Test squarefree factors.
350 *
351 */
352 public void testSquarefreeFactors() {
353
354 dfac = new GenPolynomialRing<BigRational>(fac, rl, to, vars);
355
356 a = dfac.random(kl, 3, 2, q);
357 b = dfac.random(kl, 3, 2, q);
358 c = dfac.random(kl, 3, 2, q);
359 //System.out.println("a = " + a);
360 //System.out.println("b = " + b);
361 //System.out.println("c = " + c);
362
363 if (a.isZERO() || b.isZERO() || c.isZERO()) {
364 // skip for this turn
365 return;
366 }
367
368 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
369 //System.out.println("d = " + d);
370
371 SortedMap<GenPolynomial<BigRational>, Long> sfactors;
372 sfactors = sqf.squarefreeFactors(d);
373 //System.out.println("sfactors = " + sfactors);
374 assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
375 }
376
377 }