001/*
002 * $Id: FactorTest.java 4076 2012-07-28 11:03:10Z kredel $
003 */
004
005package edu.jas.ufd;
006
007
008import junit.framework.Test;
009import junit.framework.TestCase;
010import junit.framework.TestSuite;
011
012import edu.jas.arith.BigInteger;
013import edu.jas.arith.BigRational;
014import edu.jas.arith.ModInteger;
015import edu.jas.arith.ModIntegerRing;
016import edu.jas.arith.ModLong;
017import edu.jas.arith.ModLongRing;
018import edu.jas.kern.ComputerThreads;
019import edu.jas.poly.AlgebraicNumber;
020import edu.jas.poly.AlgebraicNumberRing;
021import edu.jas.poly.GenPolynomial;
022import edu.jas.poly.GenPolynomialRing;
023import edu.jas.poly.TermOrder;
024import edu.jas.structure.RingFactory;
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        //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        assertFalse("pf not empty " + F, F.toString().length() == 0); // java-5
294        // TODO test for PartialFraction
295    }
296
297}