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