001    /*
002     * $Id: FactorTest.java 3673 2011-06-26 11:38:25Z kredel $
003     */
004    
005    package edu.jas.ufd;
006    
007    
008    import junit.framework.Test;
009    import junit.framework.TestCase;
010    import junit.framework.TestSuite;
011    
012    import edu.jas.arith.BigInteger;
013    import edu.jas.arith.BigRational;
014    import edu.jas.arith.ModInteger;
015    import edu.jas.arith.ModIntegerRing;
016    import edu.jas.arith.ModLong;
017    import edu.jas.arith.ModLongRing;
018    import edu.jas.kern.ComputerThreads;
019    import edu.jas.poly.AlgebraicNumber;
020    import edu.jas.poly.AlgebraicNumberRing;
021    import edu.jas.poly.GenPolynomial;
022    import edu.jas.poly.GenPolynomialRing;
023    import edu.jas.poly.TermOrder;
024    import edu.jas.structure.RingFactory;
025    
026    
027    /**
028     * Factor tests with JUnit.
029     * @see edu.jas.application.FactorTest
030     * @author Heinz Kredel.
031     */
032    
033    public class FactorTest extends TestCase {
034    
035    
036        /**
037         * main.
038         */
039        public static void main(String[] args) {
040            //BasicConfigurator.configure();
041            junit.textui.TestRunner.run(suite());
042        }
043    
044    
045        /**
046         * Constructs a <CODE>FactorTest</CODE> object.
047         * @param name String.
048         */
049        public FactorTest(String name) {
050            super(name);
051        }
052    
053    
054        /**
055         */
056        public static Test suite() {
057            TestSuite suite = new TestSuite(FactorTest.class);
058            return suite;
059        }
060    
061    
062        int rl = 3;
063    
064    
065        int kl = 5;
066    
067    
068        int ll = 5;
069    
070    
071        int el = 3;
072    
073    
074        float q = 0.3f;
075    
076    
077        @Override
078        protected void setUp() {
079        }
080    
081    
082        @Override
083        protected void tearDown() {
084            ComputerThreads.terminate();
085        }
086    
087    
088        /**
089         * Test dummy for Junit.
090         * 
091         */
092        public void testDummy() {
093        }
094    
095    
096        /**
097         * Test factory.
098         * 
099         */
100        public void testFactory() {
101            ModIntegerRing mi = new ModIntegerRing(19, true);
102            Factorization<ModInteger> ufdm = FactorFactory.getImplementation(mi);
103            //System.out.println("ufdm = " + ufdm);
104            assertTrue("ufd != Modular " + ufdm, ufdm instanceof FactorModular);
105    
106            ModLongRing ml = new ModLongRing(19, true);
107            Factorization<ModLong> ufdml = FactorFactory.getImplementation(ml);
108            //System.out.println("ufdml = " + ufdml);
109            assertTrue("ufd != Modular " + ufdml, ufdml instanceof FactorModular);
110    
111            BigInteger bi = new BigInteger(1);
112            Factorization<BigInteger> ufdi = FactorFactory.getImplementation(bi);
113            //System.out.println("ufdi = " + ufdi);
114            assertTrue("ufd != Integer " + ufdi, ufdi instanceof FactorInteger);
115    
116            BigRational br = new BigRational(1);
117            Factorization<BigRational> ufdr = FactorFactory.getImplementation(br);
118            //System.out.println("ufdr = " + ufdr);
119            assertTrue("ufd != Rational " + ufdr, ufdr instanceof FactorRational);
120    
121            GenPolynomialRing<ModInteger> pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
122            GenPolynomial<ModInteger> pm = pmfac.univariate(0);
123            AlgebraicNumberRing<ModInteger> am = new AlgebraicNumberRing<ModInteger>(pm, true);
124            Factorization<AlgebraicNumber<ModInteger>> ufdam = FactorFactory.getImplementation(am);
125            //System.out.println("ufdam = " + ufdam);
126            assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorAlgebraic);
127    
128            GenPolynomialRing<BigRational> prfac = new GenPolynomialRing<BigRational>(br, 1);
129            GenPolynomial<BigRational> pr = prfac.univariate(0);
130            AlgebraicNumberRing<BigRational> ar = new AlgebraicNumberRing<BigRational>(pr, true);
131            Factorization<AlgebraicNumber<BigRational>> ufdar = FactorFactory.getImplementation(ar);
132            //System.out.println("ufdar = " + ufdar);
133            assertTrue("ufd != AlgebraicNumber<BigRational> " + ufdar, ufdar instanceof FactorAlgebraic);
134    
135            prfac = new GenPolynomialRing<BigRational>(br, 2);
136            QuotientRing<BigRational> qrfac = new QuotientRing<BigRational>(prfac);
137            Factorization<Quotient<BigRational>> ufdqr = FactorFactory.getImplementation(qrfac);
138            //System.out.println("ufdqr = " + ufdqr);
139            assertTrue("ufd != Quotient<BigRational> " + ufdqr, ufdqr instanceof FactorQuotient);
140        }
141    
142    
143        /**
144         * Test factory generic.
145         * 
146         */
147        @SuppressWarnings("unchecked")
148        public void testFactoryGeneric() {
149            ModIntegerRing mi = new ModIntegerRing(19, true);
150            Factorization<ModInteger> ufdm = FactorFactory.getImplementation((RingFactory) mi);
151            //System.out.println("ufdm = " + ufdm);
152            assertTrue("ufd != Modular " + ufdm, ufdm instanceof FactorModular);
153    
154            BigInteger bi = new BigInteger(1);
155            Factorization<BigInteger> ufdi = FactorFactory.getImplementation((RingFactory) bi);
156            //System.out.println("ufdi = " + ufdi);
157            assertTrue("ufd != Integer " + ufdi, ufdi instanceof FactorInteger);
158    
159            BigRational br = new BigRational(1);
160            Factorization<BigRational> ufdr = FactorFactory.getImplementation((RingFactory) br);
161            //System.out.println("ufdr = " + ufdr);
162            assertTrue("ufd != Rational " + ufdr, ufdr instanceof FactorRational);
163    
164            GenPolynomialRing<ModInteger> pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
165            GenPolynomial<ModInteger> pm = pmfac.univariate(0);
166            AlgebraicNumberRing<ModInteger> am = new AlgebraicNumberRing<ModInteger>(pm, true);
167            Factorization<AlgebraicNumber<ModInteger>> ufdam = FactorFactory.getImplementation((RingFactory) am);
168            //System.out.println("ufdam = " + ufdam);
169            assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorAlgebraic);
170    
171            GenPolynomialRing<BigRational> prfac = new GenPolynomialRing<BigRational>(br, 1);
172            GenPolynomial<BigRational> pr = prfac.univariate(0);
173            AlgebraicNumberRing<BigRational> ar = new AlgebraicNumberRing<BigRational>(pr, true);
174            Factorization<AlgebraicNumber<BigRational>> ufdar = FactorFactory.getImplementation((RingFactory) ar);
175            //System.out.println("ufdar = " + ufdar);
176            assertTrue("ufd != AlgebraicNumber<BigRational> " + ufdar, ufdar instanceof FactorAlgebraic);
177    
178            prfac = new GenPolynomialRing<BigRational>(br, 2);
179            QuotientRing<BigRational> qrfac = new QuotientRing<BigRational>(prfac);
180            Factorization<Quotient<BigRational>> ufdqr = FactorFactory.getImplementation((RingFactory) qrfac);
181            //System.out.println("ufdqr = " + ufdqr);
182            assertTrue("ufd != Quotient<BigRational> " + ufdqr, ufdqr instanceof FactorQuotient);
183    
184            pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
185            QuotientRing<ModInteger> qmfac = new QuotientRing<ModInteger>(pmfac);
186            Factorization<Quotient<ModInteger>> ufdqm = FactorFactory.getImplementation((RingFactory) qmfac);
187            //System.out.println("ufdqm = " + ufdqm);
188            assertTrue("ufd != Quotient<ModInteger> " + ufdqm, ufdqm instanceof FactorQuotient);
189    
190            prfac = new GenPolynomialRing<BigRational>(br, 2);
191            GenPolynomialRing<GenPolynomial<BigRational>> rrfac = new GenPolynomialRing<GenPolynomial<BigRational>>(
192                    prfac, 1);
193            Factorization<BigRational> ufdrr = FactorFactory.getImplementation((RingFactory) rrfac);
194            //System.out.println("ufdrr = " + ufdrr);
195            assertTrue("ufd != GenPolynomial<GenPolynomialBigRational>> " + ufdrr,
196                    ufdrr instanceof FactorRational);
197        }
198    
199    
200        /**
201         * Test factory specific.
202         * 
203         */
204        public void testFactorySpecific() {
205            ModIntegerRing mi = new ModIntegerRing(19, true);
206            Factorization<ModInteger> ufdm = FactorFactory.getImplementation(mi);
207            //System.out.println("ufdm = " + ufdm);
208            assertTrue("ufd != Modular " + ufdm, ufdm instanceof FactorModular);
209    
210            BigInteger bi = new BigInteger(1);
211            Factorization<BigInteger> ufdi = FactorFactory.getImplementation(bi);
212            //System.out.println("ufdi = " + ufdi);
213            assertTrue("ufd != Integer " + ufdi, ufdi instanceof FactorInteger);
214    
215            BigRational br = new BigRational(1);
216            Factorization<BigRational> ufdr = FactorFactory.getImplementation(br);
217            //System.out.println("ufdr = " + ufdr);
218            assertTrue("ufd != Rational " + ufdr, ufdr instanceof FactorRational);
219    
220            GenPolynomialRing<ModInteger> pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
221            GenPolynomial<ModInteger> pm = pmfac.univariate(0);
222            AlgebraicNumberRing<ModInteger> am = new AlgebraicNumberRing<ModInteger>(pm, true);
223            Factorization<AlgebraicNumber<ModInteger>> ufdam = FactorFactory.<ModInteger> getImplementation(am);
224            //System.out.println("ufdam = " + ufdam);
225            assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorAlgebraic);
226    
227            GenPolynomialRing<BigRational> prfac = new GenPolynomialRing<BigRational>(br, 1);
228            GenPolynomial<BigRational> pr = prfac.univariate(0);
229            AlgebraicNumberRing<BigRational> ar = new AlgebraicNumberRing<BigRational>(pr, true);
230            Factorization<AlgebraicNumber<BigRational>> ufdar = FactorFactory.<BigRational> getImplementation(ar);
231            //System.out.println("ufdar = " + ufdar);
232            assertTrue("ufd != AlgebraicNumber<BigRational> " + ufdar, ufdar instanceof FactorAlgebraic);
233    
234            prfac = new GenPolynomialRing<BigRational>(br, 2);
235            QuotientRing<BigRational> qrfac = new QuotientRing<BigRational>(prfac);
236            Factorization<Quotient<BigRational>> ufdqr = FactorFactory.<BigRational> getImplementation(qrfac);
237            //System.out.println("ufdqr = " + ufdqr);
238            assertTrue("ufd != Quotient<BigRational> " + ufdqr, ufdqr instanceof FactorQuotient);
239    
240            pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
241            QuotientRing<ModInteger> qmfac = new QuotientRing<ModInteger>(pmfac);
242            Factorization<Quotient<ModInteger>> ufdqm = FactorFactory.<ModInteger> getImplementation(qmfac);
243            //System.out.println("ufdqm = " + ufdqm);
244            assertTrue("ufd != Quotient<ModInteger> " + ufdqm, ufdqm instanceof FactorQuotient);
245    
246            prfac = new GenPolynomialRing<BigRational>(br, 2);
247            GenPolynomialRing<GenPolynomial<BigRational>> rrfac = new GenPolynomialRing<GenPolynomial<BigRational>>(
248                    prfac, 1);
249            Factorization<BigRational> ufdrr = FactorFactory.<BigRational> getImplementation(prfac);
250            //System.out.println("ufdrr = " + ufdrr);
251            assertTrue("ufd != GenPolynomial<GenPolynomialBigRational>> " + ufdrr,
252                    ufdrr instanceof FactorRational);
253        }
254    
255    
256        /**
257         * Test rational absolute factorization, Rothstein-Trager step.
258         * 
259         */
260        public void xtestBaseRationalAbsoluteFactorizationRoT() {
261    
262            TermOrder to = new TermOrder(TermOrder.INVLEX);
263            BigRational cfac = new BigRational(1);
264            String[] alpha = new String[] { "alpha" };
265            String[] vars = new String[] { "x" };
266            GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, vars);
267            GenPolynomial<BigRational> agen = pfac.univariate(0, 4);
268            agen = agen.sum(pfac.fromInteger(4)); // x^4 + 4
269    
270            //         GenPolynomial<BigRational> x6 = pfac.univariate(0, 6);
271            //         GenPolynomial<BigRational> x4 = pfac.univariate(0, 4);
272            //         GenPolynomial<BigRational> x2 = pfac.univariate(0, 2);
273            //         // x^6 - 5 x^4 + 5 x^2 + 4
274            //         agen = x6.subtract(x4.multiply(pfac.fromInteger(5))); 
275            //         agen = agen.sum(x2.multiply(pfac.fromInteger(5))); 
276            //         agen = agen.sum(pfac.fromInteger(4)); 
277    
278            //         GenPolynomial<BigRational> x3 = pfac.univariate(0, 3);
279            //         GenPolynomial<BigRational> x = pfac.univariate(0);
280            //         // x^3 + x
281            //         agen = x3.sum(x); 
282    
283            GenPolynomial<BigRational> x2 = pfac.univariate(0, 2);
284            // x^2 - 2
285            agen = x2.subtract(pfac.fromInteger(2));
286    
287            GenPolynomial<BigRational> N = pfac.getONE();
288    
289            FactorRational engine = new FactorRational();
290    
291            PartialFraction<BigRational> F = engine.baseAlgebraicPartialFraction(N, agen);
292            //System.out.println("\npartial fraction = " + F);
293    
294            //boolean t = engine.isAbsoluteFactorization(F);
295            //System.out.println("t        = " + t);
296            // assertTrue("prod(factor(a)) = a", t);
297        }
298    
299    }