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