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;
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
123        SquarefreeAbstract<BigRational> sqff = SquarefreeFactory.getImplementation(fac);
124        //System.out.println("sqf  = " + sqf);
125        //System.out.println("sqff = " + sqff);
126        assertEquals("sqf == sqff ", sqf.getClass(), sqff.getClass());
127
128        a = b = c = d = e = null;
129        ar = br = cr = dr = er = null;
130    }
131
132
133    @Override
134    protected void tearDown() {
135        a = b = c = d = e = null;
136        ar = br = cr = dr = er = null;
137        // ComputerThreads.terminate();
138    }
139
140
141    /**
142     * Test base squarefree.
143     * 
144     */
145    public void testBaseSquarefree() {
146        //System.out.println("\nbase:");
147
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
157        if (a.isZERO() || b.isZERO() || c.isZERO()) {
158            // skip for this turn
159            return;
160        }
161
162        // a a b b b c
163        d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
164        c = a.multiply(b).multiply(c);
165        //System.out.println("d  = " + d);
166        //System.out.println("c  = " + c);
167
168        c = sqf.baseSquarefreePart(c);
169        d = sqf.baseSquarefreePart(d);
170        //System.out.println("d  = " + d);
171        //System.out.println("c  = " + c);
172        assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
173        assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
174
175        e = PolyUtil.<BigRational> baseSparsePseudoRemainder(d, c);
176        //System.out.println("e  = " + e);
177        assertTrue("squarefree(abc) | squarefree(aabbbc) " + e, e.isZERO());
178    }
179
180
181    /**
182     * Test base squarefree factors.
183     * 
184     */
185    public void testBaseSquarefreeFactors() {
186
187        dfac = new GenPolynomialRing<BigRational>(fac, 1, to, rvars);
188
189        a = dfac.random(kl, ll, el + 3, q);
190        b = dfac.random(kl, ll, el + 3, q);
191        c = dfac.random(kl, ll, el + 2, q);
192        //System.out.println("a  = " + a);
193        //System.out.println("b  = " + b);
194        //System.out.println("c  = " + c);
195
196        if (a.isZERO() || b.isZERO() || c.isZERO()) {
197            // skip for this turn
198            return;
199        }
200
201        // a a b b b c
202        d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
203        //System.out.println("d  = " + d);
204
205        SortedMap<GenPolynomial<BigRational>, Long> sfactors;
206        sfactors = sqf.baseSquarefreeFactors(d);
207        //System.out.println("sfactors = " + sfactors);
208
209        assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
210    }
211
212
213    /**
214     * Test recursive squarefree.
215     * 
216     */
217    public void testRecursiveSquarefree() {
218        //System.out.println("\nrecursive:");
219
220        cfac = new GenPolynomialRing<BigRational>(fac, 2 - 1, to, c1vars);
221        rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(cfac, 1, to, rvars);
222
223        ar = rfac.random(kl, ll, el, q);
224        br = rfac.random(kl, ll, el, q);
225        cr = rfac.random(kl, ll, el, q);
226        //System.out.println("ar = " + ar);
227        //System.out.println("br = " + br);
228        //System.out.println("cr = " + cr);
229
230        if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
231            // skip for this turn
232            return;
233        }
234
235        dr = ar.multiply(ar).multiply(br).multiply(br);
236        cr = ar.multiply(br);
237        //System.out.println("dr  = " + dr);
238        //System.out.println("cr  = " + cr);
239
240        cr = sqf.recursiveUnivariateSquarefreePart(cr);
241        dr = sqf.recursiveUnivariateSquarefreePart(dr);
242        //System.out.println("dr  = " + dr);
243        //System.out.println("cr  = " + cr);
244        assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr));
245        assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr));
246
247        er = PolyUtil.<BigRational> recursiveSparsePseudoRemainder(dr, cr);
248        //System.out.println("er  = " + er);
249        assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO());
250    }
251
252
253    /**
254     * Test recursive squarefree factors.
255     * 
256     */
257    public void testRecursiveSquarefreeFactors() {
258
259        cfac = new GenPolynomialRing<BigRational>(fac, 2 - 1, to, c1vars);
260        rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(cfac, 1, to, rvars);
261
262        ar = rfac.random(kl, 3, 2, q);
263        br = rfac.random(kl, 3, 2, q);
264        cr = rfac.random(kl, 3, 2, q);
265        //System.out.println("ar = " + ar);
266        //System.out.println("br = " + br);
267        //System.out.println("cr = " + cr);
268
269        if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
270            // skip for this turn
271            return;
272        }
273
274        dr = ar.multiply(cr).multiply(br).multiply(br);
275        //System.out.println("dr  = " + dr);
276
277        SortedMap<GenPolynomial<GenPolynomial<BigRational>>, Long> sfactors;
278        sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr);
279        //System.out.println("sfactors = " + sfactors);
280        assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors));
281    }
282
283
284    /**
285     * Test squarefree.
286     * 
287     */
288    public void testSquarefree() {
289        //System.out.println("\nfull:");
290
291        dfac = new GenPolynomialRing<BigRational>(fac, rl, to, vars);
292
293        a = dfac.random(kl, ll, 2, q);
294        b = dfac.random(kl, ll, 2, q);
295        c = dfac.random(kl, ll, 2, q);
296        //System.out.println("a  = " + a);
297        //System.out.println("b  = " + b);
298        //System.out.println("c  = " + c);
299
300        if (a.isZERO() || b.isZERO() || c.isZERO()) {
301            // skip for this turn
302            return;
303        }
304
305        d = a.multiply(a).multiply(b).multiply(b).multiply(c);
306        c = a.multiply(b).multiply(c);
307        //System.out.println("d  = " + d);
308        //System.out.println("c  = " + c);
309
310        c = sqf.squarefreePart(c);
311        d = sqf.squarefreePart(d);
312        //System.out.println("c  = " + c);
313        //System.out.println("d  = " + d);
314        assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
315        assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
316
317        e = PolyUtil.<BigRational> baseSparsePseudoRemainder(d, c);
318        //System.out.println("e  = " + e);
319        assertTrue("squarefree(abc) | squarefree(aabbc) " + e, e.isZERO());
320    }
321
322
323    /**
324     * Test squarefree factors.
325     * 
326     */
327    public void testSquarefreeFactors() {
328
329        dfac = new GenPolynomialRing<BigRational>(fac, rl, to, vars);
330
331        a = dfac.random(kl, 3, 2, q);
332        b = dfac.random(kl, 3, 2, q);
333        c = dfac.random(kl, 3, 2, q);
334        //System.out.println("a  = " + a);
335        //System.out.println("b  = " + b);
336        //System.out.println("c  = " + c);
337
338        if (a.isZERO() || b.isZERO() || c.isZERO()) {
339            // skip for this turn
340            return;
341        }
342
343        d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
344        //System.out.println("d  = " + d);
345
346        SortedMap<GenPolynomial<BigRational>, Long> sfactors;
347        sfactors = sqf.squarefreeFactors(d);
348        //System.out.println("sfactors = " + sfactors);
349        assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
350    }
351
352}