001    /*
002     * $Id: GCDProxyTest.java 3031 2010-03-08 23:18:01Z kredel $
003     */
004    
005    package edu.jas.ufd;
006    
007    
008    //import java.util.Map;
009    
010    import junit.framework.Test;
011    import junit.framework.TestCase;
012    import junit.framework.TestSuite;
013    
014    import org.apache.log4j.BasicConfigurator;
015    
016    import edu.jas.arith.BigComplex;
017    import edu.jas.arith.BigInteger;
018    import edu.jas.arith.BigRational;
019    import edu.jas.arith.ModInteger;
020    import edu.jas.arith.ModIntegerRing;
021    import edu.jas.kern.ComputerThreads;
022    import edu.jas.poly.AlgebraicNumber;
023    import edu.jas.poly.AlgebraicNumberRing;
024    import edu.jas.poly.GenPolynomial;
025    import edu.jas.poly.GenPolynomialRing;
026    import edu.jas.poly.PolyUtil;
027    import edu.jas.poly.TermOrder;
028    
029    
030    /**
031     * GreatestCommonDivisor proxy tests with JUnit.
032     * @author Heinz Kredel.
033     */
034    
035    public class GCDProxyTest extends TestCase {
036    
037    
038        /**
039         * main.
040         */
041        public static void main(String[] args) {
042            BasicConfigurator.configure();
043            junit.textui.TestRunner.run(suite());
044            //ComputerThreads.terminate();
045            //System.out.println("System.exit(0)");
046        }
047    
048    
049        /**
050         * Constructs a <CODE>GCDProxyTest</CODE> object.
051         * @param name String.
052         */
053        public GCDProxyTest(String name) {
054            super(name);
055        }
056    
057    
058        /**
059         */
060        public static Test suite() {
061            TestSuite suite = new TestSuite(GCDProxyTest.class);
062            return suite;
063        }
064    
065    
066        //private final static int bitlen = 100;
067    
068        TermOrder to = new TermOrder(TermOrder.INVLEX);
069    
070    
071        GenPolynomialRing<BigInteger> dfac;
072    
073    
074        GenPolynomialRing<BigInteger> cfac;
075    
076    
077        GenPolynomialRing<GenPolynomial<BigInteger>> rfac;
078    
079    
080        BigInteger ai;
081    
082    
083        BigInteger bi;
084    
085    
086        BigInteger ci;
087    
088    
089        BigInteger di;
090    
091    
092        BigInteger ei;
093    
094    
095        GenPolynomial<BigInteger> a;
096    
097    
098        GenPolynomial<BigInteger> b;
099    
100    
101        GenPolynomial<BigInteger> c;
102    
103    
104        GenPolynomial<BigInteger> d;
105    
106    
107        GenPolynomial<BigInteger> e;
108    
109    
110        GenPolynomial<GenPolynomial<BigInteger>> ar;
111    
112    
113        GenPolynomial<GenPolynomial<BigInteger>> br;
114    
115    
116        GenPolynomial<GenPolynomial<BigInteger>> cr;
117    
118    
119        GenPolynomial<GenPolynomial<BigInteger>> dr;
120    
121    
122        GenPolynomial<GenPolynomial<BigInteger>> er;
123    
124    
125        int rl = 5;
126    
127    
128        int kl = 5;
129    
130    
131        int ll = 7;
132    
133    
134        int el = 3;
135    
136    
137        float q = 0.3f;
138    
139    
140        @Override
141        protected void setUp() {
142            a = b = c = d = e = null;
143            ai = bi = ci = di = ei = null;
144            ar = br = cr = dr = er = null;
145            dfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), rl, to);
146            cfac = new GenPolynomialRing<BigInteger>(new BigInteger(1), rl - 1, to);
147            rfac = new GenPolynomialRing<GenPolynomial<BigInteger>>(cfac, 1, to);
148        }
149    
150    
151        @Override
152        protected void tearDown() {
153            a = b = c = d = e = null;
154            ai = bi = ci = di = ei = null;
155            ar = br = cr = dr = er = null;
156            dfac = null;
157            cfac = null;
158            rfac = null;
159            ComputerThreads.terminate();
160        }
161    
162    
163        /**
164         * Test get BigInteger implementation.
165         * 
166         */
167        public void testBigInteger() {
168            long t;
169            BigInteger bi = new BigInteger();
170    
171            GreatestCommonDivisor<BigInteger> ufd_par;
172            GreatestCommonDivisorAbstract<BigInteger> ufd;
173    
174            ufd_par = GCDFactory./*<BigInteger>*/getProxy(bi);
175            //System.out.println("ufd_par = " + ufd_par);
176            assertTrue("ufd_par != null " + ufd_par, ufd_par != null);
177    
178            ufd = new GreatestCommonDivisorSubres<BigInteger>();
179    
180            //System.out.println("ufd = " + ufd);
181            assertTrue("ufd != null " + ufd, ufd != null);
182    
183            dfac = new GenPolynomialRing<BigInteger>(bi, 4, to);
184    
185            for (int i = 0; i < 1; i++) { // 10-50
186                a = dfac.random(kl + i * 10, ll + i, el, q);
187                b = dfac.random(kl + i * 10, ll + i, el, q);
188                c = dfac.random(kl + 2, ll, el, q);
189                //c = dfac.getONE();
190                //c = c.multiply( dfac.univariate(0) );
191                c = ufd.primitivePart(c).abs();
192                //System.out.println("a = " + a);
193                //System.out.println("b = " + b);
194                //System.out.println("c = " + c);
195    
196                if (a.isZERO() || b.isZERO() || c.isZERO()) {
197                    // skip for this turn
198                    continue;
199                }
200                assertTrue("length( c" + i + " ) <> 0", c.length() > 0);
201                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
202                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
203    
204                a = a.multiply(c);
205                b = b.multiply(c);
206                //System.out.println("a = " + a);
207                //System.out.println("b = " + b);
208                /*
209                System.out.println("\ni degrees: a = " + a.degree() 
210                                            + ", b = " + b.degree()  
211                                            + ", c = " + c.degree());  
212                */
213                t = System.currentTimeMillis();
214                d = ufd_par.gcd(a, b);
215                t = System.currentTimeMillis() - t;
216                //System.out.println("i proxy time = " + t);
217                //System.out.println("c = " + c);
218                //System.out.println("d = " + d);
219                //System.out.println("e = " + e);
220    
221                e = PolyUtil.<BigInteger> basePseudoRemainder(d, c);
222                //System.out.println("e = " + e);
223                assertTrue("c | gcd(ac,bc) " + e, e.isZERO());
224            }
225            // obsolete ((GCDProxy<BigInteger>)ufd_par).terminate();
226            ComputerThreads.terminate();
227        }
228    
229    
230        /**
231         * Test get ModInteger implementation.
232         * 
233         */
234        public void testModInteger() {
235            long t;
236            ModIntegerRing mi = new ModIntegerRing(19,true);
237            //ModIntegerRing mi = new ModIntegerRing(536870909, true);
238    
239            GenPolynomial<ModInteger> a, b, c, d, e;
240    
241            GreatestCommonDivisor<ModInteger> ufd_par;
242            GreatestCommonDivisorAbstract<ModInteger> ufd;
243    
244            ufd_par = GCDFactory.getProxy(mi);
245            //System.out.println("ufd_par = " + ufd_par);
246            assertTrue("ufd_par != null " + ufd_par, ufd_par != null);
247    
248            ufd = new GreatestCommonDivisorSubres<ModInteger>();
249    
250            //System.out.println("ufd = " + ufd);
251            assertTrue("ufd != null " + ufd, ufd != null);
252    
253            GenPolynomialRing<ModInteger> dfac;
254            dfac = new GenPolynomialRing<ModInteger>(mi, 4, to);
255    
256            for (int i = 0; i < 1; i++) {
257                a = dfac.random(kl + i * 2, ll + i, el, q);
258                b = dfac.random(kl + i * 2, ll + i, el, q);
259                c = dfac.random(kl, ll, el, q);
260                //a = dfac.random(kl,ll+i,el,q);
261                //b = dfac.random(kl,ll+i,el,q);
262                //c = dfac.random(kl,ll,el,q);
263                //c = dfac.getONE();
264                //c = c.multiply( dfac.univariate(0) );
265                c = ufd.primitivePart(c).abs();
266                //System.out.println("a = " + a);
267                //System.out.println("b = " + b);
268                //System.out.println("c = " + c);
269    
270                if (a.isZERO() || b.isZERO() || c.isZERO()) {
271                    // skip for this turn
272                    continue;
273                }
274                assertTrue("length( c" + i + " ) <> 0", c.length() > 0);
275                //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() );
276                //assertTrue(" not isONE( c"+i+" )", !c.isONE() );
277    
278                a = a.multiply(c);
279                b = b.multiply(c);
280                //System.out.println("a = " + a);
281                //System.out.println("b = " + b);
282                /*
283                System.out.println("\nm degrees: a = " + a.degree() 
284                                            + ", b = " + b.degree()  
285                                            + ", c = " + c.degree());  
286                */
287                t = System.currentTimeMillis();
288                d = ufd_par.gcd(a, b);
289                t = System.currentTimeMillis() - t;
290                //System.out.println("m proxy time = " + t);
291                //System.out.println("c = " + c);
292                //System.out.println("d = " + d);
293                //System.out.println("e = " + e);
294    
295                e = PolyUtil.<ModInteger> basePseudoRemainder(d, c);
296                //System.out.println("e = " + e);
297                assertTrue("c | gcd(ac,bc) " + e, e.isZERO());
298            }
299            // obsolete ((GCDProxy<ModInteger>)ufd_par).terminate();
300            ComputerThreads.terminate();
301        }
302    
303    
304        /**
305         * Test get BigRational implementation.
306         * 
307         */
308        public void testBigRational() {
309            BigRational b = new BigRational();
310            GreatestCommonDivisor<BigRational> ufd;
311    
312            ufd = GCDFactory./*<BigRational>*/getImplementation(b);
313            //System.out.println("ufd = " + ufd);
314            assertTrue("ufd = Primitive " + ufd, ufd instanceof GreatestCommonDivisorPrimitive);
315        }
316    
317    
318        /**
319         * Test get BigComplex implementation.
320         * 
321         */
322        public void testBigComplex() {
323            BigComplex b = new BigComplex();
324            GreatestCommonDivisor<BigComplex> ufd;
325    
326            ufd = GCDFactory.<BigComplex> getImplementation(b);
327            //System.out.println("ufd = " + ufd);
328            assertTrue("ufd != Simple " + ufd, ufd instanceof GreatestCommonDivisorSimple);
329        }
330    
331    
332        /**
333         * Test get AlgebraicNumber&lt;BigRational&gt; implementation.
334         * 
335         */
336        public void xtestAlgebraicNumberBigRational() {
337            BigRational b = new BigRational();
338            GenPolynomialRing<BigRational> fac;
339            fac = new GenPolynomialRing<BigRational>(b, 1);
340            GenPolynomial<BigRational> mo = fac.random(kl, ll, el, q);
341            while (mo.isConstant() || mo.isZERO()) {
342                mo = fac.random(kl, ll, el, q);
343            }
344    
345            AlgebraicNumberRing<BigRational> afac;
346            afac = new AlgebraicNumberRing<BigRational>(mo);
347    
348            GreatestCommonDivisor<AlgebraicNumber<BigRational>> ufd;
349    
350            ufd = GCDFactory.<AlgebraicNumber<BigRational>> getImplementation(afac);
351            //System.out.println("ufd = " + ufd);
352            assertTrue("ufd = Subres " + ufd, ufd instanceof GreatestCommonDivisorSubres);
353    
354            mo = fac.univariate(0).subtract(fac.getONE());
355            afac = new AlgebraicNumberRing<BigRational>(mo, true);
356    
357            ufd = GCDFactory.<AlgebraicNumber<BigRational>> getImplementation(afac);
358            //System.out.println("ufd = " + ufd);
359            assertTrue("ufd = Simple " + ufd, ufd instanceof GreatestCommonDivisorSimple);
360        }
361    
362    
363        /**
364         * Test get AlgebraicNumber&lt;ModInteger&glt; implementation.
365         * 
366         */
367        public void testAlgebraicNumberModInteger() {
368            ModIntegerRing b = new ModIntegerRing(19, true);
369            GenPolynomialRing<ModInteger> fac;
370            fac = new GenPolynomialRing<ModInteger>(b, 1);
371            GenPolynomial<ModInteger> mo = fac.random(kl, ll, el, q);
372            while (mo.isConstant() || mo.isZERO()) {
373                mo = fac.random(kl, ll, el, q);
374            }
375    
376            AlgebraicNumberRing<ModInteger> afac;
377            afac = new AlgebraicNumberRing<ModInteger>(mo);
378    
379            AlgebraicNumber<ModInteger> a = afac.getONE();
380            GreatestCommonDivisor<AlgebraicNumber<ModInteger>> ufd;
381    
382            ufd = GCDFactory.<AlgebraicNumber<ModInteger>> getImplementation(afac);
383            //System.out.println("ufd = " + ufd);
384            assertTrue("ufd = Subres " + ufd, ufd instanceof GreatestCommonDivisorSubres);
385        }
386    
387    }