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