001    /*
002     * $Id: SquarefreeIntTest.java 2933 2009-12-29 13:13:34Z kredel $
003     */
004    
005    package edu.jas.ufd;
006    
007    
008    import java.util.SortedMap;
009    
010    import junit.framework.Test;
011    import junit.framework.TestCase;
012    import junit.framework.TestSuite;
013    
014    import edu.jas.arith.BigInteger;
015    import edu.jas.kern.ComputerThreads;
016    import edu.jas.poly.ExpVector;
017    import edu.jas.poly.GenPolynomial;
018    import edu.jas.poly.GenPolynomialRing;
019    import edu.jas.poly.PolyUtil;
020    import edu.jas.poly.TermOrder;
021    
022    
023    /**
024     * Squarefree factorization tests with JUnit.
025     * @author Heinz Kredel.
026     */
027    
028    public class SquarefreeIntTest extends TestCase {
029    
030    
031        /**
032         * main.
033         */
034        public static void main(String[] args) {
035            //BasicConfigurator.configure();
036            junit.textui.TestRunner.run(suite());
037            ComputerThreads.terminate();
038        }
039    
040    
041        /**
042         * Constructs a <CODE>SquarefreeIntTest</CODE> object.
043         * @param name String.
044         */
045        public SquarefreeIntTest(String name) {
046            super(name);
047        }
048    
049    
050        /**
051         */
052        public static Test suite() {
053            TestSuite suite = new TestSuite(SquarefreeIntTest.class);
054            return suite;
055        }
056    
057    
058        TermOrder to = new TermOrder(TermOrder.INVLEX);
059    
060    
061        int rl = 3;
062    
063    
064        int kl = 7;
065    
066    
067        int ll = 4;
068    
069    
070        int el = 3;
071    
072    
073        float q = 0.25f;
074    
075    
076        String[] vars;
077    
078    
079        String[] cvars;
080    
081    
082        String[] c1vars;
083    
084    
085        String[] rvars;
086    
087    
088        BigInteger fac;
089    
090    
091        GreatestCommonDivisorAbstract<BigInteger> ufd;
092    
093    
094        SquarefreeRingChar0<BigInteger> sqf;
095    
096    
097        GenPolynomialRing<BigInteger> dfac;
098    
099    
100        GenPolynomial<BigInteger> a;
101    
102    
103        GenPolynomial<BigInteger> b;
104    
105    
106        GenPolynomial<BigInteger> c;
107    
108    
109        GenPolynomial<BigInteger> d;
110    
111    
112        GenPolynomial<BigInteger> e;
113    
114    
115        GenPolynomialRing<BigInteger> cfac;
116    
117    
118        GenPolynomialRing<GenPolynomial<BigInteger>> rfac;
119    
120    
121        GenPolynomial<GenPolynomial<BigInteger>> ar;
122    
123    
124        GenPolynomial<GenPolynomial<BigInteger>> br;
125    
126    
127        GenPolynomial<GenPolynomial<BigInteger>> cr;
128    
129    
130        GenPolynomial<GenPolynomial<BigInteger>> dr;
131    
132    
133        GenPolynomial<GenPolynomial<BigInteger>> er;
134    
135    
136        @Override
137        protected void setUp() {
138            vars = ExpVector.STDVARS(rl);
139            cvars = ExpVector.STDVARS(rl - 1);
140            c1vars = new String[] { cvars[0] };
141            rvars = new String[] { vars[rl - 1] };
142    
143            fac = new BigInteger(1);
144    
145            //ufd = new GreatestCommonDivisorSubres<BigInteger>();
146            //ufd = GCDFactory.<BigInteger> getImplementation(fac);
147            ufd = GCDFactory.getProxy(fac);
148    
149            sqf = new SquarefreeRingChar0<BigInteger>(fac);
150    
151            SquarefreeAbstract<BigInteger> sqff = SquarefreeFactory.getImplementation(fac);
152            //System.out.println("sqf  = " + sqf);
153            //System.out.println("sqff = " + sqff);
154            assertEquals("sqf == sqff ", sqf.getClass(), sqff.getClass());
155    
156            a = b = c = d = e = null;
157            ar = br = cr = dr = er = null;
158        }
159    
160    
161        @Override
162        protected void tearDown() {
163            a = b = c = d = e = null;
164            ar = br = cr = dr = er = null;
165            //ComputerThreads.terminate();
166        }
167    
168    
169        /**
170         * Test base squarefree.
171         * 
172         */
173        public void testBaseSquarefree() {
174            //System.out.println("\nbase:");
175    
176            dfac = new GenPolynomialRing<BigInteger>(fac, 1, to, rvars);
177    
178            a = dfac.random(kl, ll, el + 2, q);
179            b = dfac.random(kl, ll, el + 2, q);
180            c = dfac.random(kl, ll, el, q);
181            //System.out.println("a  = " + a);
182            //System.out.println("b  = " + b);
183            //System.out.println("c  = " + c);
184    
185            if (a.isZERO() || b.isZERO() || c.isZERO()) {
186                // skip for this turn
187                return;
188            }
189    
190            // a a b b b c
191            d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
192            c = a.multiply(b).multiply(c);
193            //System.out.println("d  = " + d);
194            //System.out.println("c  = " + c);
195    
196            c = sqf.baseSquarefreePart(c);
197            d = sqf.baseSquarefreePart(d);
198            //System.out.println("d  = " + d);
199            //System.out.println("c  = " + c);
200            assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
201            assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
202    
203            e = PolyUtil.<BigInteger> basePseudoRemainder(d, c);
204            //System.out.println("e  = " + e);
205            assertTrue("squarefree(abc) | squarefree(aabbbc) " + e, e.isZERO());
206        }
207    
208    
209        /**
210         * Test base squarefree factors.
211         * 
212         */
213        public void testBaseSquarefreeFactors() {
214    
215            dfac = new GenPolynomialRing<BigInteger>(fac, 1, to, rvars);
216    
217            a = dfac.random(kl, ll, el + 3, q);
218            b = dfac.random(kl, ll, el + 3, q);
219            c = dfac.random(kl, ll, el + 2, q);
220            //System.out.println("a  = " + a);
221            //System.out.println("b  = " + b);
222            //System.out.println("c  = " + c);
223    
224            if (a.isZERO() || b.isZERO() || c.isZERO()) {
225                // skip for this turn
226                return;
227            }
228    
229            // a a b b b c
230            d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
231            //System.out.println("d  = " + d);
232    
233            SortedMap<GenPolynomial<BigInteger>, Long> sfactors;
234            sfactors = sqf.baseSquarefreeFactors(d);
235            //System.out.println("sfactors = " + sfactors);
236    
237            assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
238        }
239    
240    
241        /**
242         * Test recursive squarefree.
243         * 
244         */
245        public void testRecursiveSquarefree() {
246            //System.out.println("\nrecursive:");
247    
248            cfac = new GenPolynomialRing<BigInteger>(fac, 2 - 1, to, c1vars);
249            rfac = new GenPolynomialRing<GenPolynomial<BigInteger>>(cfac, 1, to, rvars);
250    
251            ar = rfac.random(kl, ll, el, q);
252            br = rfac.random(kl, ll, el, q);
253            cr = rfac.random(kl, ll, el, 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(ar).multiply(br).multiply(br);
264            cr = ar.multiply(br);
265            //System.out.println("dr  = " + dr);
266            //System.out.println("cr  = " + cr);
267    
268            cr = sqf.recursiveUnivariateSquarefreePart(cr);
269            dr = sqf.recursiveUnivariateSquarefreePart(dr);
270            //System.out.println("dr  = " + dr);
271            //System.out.println("cr  = " + cr);
272            assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr));
273            assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr));
274    
275            er = PolyUtil.<BigInteger> recursivePseudoRemainder(dr, cr);
276            //System.out.println("er  = " + er);
277            assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO());
278        }
279    
280    
281        /**
282         * Test recursive squarefree factors.
283         * 
284         */
285        public void testRecursiveSquarefreeFactors() {
286    
287            cfac = new GenPolynomialRing<BigInteger>(fac, 2 - 1, to, c1vars);
288            rfac = new GenPolynomialRing<GenPolynomial<BigInteger>>(cfac, 1, to, rvars);
289    
290            ar = rfac.random(kl, 3, 2, q);
291            br = rfac.random(kl, 3, 2, q);
292            cr = rfac.random(kl, 3, 2, q);
293            //System.out.println("ar = " + ar);
294            //System.out.println("br = " + br);
295            //System.out.println("cr = " + cr);
296    
297            if (ar.isZERO() || br.isZERO() || cr.isZERO()) {
298                // skip for this turn
299                return;
300            }
301    
302            dr = ar.multiply(cr).multiply(br).multiply(br);
303            //System.out.println("dr  = " + dr);
304    
305            SortedMap<GenPolynomial<GenPolynomial<BigInteger>>, Long> sfactors;
306            sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr);
307            //System.out.println("sfactors = " + sfactors);
308    
309            assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors));
310        }
311    
312    
313        /**
314         * Test squarefree.
315         * 
316         */
317        public void testSquarefree() {
318            //System.out.println("\nfull:");
319    
320            dfac = new GenPolynomialRing<BigInteger>(fac, rl, to, vars);
321    
322            a = dfac.random(kl, ll, 2, q);
323            b = dfac.random(kl, ll, 2, q);
324            c = dfac.random(kl, ll, 2, q);
325            //System.out.println("a  = " + a);
326            //System.out.println("b  = " + b);
327            //System.out.println("c  = " + c);
328    
329            if (a.isZERO() || b.isZERO() || c.isZERO()) {
330                // skip for this turn
331                return;
332            }
333    
334            d = a.multiply(a).multiply(b).multiply(b).multiply(c);
335            c = a.multiply(b).multiply(c);
336            //System.out.println("d  = " + d);
337            //System.out.println("c  = " + c);
338    
339            c = sqf.squarefreePart(c);
340            d = sqf.squarefreePart(d);
341            //System.out.println("c  = " + c);
342            //System.out.println("d  = " + d);
343            assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d));
344            assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c));
345    
346            e = PolyUtil.<BigInteger> basePseudoRemainder(d, c);
347            //System.out.println("e  = " + e);
348            assertTrue("squarefree(abc) | squarefree(aabbc) " + e, e.isZERO());
349        }
350    
351    
352        /**
353         * Test squarefree factors.
354         * 
355         */
356        public void testSquarefreeFactors() {
357    
358            dfac = new GenPolynomialRing<BigInteger>(fac, rl, to, vars);
359    
360            a = dfac.random(kl, 3, 2, q);
361            b = dfac.random(kl, 3, 2, q);
362            c = dfac.random(kl, 3, 2, q);
363            //System.out.println("a  = " + a);
364            //System.out.println("b  = " + b);
365            //System.out.println("c  = " + c);
366    
367            if (a.isZERO() || b.isZERO() || c.isZERO()) {
368                // skip for this turn
369                return;
370            }
371    
372            d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c);
373            //System.out.println("d  = " + d);
374    
375            SortedMap<GenPolynomial<BigInteger>, Long> sfactors;
376            sfactors = sqf.squarefreeFactors(d);
377            //System.out.println("sfactors = " + sfactors);
378    
379            assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors));
380        }
381    
382    }