001/*
002 * $Id$
003 */
004
005package edu.jas.ufd;
006
007
008import java.util.SortedMap;
009
010import edu.jas.arith.BigInteger;
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 BigInteger coefficients tests with JUnit.
025 * @author Heinz Kredel
026 */
027
028public class SquarefreeIntTest 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>SquarefreeIntTest</CODE> object.
042     * @param name String.
043     */
044    public SquarefreeIntTest(String name) {
045        super(name);
046    }
047
048
049    /**
050     */
051    public static Test suite() {
052        TestSuite suite = new TestSuite(SquarefreeIntTest.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 = 7;
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    BigInteger fac;
088
089
090    GreatestCommonDivisorAbstract<BigInteger> ufd;
091
092
093    SquarefreeRingChar0<BigInteger> sqf;
094
095
096    GenPolynomialRing<BigInteger> dfac;
097
098
099    GenPolynomial<BigInteger> a, b, c, d, e;
100
101
102    GenPolynomialRing<BigInteger> cfac;
103
104
105    GenPolynomialRing<GenPolynomial<BigInteger>> rfac;
106
107
108    GenPolynomial<GenPolynomial<BigInteger>> 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
118        fac = new BigInteger(1);
119
120        //ufd = new GreatestCommonDivisorSubres<BigInteger>();
121        //ufd = GCDFactory.<BigInteger> getImplementation(fac);
122        ufd = GCDFactory.getProxy(fac);
123
124        sqf = new SquarefreeRingChar0<BigInteger>(fac);
125
126        SquarefreeAbstract<BigInteger> sqff = SquarefreeFactory.getImplementation(fac);
127        //System.out.println("sqf  = " + sqf);
128        //System.out.println("sqff = " + sqff);
129        assertEquals("sqf == sqff ", sqf.getClass(), sqff.getClass());
130
131        a = b = c = d = e = null;
132        ar = br = cr = dr = er = null;
133    }
134
135
136    @Override
137    protected void tearDown() {
138        a = b = c = d = e = null;
139        ar = br = cr = dr = er = null;
140        //ComputerThreads.terminate();
141    }
142
143
144    /**
145     * Test base squarefree part.
146     */
147    public void testBaseSquarefreePart() {
148        //System.out.println("\nbase:");
149        dfac = new GenPolynomialRing<BigInteger>(fac, 1, to, rvars);
150
151        a = dfac.random(kl, ll, el + 2, q);
152        b = dfac.random(kl, ll, el + 2, q);
153        c = dfac.random(kl, ll, el, q);
154        //System.out.println("a  = " + a);
155        //System.out.println("b  = " + b);
156        //System.out.println("c  = " + c);
157
158        if (a.isZERO() || b.isZERO() || c.isZERO()) {
159            // skip for this turn
160            return;
161        }
162
163        // a a b b b c
164        d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
165        c = a.multiply(b).multiply(c);
166        //System.out.println("d  = " + d);
167        //System.out.println("c  = " + c);
168
169        c = sqf.baseSquarefreePart(c);
170        d = sqf.baseSquarefreePart(d);
171        //System.out.println("d  = " + d);
172        //System.out.println("c  = " + c);
173        assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
174        assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
175
176        e = PolyUtil.<BigInteger> baseSparsePseudoRemainder(d, c);
177        //System.out.println("e  = " + e);
178        assertTrue("squarefree(abc) | squarefree(aabbbc) " + e, e.isZERO());
179    }
180
181
182    /**
183     * Test base squarefree factors.
184     */
185    public void testBaseSquarefreeFactors() {
186        dfac = new GenPolynomialRing<BigInteger>(fac, 1, to, rvars);
187
188        a = dfac.random(kl, ll, el + 3, q);
189        b = dfac.random(kl, ll, el + 3, q);
190        c = dfac.random(kl, ll, el + 2, q);
191        //System.out.println("a  = " + a);
192        //System.out.println("b  = " + b);
193        //System.out.println("c  = " + c);
194
195        if (a.isZERO() || b.isZERO() || c.isZERO()) {
196            // skip for this turn
197            return;
198        }
199
200        // a a b b b c
201        d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
202        //System.out.println("d  = " + d);
203
204        SortedMap<GenPolynomial<BigInteger>, Long> sfactors;
205        sfactors = sqf.baseSquarefreeFactors(d);
206        //System.out.println("sfactors = " + sfactors);
207
208        assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
209    }
210
211
212    /**
213     * Test recursive squarefree part.
214     */
215    public void testRecursiveSquarefreePart() {
216        //System.out.println("\nrecursive:");
217        cfac = new GenPolynomialRing<BigInteger>(fac, 2 - 1, to, c1vars);
218        rfac = new GenPolynomialRing<GenPolynomial<BigInteger>>(cfac, 1, to, rvars);
219
220        ar = rfac.random(kl, ll, el, q);
221        br = rfac.random(kl, ll, el, q);
222        cr = rfac.random(kl, ll, el, q);
223        //System.out.println("ar = " + ar);
224        //System.out.println("br = " + br);
225        //System.out.println("cr = " + cr);
226
227        if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
228            // skip for this turn
229            return;
230        }
231
232        dr = ar.multiply(ar).multiply(br).multiply(br);
233        cr = ar.multiply(br);
234        //System.out.println("dr  = " + dr);
235        //System.out.println("cr  = " + cr);
236
237        cr = sqf.recursiveUnivariateSquarefreePart(cr);
238        dr = sqf.recursiveUnivariateSquarefreePart(dr);
239        //System.out.println("dr  = " + dr);
240        //System.out.println("cr  = " + cr);
241        assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr));
242        assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr));
243
244        er = PolyUtil.<BigInteger> recursiveSparsePseudoRemainder(dr, cr);
245        //System.out.println("er  = " + er);
246        assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO());
247    }
248
249
250    /**
251     * Test recursive squarefree factors.
252     */
253    public void testRecursiveSquarefreeFactors() {
254        cfac = new GenPolynomialRing<BigInteger>(fac, 2 - 1, to, c1vars);
255        rfac = new GenPolynomialRing<GenPolynomial<BigInteger>>(cfac, 1, to, rvars);
256
257        ar = rfac.random(kl, 3, 2, q);
258        br = rfac.random(kl, 3, 2, q);
259        cr = rfac.random(kl, 3, 2, q);
260        //System.out.println("ar = " + ar);
261        //System.out.println("br = " + br);
262        //System.out.println("cr = " + cr);
263
264        if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
265            // skip for this turn
266            return;
267        }
268
269        dr = ar.multiply(cr).multiply(br).multiply(br);
270        //System.out.println("dr  = " + dr);
271
272        SortedMap<GenPolynomial<GenPolynomial<BigInteger>>, Long> sfactors;
273        sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr);
274        //System.out.println("sfactors = " + sfactors);
275
276        assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors));
277    }
278
279
280    /**
281     * Test squarefree part.
282     */
283    public void testSquarefreePart() {
284        //System.out.println("\nfull:");
285        dfac = new GenPolynomialRing<BigInteger>(fac, rl, to, vars);
286
287        a = dfac.random(kl, ll, 2, q);
288        b = dfac.random(kl, ll, 2, q);
289        c = dfac.random(kl, ll, 2, q);
290        //System.out.println("a  = " + a);
291        //System.out.println("b  = " + b);
292        //System.out.println("c  = " + c);
293
294        if (a.isZERO() || b.isZERO() || c.isZERO()) {
295            // skip for this turn
296            return;
297        }
298
299        d = a.multiply(a).multiply(b).multiply(b).multiply(c);
300        c = a.multiply(b).multiply(c);
301        //System.out.println("d  = " + d);
302        //System.out.println("c  = " + c);
303
304        c = sqf.squarefreePart(c);
305        d = sqf.squarefreePart(d);
306        //System.out.println("c  = " + c);
307        //System.out.println("d  = " + d);
308        assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
309        assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
310
311        e = PolyUtil.<BigInteger> baseSparsePseudoRemainder(d, c);
312        //System.out.println("e  = " + e);
313        assertTrue("squarefree(abc) | squarefree(aabbc) " + e, e.isZERO());
314    }
315
316
317    /**
318     * Test squarefree factors.
319     */
320    public void testSquarefreeFactors() {
321        dfac = new GenPolynomialRing<BigInteger>(fac, rl, to, vars);
322
323        a = dfac.random(kl, 3, 2, q);
324        b = dfac.random(kl, 3, 2, q);
325        c = dfac.random(kl, 3, 2, q);
326        //System.out.println("a  = " + a);
327        //System.out.println("b  = " + b);
328        //System.out.println("c  = " + c);
329
330        if (a.isZERO() || b.isZERO() || c.isZERO()) {
331            // skip for this turn
332            return;
333        }
334
335        d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
336        //System.out.println("d  = " + d);
337
338        SortedMap<GenPolynomial<BigInteger>, Long> sfactors;
339        sfactors = sqf.squarefreeFactors(d);
340        //System.out.println("sfactors = " + sfactors);
341
342        assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
343    }
344
345}