001/*
002 * $Id: FactorTest.java 5863 2018-07-20 11:13:34Z kredel $
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.
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
125        GenPolynomialRing<BigRational> prfac = new GenPolynomialRing<BigRational>(br, 1);
126        GenPolynomial<BigRational> pr = prfac.univariate(0);
127        AlgebraicNumberRing<BigRational> ar = new AlgebraicNumberRing<BigRational>(pr, true);
128        Factorization<AlgebraicNumber<BigRational>> ufdar = FactorFactory.getImplementation(ar);
129        //System.out.println("ufdar = " + ufdar);
130        assertTrue("ufd != AlgebraicNumber<BigRational> " + ufdar, ufdar instanceof FactorAlgebraic);
131
132        prfac = new GenPolynomialRing<BigRational>(br, 2);
133        QuotientRing<BigRational> qrfac = new QuotientRing<BigRational>(prfac);
134        Factorization<Quotient<BigRational>> ufdqr = FactorFactory.getImplementation(qrfac);
135        //System.out.println("ufdqr = " + ufdqr);
136        assertTrue("ufd != Quotient<BigRational> " + ufdqr, ufdqr instanceof FactorQuotient);
137    }
138
139
140    /**
141     * Test factory generic.
142     */
143    @SuppressWarnings("unchecked")
144    public void testFactoryGeneric() {
145        ModIntegerRing mi = new ModIntegerRing(19, true);
146        Factorization<ModInteger> ufdm = FactorFactory.getImplementation((RingFactory) mi);
147        //System.out.println("ufdm = " + ufdm);
148        assertTrue("ufd != Modular " + ufdm, ufdm instanceof FactorModular);
149
150        BigInteger bi = new BigInteger(1);
151        Factorization<BigInteger> ufdi = FactorFactory.getImplementation((RingFactory) bi);
152        //System.out.println("ufdi = " + ufdi);
153        assertTrue("ufd != Integer " + ufdi, ufdi instanceof FactorInteger);
154
155        BigRational br = new BigRational(1);
156        Factorization<BigRational> ufdr = FactorFactory.getImplementation((RingFactory) br);
157        //System.out.println("ufdr = " + ufdr);
158        assertTrue("ufd != Rational " + ufdr, ufdr instanceof FactorRational);
159
160        GenPolynomialRing<ModInteger> pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
161        GenPolynomial<ModInteger> pm = pmfac.univariate(0);
162        AlgebraicNumberRing<ModInteger> am = new AlgebraicNumberRing<ModInteger>(pm, true);
163        Factorization<AlgebraicNumber<ModInteger>> ufdam = FactorFactory.getImplementation((RingFactory) am);
164        //System.out.println("ufdam = " + ufdam);
165        assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorAlgebraic);
166
167        GenPolynomialRing<BigRational> prfac = new GenPolynomialRing<BigRational>(br, 1);
168        GenPolynomial<BigRational> pr = prfac.univariate(0);
169        AlgebraicNumberRing<BigRational> ar = new AlgebraicNumberRing<BigRational>(pr, true);
170        Factorization<AlgebraicNumber<BigRational>> ufdar = FactorFactory.getImplementation((RingFactory) ar);
171        //System.out.println("ufdar = " + ufdar);
172        assertTrue("ufd != AlgebraicNumber<BigRational> " + ufdar, ufdar instanceof FactorAlgebraic);
173
174        prfac = new GenPolynomialRing<BigRational>(br, 2);
175        QuotientRing<BigRational> qrfac = new QuotientRing<BigRational>(prfac);
176        Factorization<Quotient<BigRational>> ufdqr = FactorFactory.getImplementation((RingFactory) qrfac);
177        //System.out.println("ufdqr = " + ufdqr);
178        assertTrue("ufd != Quotient<BigRational> " + ufdqr, ufdqr instanceof FactorQuotient);
179
180        pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
181        QuotientRing<ModInteger> qmfac = new QuotientRing<ModInteger>(pmfac);
182        Factorization<Quotient<ModInteger>> ufdqm = FactorFactory.getImplementation((RingFactory) qmfac);
183        //System.out.println("ufdqm = " + ufdqm);
184        assertTrue("ufd != Quotient<ModInteger> " + ufdqm, ufdqm instanceof FactorQuotient);
185
186        prfac = new GenPolynomialRing<BigRational>(br, 2);
187        GenPolynomialRing<GenPolynomial<BigRational>> rrfac = new GenPolynomialRing<GenPolynomial<BigRational>>(
188                        prfac, 1);
189        Factorization<BigRational> ufdrr = FactorFactory.getImplementation((RingFactory) rrfac);
190        //System.out.println("ufdrr = " + ufdrr);
191        assertTrue("ufd != GenPolynomial<GenPolynomialBigRational>> " + ufdrr,
192                        ufdrr instanceof FactorRational);
193    }
194
195
196    /**
197     * Test factory specific.
198     */
199    public void testFactorySpecific() {
200        ModIntegerRing mi = new ModIntegerRing(19, true);
201        Factorization<ModInteger> ufdm = FactorFactory.getImplementation(mi);
202        //System.out.println("ufdm = " + ufdm);
203        assertTrue("ufd != Modular " + ufdm, ufdm instanceof FactorModular);
204
205        BigInteger bi = new BigInteger(1);
206        Factorization<BigInteger> ufdi = FactorFactory.getImplementation(bi);
207        //System.out.println("ufdi = " + ufdi);
208        assertTrue("ufd != Integer " + ufdi, ufdi instanceof FactorInteger);
209
210        BigRational br = new BigRational(1);
211        Factorization<BigRational> ufdr = FactorFactory.getImplementation(br);
212        //System.out.println("ufdr = " + ufdr);
213        assertTrue("ufd != Rational " + ufdr, ufdr instanceof FactorRational);
214
215        GenPolynomialRing<ModInteger> pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
216        GenPolynomial<ModInteger> pm = pmfac.univariate(0);
217        AlgebraicNumberRing<ModInteger> am = new AlgebraicNumberRing<ModInteger>(pm, true);
218        Factorization<AlgebraicNumber<ModInteger>> ufdam = FactorFactory.<ModInteger> getImplementation(am);
219        //System.out.println("ufdam = " + ufdam);
220        assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorAlgebraic);
221
222        GenPolynomialRing<BigRational> prfac = new GenPolynomialRing<BigRational>(br, 1);
223        GenPolynomial<BigRational> pr = prfac.univariate(0);
224        AlgebraicNumberRing<BigRational> ar = new AlgebraicNumberRing<BigRational>(pr, true);
225        Factorization<AlgebraicNumber<BigRational>> ufdar = FactorFactory.<BigRational> getImplementation(ar);
226        //System.out.println("ufdar = " + ufdar);
227        assertTrue("ufd != AlgebraicNumber<BigRational> " + ufdar, ufdar instanceof FactorAlgebraic);
228
229        prfac = new GenPolynomialRing<BigRational>(br, 2);
230        QuotientRing<BigRational> qrfac = new QuotientRing<BigRational>(prfac);
231        Factorization<Quotient<BigRational>> ufdqr = FactorFactory.<BigRational> getImplementation(qrfac);
232        //System.out.println("ufdqr = " + ufdqr);
233        assertTrue("ufd != Quotient<BigRational> " + ufdqr, ufdqr instanceof FactorQuotient);
234
235        pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
236        QuotientRing<ModInteger> qmfac = new QuotientRing<ModInteger>(pmfac);
237        Factorization<Quotient<ModInteger>> ufdqm = FactorFactory.<ModInteger> getImplementation(qmfac);
238        //System.out.println("ufdqm = " + ufdqm);
239        assertTrue("ufd != Quotient<ModInteger> " + ufdqm, ufdqm instanceof FactorQuotient);
240
241        prfac = new GenPolynomialRing<BigRational>(br, 2);
242        //GenPolynomialRing<GenPolynomial<BigRational>> rrfac = new GenPolynomialRing<GenPolynomial<BigRational>>(
243        //        prfac, 1);
244        Factorization<BigRational> ufdrr = FactorFactory.<BigRational> getImplementation(prfac);
245        //System.out.println("ufdrr = " + ufdrr);
246        assertTrue("ufd != GenPolynomial<GenPolynomialBigRational>> " + ufdrr,
247                        ufdrr instanceof FactorRational);
248    }
249
250
251    /**
252     * Test rational absolute factorization, for elementary integration.
253     */
254    public void testBaseRationalAbsoluteFactorization() {
255        TermOrder to = new TermOrder(TermOrder.INVLEX);
256        BigRational cfac = new BigRational(1);
257        //String[] alpha = new String[] { "alpha" };
258        String[] vars = new String[] { "x" };
259        GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, vars);
260        GenPolynomial<BigRational> agen = pfac.univariate(0, 4);
261        agen = agen.sum(pfac.fromInteger(4)); // x^4 + 4
262
263        // GenPolynomial<BigRational> x6 = pfac.univariate(0, 6);
264        // GenPolynomial<BigRational> x4 = pfac.univariate(0, 4);
265        // GenPolynomial<BigRational> x2 = pfac.univariate(0, 2);
266        // // x^6 - 5 x^4 + 5 x^2 + 4
267        // agen = x6.subtract(x4.multiply(pfac.fromInteger(5))); 
268        // agen = agen.sum(x2.multiply(pfac.fromInteger(5))); 
269        // agen = agen.sum(pfac.fromInteger(4)); 
270
271        // GenPolynomial<BigRational> x3 = pfac.univariate(0, 3);
272        // GenPolynomial<BigRational> x = pfac.univariate(0);
273        // // x^3 + x
274        // agen = x3.sum(x); 
275
276        // GenPolynomial<BigRational> x2 = pfac.univariate(0, 2);
277        // // x^2 - 2
278        // agen = x2.subtract(pfac.fromInteger(2));
279
280        GenPolynomial<BigRational> N = pfac.getONE();
281        FactorRational engine = new FactorRational();
282        PartialFraction<BigRational> F = engine.baseAlgebraicPartialFraction(N, agen);
283        //System.out.println("\npartial fraction: " + F.toScript());
284        assertTrue("is partial fraction: " + F, F.isPartialFraction());
285    }
286
287}