001/*
002 * $Id: FactorTest.java 5813 2018-04-25 21:29:28Z 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        //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    public void testDummy() {
092    }
093
094
095    /**
096     * Test factory.
097     */
098    public void testFactory() {
099        ModIntegerRing mi = new ModIntegerRing(19, true);
100        Factorization<ModInteger> ufdm = FactorFactory.getImplementation(mi);
101        //System.out.println("ufdm = " + ufdm);
102        assertTrue("ufd != Modular " + ufdm, ufdm instanceof FactorModular);
103
104        ModLongRing ml = new ModLongRing(19, true);
105        Factorization<ModLong> ufdml = FactorFactory.getImplementation(ml);
106        //System.out.println("ufdml = " + ufdml);
107        assertTrue("ufd != Modular " + ufdml, ufdml instanceof FactorModular);
108
109        BigInteger bi = new BigInteger(1);
110        Factorization<BigInteger> ufdi = FactorFactory.getImplementation(bi);
111        //System.out.println("ufdi = " + ufdi);
112        assertTrue("ufd != Integer " + ufdi, ufdi instanceof FactorInteger);
113
114        BigRational br = new BigRational(1);
115        Factorization<BigRational> ufdr = FactorFactory.getImplementation(br);
116        //System.out.println("ufdr = " + ufdr);
117        assertTrue("ufd != Rational " + ufdr, ufdr instanceof FactorRational);
118
119        GenPolynomialRing<ModInteger> pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
120        GenPolynomial<ModInteger> pm = pmfac.univariate(0);
121        AlgebraicNumberRing<ModInteger> am = new AlgebraicNumberRing<ModInteger>(pm, true);
122        Factorization<AlgebraicNumber<ModInteger>> ufdam = FactorFactory.getImplementation(am);
123        //System.out.println("ufdam = " + ufdam);
124        assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorAlgebraic);
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.
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
168        GenPolynomialRing<BigRational> prfac = new GenPolynomialRing<BigRational>(br, 1);
169        GenPolynomial<BigRational> pr = prfac.univariate(0);
170        AlgebraicNumberRing<BigRational> ar = new AlgebraicNumberRing<BigRational>(pr, true);
171        Factorization<AlgebraicNumber<BigRational>> ufdar = FactorFactory.getImplementation((RingFactory) ar);
172        //System.out.println("ufdar = " + ufdar);
173        assertTrue("ufd != AlgebraicNumber<BigRational> " + ufdar, ufdar instanceof FactorAlgebraic);
174
175        prfac = new GenPolynomialRing<BigRational>(br, 2);
176        QuotientRing<BigRational> qrfac = new QuotientRing<BigRational>(prfac);
177        Factorization<Quotient<BigRational>> ufdqr = FactorFactory.getImplementation((RingFactory) qrfac);
178        //System.out.println("ufdqr = " + ufdqr);
179        assertTrue("ufd != Quotient<BigRational> " + ufdqr, ufdqr instanceof FactorQuotient);
180
181        pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
182        QuotientRing<ModInteger> qmfac = new QuotientRing<ModInteger>(pmfac);
183        Factorization<Quotient<ModInteger>> ufdqm = FactorFactory.getImplementation((RingFactory) qmfac);
184        //System.out.println("ufdqm = " + ufdqm);
185        assertTrue("ufd != Quotient<ModInteger> " + ufdqm, ufdqm instanceof FactorQuotient);
186
187        prfac = new GenPolynomialRing<BigRational>(br, 2);
188        GenPolynomialRing<GenPolynomial<BigRational>> rrfac = new GenPolynomialRing<GenPolynomial<BigRational>>(
189                        prfac, 1);
190        Factorization<BigRational> ufdrr = FactorFactory.getImplementation((RingFactory) rrfac);
191        //System.out.println("ufdrr = " + ufdrr);
192        assertTrue("ufd != GenPolynomial<GenPolynomialBigRational>> " + ufdrr,
193                        ufdrr instanceof FactorRational);
194    }
195
196
197    /**
198     * Test factory specific.
199     */
200    public void testFactorySpecific() {
201        ModIntegerRing mi = new ModIntegerRing(19, true);
202        Factorization<ModInteger> ufdm = FactorFactory.getImplementation(mi);
203        //System.out.println("ufdm = " + ufdm);
204        assertTrue("ufd != Modular " + ufdm, ufdm instanceof FactorModular);
205
206        BigInteger bi = new BigInteger(1);
207        Factorization<BigInteger> ufdi = FactorFactory.getImplementation(bi);
208        //System.out.println("ufdi = " + ufdi);
209        assertTrue("ufd != Integer " + ufdi, ufdi instanceof FactorInteger);
210
211        BigRational br = new BigRational(1);
212        Factorization<BigRational> ufdr = FactorFactory.getImplementation(br);
213        //System.out.println("ufdr = " + ufdr);
214        assertTrue("ufd != Rational " + ufdr, ufdr instanceof FactorRational);
215
216        GenPolynomialRing<ModInteger> pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
217        GenPolynomial<ModInteger> pm = pmfac.univariate(0);
218        AlgebraicNumberRing<ModInteger> am = new AlgebraicNumberRing<ModInteger>(pm, true);
219        Factorization<AlgebraicNumber<ModInteger>> ufdam = FactorFactory.<ModInteger> getImplementation(am);
220        //System.out.println("ufdam = " + ufdam);
221        assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorAlgebraic);
222
223        GenPolynomialRing<BigRational> prfac = new GenPolynomialRing<BigRational>(br, 1);
224        GenPolynomial<BigRational> pr = prfac.univariate(0);
225        AlgebraicNumberRing<BigRational> ar = new AlgebraicNumberRing<BigRational>(pr, true);
226        Factorization<AlgebraicNumber<BigRational>> ufdar = FactorFactory.<BigRational> getImplementation(ar);
227        //System.out.println("ufdar = " + ufdar);
228        assertTrue("ufd != AlgebraicNumber<BigRational> " + ufdar, ufdar instanceof FactorAlgebraic);
229
230        prfac = new GenPolynomialRing<BigRational>(br, 2);
231        QuotientRing<BigRational> qrfac = new QuotientRing<BigRational>(prfac);
232        Factorization<Quotient<BigRational>> ufdqr = FactorFactory.<BigRational> getImplementation(qrfac);
233        //System.out.println("ufdqr = " + ufdqr);
234        assertTrue("ufd != Quotient<BigRational> " + ufdqr, ufdqr instanceof FactorQuotient);
235
236        pmfac = new GenPolynomialRing<ModInteger>(mi, 1);
237        QuotientRing<ModInteger> qmfac = new QuotientRing<ModInteger>(pmfac);
238        Factorization<Quotient<ModInteger>> ufdqm = FactorFactory.<ModInteger> getImplementation(qmfac);
239        //System.out.println("ufdqm = " + ufdqm);
240        assertTrue("ufd != Quotient<ModInteger> " + ufdqm, ufdqm instanceof FactorQuotient);
241
242        prfac = new GenPolynomialRing<BigRational>(br, 2);
243        //GenPolynomialRing<GenPolynomial<BigRational>> rrfac = new GenPolynomialRing<GenPolynomial<BigRational>>(
244        //        prfac, 1);
245        Factorization<BigRational> ufdrr = FactorFactory.<BigRational> getImplementation(prfac);
246        //System.out.println("ufdrr = " + ufdrr);
247        assertTrue("ufd != GenPolynomial<GenPolynomialBigRational>> " + ufdrr,
248                        ufdrr instanceof FactorRational);
249    }
250
251
252    /**
253     * Test rational absolute factorization, for elementary integration.
254     */
255    public void testBaseRationalAbsoluteFactorization() {
256        TermOrder to = new TermOrder(TermOrder.INVLEX);
257        BigRational cfac = new BigRational(1);
258        //String[] alpha = new String[] { "alpha" };
259        String[] vars = new String[] { "x" };
260        GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, vars);
261        GenPolynomial<BigRational> agen = pfac.univariate(0, 4);
262        agen = agen.sum(pfac.fromInteger(4)); // x^4 + 4
263
264        // GenPolynomial<BigRational> x6 = pfac.univariate(0, 6);
265        // GenPolynomial<BigRational> x4 = pfac.univariate(0, 4);
266        // GenPolynomial<BigRational> x2 = pfac.univariate(0, 2);
267        // // x^6 - 5 x^4 + 5 x^2 + 4
268        // agen = x6.subtract(x4.multiply(pfac.fromInteger(5))); 
269        // agen = agen.sum(x2.multiply(pfac.fromInteger(5))); 
270        // agen = agen.sum(pfac.fromInteger(4)); 
271
272        // GenPolynomial<BigRational> x3 = pfac.univariate(0, 3);
273        // GenPolynomial<BigRational> x = pfac.univariate(0);
274        // // x^3 + x
275        // agen = x3.sum(x); 
276
277        // GenPolynomial<BigRational> x2 = pfac.univariate(0, 2);
278        // // x^2 - 2
279        // agen = x2.subtract(pfac.fromInteger(2));
280
281        GenPolynomial<BigRational> N = pfac.getONE();
282        FactorRational engine = new FactorRational();
283        PartialFraction<BigRational> F = engine.baseAlgebraicPartialFraction(N, agen);
284        //System.out.println("\npartial fraction: " + F.toScript());
285        assertTrue("is partial fraction: " + F, F.isPartialFraction());
286    }
287
288}