001/*
002 * $Id: SquarefreeIntTest.java 5863 2018-07-20 11:13:34Z kredel $
003 */
004
005package edu.jas.ufd;
006
007
008import java.util.SortedMap;
009
010import junit.framework.Test;
011import junit.framework.TestCase;
012import junit.framework.TestSuite;
013
014import edu.jas.arith.BigInteger;
015import edu.jas.kern.ComputerThreads;
016import edu.jas.poly.ExpVector;
017import edu.jas.poly.GenPolynomial;
018import edu.jas.poly.GenPolynomialRing;
019import edu.jas.poly.PolyUtil;
020import edu.jas.poly.TermOrder;
021
022
023/**
024 * Squarefree factorization 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;
100
101
102    GenPolynomial<BigInteger> b;
103
104
105    GenPolynomial<BigInteger> c;
106
107
108    GenPolynomial<BigInteger> d;
109
110
111    GenPolynomial<BigInteger> e;
112
113
114    GenPolynomialRing<BigInteger> cfac;
115
116
117    GenPolynomialRing<GenPolynomial<BigInteger>> rfac;
118
119
120    GenPolynomial<GenPolynomial<BigInteger>> ar;
121
122
123    GenPolynomial<GenPolynomial<BigInteger>> br;
124
125
126    GenPolynomial<GenPolynomial<BigInteger>> cr;
127
128
129    GenPolynomial<GenPolynomial<BigInteger>> dr;
130
131
132    GenPolynomial<GenPolynomial<BigInteger>> er;
133
134
135    @Override
136    protected void setUp() {
137        vars = ExpVector.STDVARS(rl);
138        cvars = ExpVector.STDVARS(rl - 1);
139        c1vars = new String[] { cvars[0] };
140        rvars = new String[] { vars[rl - 1] };
141
142        fac = new BigInteger(1);
143
144        //ufd = new GreatestCommonDivisorSubres<BigInteger>();
145        //ufd = GCDFactory.<BigInteger> getImplementation(fac);
146        ufd = GCDFactory.getProxy(fac);
147
148        sqf = new SquarefreeRingChar0<BigInteger>(fac);
149
150        SquarefreeAbstract<BigInteger> sqff = SquarefreeFactory.getImplementation(fac);
151        //System.out.println("sqf  = " + sqf);
152        //System.out.println("sqff = " + sqff);
153        assertEquals("sqf == sqff ", sqf.getClass(), sqff.getClass());
154
155        a = b = c = d = e = null;
156        ar = br = cr = dr = er = null;
157    }
158
159
160    @Override
161    protected void tearDown() {
162        a = b = c = d = e = null;
163        ar = br = cr = dr = er = null;
164        //ComputerThreads.terminate();
165    }
166
167
168    /**
169     * Test base squarefree.
170     * 
171     */
172    public void testBaseSquarefree() {
173        //System.out.println("\nbase:");
174
175        dfac = new GenPolynomialRing<BigInteger>(fac, 1, to, rvars);
176
177        a = dfac.random(kl, ll, el + 2, q);
178        b = dfac.random(kl, ll, el + 2, q);
179        c = dfac.random(kl, ll, el, q);
180        //System.out.println("a  = " + a);
181        //System.out.println("b  = " + b);
182        //System.out.println("c  = " + c);
183
184        if (a.isZERO() || b.isZERO() || c.isZERO()) {
185            // skip for this turn
186            return;
187        }
188
189        // a a b b b c
190        d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
191        c = a.multiply(b).multiply(c);
192        //System.out.println("d  = " + d);
193        //System.out.println("c  = " + c);
194
195        c = sqf.baseSquarefreePart(c);
196        d = sqf.baseSquarefreePart(d);
197        //System.out.println("d  = " + d);
198        //System.out.println("c  = " + c);
199        assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
200        assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
201
202        e = PolyUtil.<BigInteger> basePseudoRemainder(d, c);
203        //System.out.println("e  = " + e);
204        assertTrue("squarefree(abc) | squarefree(aabbbc) " + e, e.isZERO());
205    }
206
207
208    /**
209     * Test base squarefree factors.
210     * 
211     */
212    public void testBaseSquarefreeFactors() {
213
214        dfac = new GenPolynomialRing<BigInteger>(fac, 1, to, rvars);
215
216        a = dfac.random(kl, ll, el + 3, q);
217        b = dfac.random(kl, ll, el + 3, q);
218        c = dfac.random(kl, ll, el + 2, q);
219        //System.out.println("a  = " + a);
220        //System.out.println("b  = " + b);
221        //System.out.println("c  = " + c);
222
223        if (a.isZERO() || b.isZERO() || c.isZERO()) {
224            // skip for this turn
225            return;
226        }
227
228        // a a b b b c
229        d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
230        //System.out.println("d  = " + d);
231
232        SortedMap<GenPolynomial<BigInteger>, Long> sfactors;
233        sfactors = sqf.baseSquarefreeFactors(d);
234        //System.out.println("sfactors = " + sfactors);
235
236        assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
237    }
238
239
240    /**
241     * Test recursive squarefree.
242     * 
243     */
244    public void testRecursiveSquarefree() {
245        //System.out.println("\nrecursive:");
246
247        cfac = new GenPolynomialRing<BigInteger>(fac, 2 - 1, to, c1vars);
248        rfac = new GenPolynomialRing<GenPolynomial<BigInteger>>(cfac, 1, to, rvars);
249
250        ar = rfac.random(kl, ll, el, q);
251        br = rfac.random(kl, ll, el, q);
252        cr = rfac.random(kl, ll, el, q);
253        //System.out.println("ar = " + ar);
254        //System.out.println("br = " + br);
255        //System.out.println("cr = " + cr);
256
257        if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
258            // skip for this turn
259            return;
260        }
261
262        dr = ar.multiply(ar).multiply(br).multiply(br);
263        cr = ar.multiply(br);
264        //System.out.println("dr  = " + dr);
265        //System.out.println("cr  = " + cr);
266
267        cr = sqf.recursiveUnivariateSquarefreePart(cr);
268        dr = sqf.recursiveUnivariateSquarefreePart(dr);
269        //System.out.println("dr  = " + dr);
270        //System.out.println("cr  = " + cr);
271        assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr));
272        assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr));
273
274        er = PolyUtil.<BigInteger> recursivePseudoRemainder(dr, cr);
275        //System.out.println("er  = " + er);
276        assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO());
277    }
278
279
280    /**
281     * Test recursive squarefree factors.
282     * 
283     */
284    public void testRecursiveSquarefreeFactors() {
285
286        cfac = new GenPolynomialRing<BigInteger>(fac, 2 - 1, to, c1vars);
287        rfac = new GenPolynomialRing<GenPolynomial<BigInteger>>(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
296        if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
297            // skip for this turn
298            return;
299        }
300
301        dr = ar.multiply(cr).multiply(br).multiply(br);
302        //System.out.println("dr  = " + dr);
303
304        SortedMap<GenPolynomial<GenPolynomial<BigInteger>>, Long> sfactors;
305        sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr);
306        //System.out.println("sfactors = " + sfactors);
307
308        assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors));
309    }
310
311
312    /**
313     * Test squarefree.
314     * 
315     */
316    public void testSquarefree() {
317        //System.out.println("\nfull:");
318
319        dfac = new GenPolynomialRing<BigInteger>(fac, rl, to, vars);
320
321        a = dfac.random(kl, ll, 2, q);
322        b = dfac.random(kl, ll, 2, q);
323        c = dfac.random(kl, ll, 2, q);
324        //System.out.println("a  = " + a);
325        //System.out.println("b  = " + b);
326        //System.out.println("c  = " + c);
327
328        if (a.isZERO() || b.isZERO() || c.isZERO()) {
329            // skip for this turn
330            return;
331        }
332
333        d = a.multiply(a).multiply(b).multiply(b).multiply(c);
334        c = a.multiply(b).multiply(c);
335        //System.out.println("d  = " + d);
336        //System.out.println("c  = " + c);
337
338        c = sqf.squarefreePart(c);
339        d = sqf.squarefreePart(d);
340        //System.out.println("c  = " + c);
341        //System.out.println("d  = " + d);
342        assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
343        assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
344
345        e = PolyUtil.<BigInteger> basePseudoRemainder(d, c);
346        //System.out.println("e  = " + e);
347        assertTrue("squarefree(abc) | squarefree(aabbc) " + e, e.isZERO());
348    }
349
350
351    /**
352     * Test squarefree factors.
353     * 
354     */
355    public void testSquarefreeFactors() {
356
357        dfac = new GenPolynomialRing<BigInteger>(fac, rl, to, vars);
358
359        a = dfac.random(kl, 3, 2, q);
360        b = dfac.random(kl, 3, 2, q);
361        c = dfac.random(kl, 3, 2, q);
362        //System.out.println("a  = " + a);
363        //System.out.println("b  = " + b);
364        //System.out.println("c  = " + c);
365
366        if (a.isZERO() || b.isZERO() || c.isZERO()) {
367            // skip for this turn
368            return;
369        }
370
371        d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
372        //System.out.println("d  = " + d);
373
374        SortedMap<GenPolynomial<BigInteger>, Long> sfactors;
375        sfactors = sqf.squarefreeFactors(d);
376        //System.out.println("sfactors = " + sfactors);
377
378        assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
379    }
380
381}