001/*
002 * $Id$
003 */
004
005package edu.jas.ufd;
006
007
008import java.util.SortedMap;
009
010import edu.jas.arith.ModInteger;
011import edu.jas.arith.ModIntegerRing;
012import edu.jas.kern.ComputerThreads;
013import edu.jas.poly.ExpVector;
014import edu.jas.poly.GenPolynomial;
015import edu.jas.poly.GenPolynomialRing;
016import edu.jas.poly.PolyUtil;
017import edu.jas.poly.TermOrder;
018import edu.jas.structure.Power;
019
020import junit.framework.Test;
021import junit.framework.TestCase;
022import junit.framework.TestSuite;
023
024
025/**
026 * Squarefree factorization ModInteger coefficients tests with JUnit.
027 * @author Heinz Kredel
028 */
029
030public class SquarefreeModTest extends TestCase {
031
032
033    /**
034     * main.
035     */
036    public static void main(String[] args) {
037        junit.textui.TestRunner.run(suite());
038        ComputerThreads.terminate();
039    }
040
041
042    /**
043     * Constructs a <CODE>SquarefreeModTest</CODE> object.
044     * @param name String.
045     */
046    public SquarefreeModTest(String name) {
047        super(name);
048    }
049
050
051    /**
052     */
053    public static Test suite() {
054        TestSuite suite = new TestSuite(SquarefreeModTest.class);
055        return suite;
056    }
057
058
059    TermOrder to = new TermOrder(TermOrder.INVLEX);
060
061
062    int rl = 3;
063
064
065    int kl = 3;
066
067
068    int ll = 4;
069
070
071    int el = 3;
072
073
074    float q = 0.25f;
075
076
077    String[] vars;
078
079
080    String[] cvars;
081
082
083    String[] c1vars;
084
085
086    String[] rvars;
087
088
089    ModIntegerRing fac;
090
091
092    GreatestCommonDivisorAbstract<ModInteger> ufd;
093
094
095    SquarefreeFiniteFieldCharP<ModInteger> sqf;
096
097
098    GenPolynomialRing<ModInteger> dfac;
099
100
101    GenPolynomial<ModInteger> a, b, c, d, e;
102
103
104    GenPolynomialRing<ModInteger> cfac;
105
106
107    GenPolynomialRing<GenPolynomial<ModInteger>> rfac;
108
109
110    GenPolynomial<GenPolynomial<ModInteger>> ar, br, cr, dr, er;
111
112
113    @Override
114    protected void setUp() {
115        vars = ExpVector.STDVARS(rl);
116        cvars = ExpVector.STDVARS(rl - 1);
117        c1vars = new String[] { cvars[0] };
118        rvars = new String[] { vars[rl - 1] };
119
120        fac = new ModIntegerRing(11);
121        //ufd = new GreatestCommonDivisorSubres<ModInteger>();
122        //ufd = GCDFactory.<ModInteger> getImplementation(fac);
123        ufd = GCDFactory.getProxy(fac);
124        sqf = new SquarefreeFiniteFieldCharP<ModInteger>(fac);
125
126        a = b = c = d = e = null;
127        ar = br = cr = dr = er = null;
128    }
129
130
131    @Override
132    protected void tearDown() {
133        a = b = c = d = e = null;
134        ar = br = cr = dr = er = null;
135        //ComputerThreads.terminate();
136    }
137
138
139    /**
140     * Test base squarefree.
141     */
142    public void testBaseSquarefree() {
143        //System.out.println("\nbase:");
144        dfac = new GenPolynomialRing<ModInteger>(fac, 1, to, rvars);
145
146        a = dfac.random(kl, ll, el + 2, q);
147        b = dfac.random(kl, ll, el + 2, q);
148        c = dfac.random(kl, ll, el, q);
149        //System.out.println("a  = " + a);
150        //System.out.println("b  = " + b);
151        //System.out.println("c  = " + c);
152
153        if (a.isZERO() || b.isZERO() || c.isZERO()) {
154            // skip for this turn
155            return;
156        }
157
158        // a a b b b c
159        d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
160        c = a.multiply(b).multiply(c);
161        //System.out.println("c  = " + c);
162        //System.out.println("d  = " + d);
163
164        c = sqf.baseSquarefreePart(c);
165        d = sqf.baseSquarefreePart(d);
166        //System.out.println("c  = " + c);
167        //System.out.println("d  = " + d);
168        assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
169        assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
170
171        e = PolyUtil.<ModInteger> baseSparsePseudoRemainder(d, c);
172        //System.out.println("e  = " + e);
173        assertTrue("squarefree(abc) | squarefree(aabbbc) " + e, e.isZERO());
174    }
175
176
177    /**
178     * Test base squarefree factors.
179     */
180    public void testBaseSquarefreeFactors() {
181        dfac = new GenPolynomialRing<ModInteger>(fac, 1, to, rvars);
182
183        a = dfac.random(kl, ll, el + 3, q);
184        b = dfac.random(kl, ll, el + 3, q);
185        c = dfac.random(kl, ll, el + 2, q);
186        //System.out.println("a  = " + a);
187        //System.out.println("b  = " + b);
188        //System.out.println("c  = " + c);
189
190        if (a.isZERO() || b.isZERO() || c.isZERO()) {
191            // skip for this turn
192            return;
193        }
194
195        // a a b b b c
196        d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
197        //System.out.println("d  = " + d);
198
199        SortedMap<GenPolynomial<ModInteger>, Long> sfactors;
200        sfactors = sqf.baseSquarefreeFactors(d);
201        //System.out.println("sfactors = " + sfactors);
202        assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
203    }
204
205
206    /**
207     * Test recursive squarefree.
208     */
209    public void testRecursiveSquarefree() {
210        //System.out.println("\nrecursive:");
211        cfac = new GenPolynomialRing<ModInteger>(fac, 2 - 1, to, c1vars);
212        rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to, rvars);
213
214        ar = rfac.random(kl, ll, el, q);
215        br = rfac.random(kl, ll, el, q);
216        cr = rfac.random(kl, ll, el, q);
217        //System.out.println("ar = " + ar);
218        //System.out.println("br = " + br);
219        //System.out.println("cr = " + cr);
220
221        if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
222            // skip for this turn
223            return;
224        }
225
226        dr = ar.multiply(ar).multiply(br).multiply(br);
227        cr = ar.multiply(br);
228        //System.out.println("cr  = " + cr);
229        //System.out.println("dr  = " + dr);
230
231        cr = sqf.recursiveUnivariateSquarefreePart(cr);
232        dr = sqf.recursiveUnivariateSquarefreePart(dr);
233        //System.out.println("cr  = " + cr);
234        //System.out.println("dr  = " + dr);
235        assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr));
236        assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr));
237
238        er = PolyUtil.<ModInteger> recursiveSparsePseudoRemainder(dr, cr);
239        //System.out.println("er  = " + er);
240        assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO());
241    }
242
243
244    /**
245     * Test recursive squarefree factors.
246     */
247    public void testRecursiveSquarefreeFactors() {
248        cfac = new GenPolynomialRing<ModInteger>(fac, 2 - 1, to, c1vars);
249        rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to, rvars);
250
251        ar = rfac.random(kl, 3, 2, q);
252        br = rfac.random(kl, 3, 2, q);
253        cr = rfac.random(kl, 3, 2, q);
254        //System.out.println("ar = " + ar);
255        //System.out.println("br = " + br);
256        //System.out.println("cr = " + cr);
257
258        if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
259            // skip for this turn
260            return;
261        }
262
263        dr = ar.multiply(cr).multiply(br).multiply(br);
264        //System.out.println("dr  = " + dr);
265
266        SortedMap<GenPolynomial<GenPolynomial<ModInteger>>, Long> sfactors;
267        sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr);
268        //System.out.println("sfactors = " + sfactors);
269        assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors));
270    }
271
272
273    /**
274     * Test squarefree.
275     */
276    public void testSquarefree() {
277        //System.out.println("\nfull:");
278        dfac = new GenPolynomialRing<ModInteger>(fac, rl, to, vars);
279
280        a = dfac.random(kl, ll, 2, q);
281        b = dfac.random(kl, ll, 2, q);
282        c = dfac.random(kl, ll, 2, q);
283        //System.out.println("a  = " + a);
284        //System.out.println("b  = " + b);
285        //System.out.println("c  = " + c);
286
287        if (a.isZERO() || b.isZERO() || c.isZERO()) {
288            // skip for this turn
289            return;
290        }
291
292        d = a.multiply(a).multiply(b).multiply(b).multiply(c);
293        c = a.multiply(b).multiply(c);
294        //System.out.println("c  = " + c);
295        //System.out.println("d  = " + d);
296
297        c = sqf.squarefreePart(c);
298        d = sqf.squarefreePart(d);
299        //System.out.println("c  = " + c);
300        //System.out.println("d  = " + d);
301        assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
302        assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
303
304        e = PolyUtil.<ModInteger> baseSparsePseudoRemainder(d, c);
305        //System.out.println("e  = " + e);
306        assertTrue("squarefree(abc) | squarefree(aabbc) " + e, e.isZERO());
307    }
308
309
310    /**
311     * Test squarefree factors.
312     */
313    public void testSquarefreeFactors() {
314        dfac = new GenPolynomialRing<ModInteger>(fac, rl, to, vars);
315
316        a = dfac.random(kl, 3, 2, q);
317        b = dfac.random(kl, 3, 2, q);
318        c = dfac.random(kl, 3, 2, q);
319        //System.out.println("a  = " + a);
320        //System.out.println("b  = " + b);
321        //System.out.println("c  = " + c);
322
323        if (a.isZERO() || b.isZERO() || c.isZERO()) {
324            // skip for this turn
325            return;
326        }
327
328        d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
329        //System.out.println("d  = " + d);
330
331        SortedMap<GenPolynomial<ModInteger>, Long> sfactors;
332        sfactors = sqf.squarefreeFactors(d);
333        //System.out.println("sfactors = " + sfactors);
334        assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
335    }
336
337
338    /* ------------char-th root ------------------------- */
339
340    /**
341     * Test base squarefree with char-th root.
342     */
343    public void testBaseSquarefreeCharRoot() {
344        //System.out.println("\nbase CharRoot:");
345        long p = fac.characteristic().longValue();
346
347        dfac = new GenPolynomialRing<ModInteger>(fac, 1, to, rvars);
348
349        a = dfac.random(kl, ll + 2, el + 2, q);
350        b = dfac.random(kl, ll + 2, el + 2, q);
351        c = dfac.random(kl, ll, el, q);
352
353        if (a.isZERO() || b.isZERO() || c.isZERO() || a.isConstant() || b.isConstant()) {
354            // skip for this turn
355            return;
356        }
357        //System.out.println("a  = " + a);
358        //System.out.println("b  = " + b);
359        //System.out.println("c  = " + c);
360
361        // a a b^p c
362        d = a.multiply(a).multiply(Power.<GenPolynomial<ModInteger>> positivePower(b, p)).multiply(c);
363        c = a.multiply(b).multiply(c);
364        //System.out.println("c  = " + c);
365        //System.out.println("d  = " + d);
366
367        c = sqf.baseSquarefreePart(c);
368        d = sqf.baseSquarefreePart(d);
369        //System.out.println("c  = " + c);
370        //System.out.println("d  = " + d);
371        assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
372        assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
373
374        e = PolyUtil.<ModInteger> baseSparsePseudoRemainder(d, c);
375        //System.out.println("e  = " + e);
376        assertTrue("squarefree(abc) | squarefree(aab^pc) " + e, e.isZERO());
377    }
378
379
380    /**
381     * Test base squarefree factors with char-th root.
382     */
383    public void testBaseSquarefreeFactorsCharRoot() {
384        long p = fac.characteristic().longValue();
385
386        dfac = new GenPolynomialRing<ModInteger>(fac, 1, to, rvars);
387
388        a = dfac.random(kl, ll + 2, el + 3, q);
389        b = dfac.random(kl, ll + 2, el + 3, q);
390        c = dfac.random(kl, ll, el + 2, q);
391
392        if (a.isZERO() || b.isZERO() || c.isZERO() || a.isConstant() || b.isConstant()) {
393            // skip for this turn
394            return;
395        }
396        //System.out.println("a  = " + a);
397        //System.out.println("b  = " + b);
398        //System.out.println("c  = " + c);
399
400        // a a b^p c
401        d = a.multiply(a).multiply(Power.<GenPolynomial<ModInteger>> positivePower(b, p)).multiply(c);
402        //System.out.println("d  = " + d);
403
404        SortedMap<GenPolynomial<ModInteger>, Long> sfactors;
405        sfactors = sqf.baseSquarefreeFactors(d);
406        //System.out.println("sfactors = " + sfactors);
407        assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
408    }
409
410
411    /**
412     * Test recursive squarefree with char-th root.
413     * 
414     */
415    public void testRecursiveSquarefreeCharRoot() {
416        //System.out.println("\nrecursive CharRoot:");
417
418        long p = fac.characteristic().longValue();
419
420        cfac = new GenPolynomialRing<ModInteger>(fac, 2 - 1, to, c1vars);
421        rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to, rvars);
422
423        ar = rfac.random(kl, ll, el + 1, q).monic();
424        br = rfac.random(kl, ll, el + 1, q).monic();
425        cr = rfac.random(kl, ll, el, q).monic();
426
427        if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
428            // skip for this turn
429            return;
430        }
431        //System.out.println("ar = " + ar);
432        //System.out.println("br = " + br);
433        //System.out.println("cr = " + cr);
434
435        // a a b^p 
436        dr = ar.multiply(ar).multiply(Power.<GenPolynomial<GenPolynomial<ModInteger>>> positivePower(br, p));
437        cr = ar.multiply(ar).multiply(br);
438        //System.out.println("cr  = " + cr);
439        //System.out.println("dr  = " + dr);
440
441        cr = sqf.recursiveUnivariateSquarefreePart(cr);
442        dr = sqf.recursiveUnivariateSquarefreePart(dr);
443        //System.out.println("cr  = " + cr);
444        //System.out.println("dr  = " + dr);
445        assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr));
446        assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr));
447
448        er = PolyUtil.<ModInteger> recursiveSparsePseudoRemainder(dr, cr);
449        //System.out.println("er  = " + er);
450        assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO());
451    }
452
453
454    /**
455     * Test recursive squarefree factors with char-th root.
456     */
457    public void testRecursiveSquarefreeFactorsCharRoot() {
458        long p = fac.characteristic().longValue();
459
460        cfac = new GenPolynomialRing<ModInteger>(fac, 2 - 1, to, c1vars);
461        rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to, rvars);
462
463        ar = rfac.random(kl, 3, 2 + 1, q).monic();
464        br = rfac.random(kl, 3, 2 + 1, q).monic();
465        cr = rfac.random(kl, 3, 2, q).monic();
466
467        if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
468            // skip for this turn
469            return;
470        }
471        //System.out.println("ar = " + ar);
472        //System.out.println("br = " + br);
473        //System.out.println("cr = " + cr);
474
475        // a a b^p c
476        dr = ar.multiply(ar).multiply(Power.<GenPolynomial<GenPolynomial<ModInteger>>> positivePower(br, p))
477                        .multiply(cr);
478        //System.out.println("dr  = " + dr);
479
480        SortedMap<GenPolynomial<GenPolynomial<ModInteger>>, Long> sfactors;
481        sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr);
482        //System.out.println("sfactors = " + sfactors);
483        assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors));
484    }
485
486
487    /**
488     * Test squarefree with char-th root.
489     */
490    public void testSquarefreeCharRoot() {
491        //System.out.println("\nfull CharRoot:");
492        long p = fac.characteristic().longValue();
493
494        dfac = new GenPolynomialRing<ModInteger>(fac, rl, to, vars);
495
496        a = dfac.random(kl, ll, 3, q).monic();
497        b = dfac.random(kl, ll, 3, q).monic();
498        c = dfac.random(kl, ll, 3, q).monic();
499
500        if (a.isZERO() || b.isZERO() || c.isZERO()) {
501            // skip for this turn
502            return;
503        }
504        //System.out.println("a  = " + a);
505        //System.out.println("b  = " + b);
506        //System.out.println("c  = " + c);
507
508        // a a b^p c
509        d = a.multiply(a).multiply(Power.<GenPolynomial<ModInteger>> positivePower(b, p)).multiply(c);
510        c = a.multiply(b).multiply(c);
511        //System.out.println("c  = " + c);
512        //System.out.println("d  = " + d);
513
514        c = sqf.squarefreePart(c);
515        d = sqf.squarefreePart(d);
516        //System.out.println("c  = " + c);
517        //System.out.println("d  = " + d);
518        assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
519        assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
520
521        e = PolyUtil.<ModInteger> baseSparsePseudoRemainder(d, c);
522        //System.out.println("e  = " + e);
523        assertTrue("squarefree(abc) | squarefree(aab^pc) " + e, e.isZERO());
524    }
525
526
527    /**
528     * Test squarefree factors with char-th root.
529     */
530    public void testSquarefreeFactorsCharRoot() {
531        long p = fac.characteristic().longValue();
532
533        dfac = new GenPolynomialRing<ModInteger>(fac, rl, to, vars);
534
535        a = dfac.random(kl, ll, 3, q).monic();
536        b = dfac.random(kl, ll, 3, q).monic();
537        c = dfac.random(kl, ll, 3, q).monic();
538
539        if (a.isZERO() || b.isZERO() || c.isZERO()) {
540            // skip for this turn
541            return;
542        }
543        //System.out.println("a  = " + a);
544        //System.out.println("b  = " + b);
545        //System.out.println("c  = " + c);
546
547        // a a b^p c
548        d = a.multiply(a).multiply(Power.<GenPolynomial<ModInteger>> positivePower(b, p)).multiply(c);
549        //System.out.println("d  = " + d);
550
551        SortedMap<GenPolynomial<ModInteger>, Long> sfactors;
552        sfactors = sqf.squarefreeFactors(d);
553        //System.out.println("sfactors = " + sfactors);
554        assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
555    }
556
557}