001/*
002 * $Id$
003 */
004
005package edu.jas.ufd;
006
007
008import java.util.SortedMap;
009
010import edu.jas.arith.BigRational;
011import edu.jas.kern.ComputerThreads;
012import edu.jas.poly.Complex;
013import edu.jas.poly.ComplexRing;
014import edu.jas.poly.GenPolynomial;
015import edu.jas.poly.GenPolynomialRing;
016import edu.jas.poly.TermOrder;
017import edu.jas.poly.TermOrderByName;
018
019import junit.framework.Test;
020import junit.framework.TestCase;
021import junit.framework.TestSuite;
022
023
024/**
025 * Factor complex via algebraic tests with JUnit.
026 * @author Heinz Kredel
027 */
028public class FactorComplexTest extends TestCase {
029
030
031    /**
032     * main.
033     */
034    public static void main(String[] args) {
035        junit.textui.TestRunner.run(suite());
036    }
037
038
039    /**
040     * Constructs a <CODE>FactorComplexTest</CODE> object.
041     * @param name String.
042     */
043    public FactorComplexTest(String name) {
044        super(name);
045    }
046
047
048    /**
049     */
050    public static Test suite() {
051        TestSuite suite = new TestSuite(FactorComplexTest.class);
052        return suite;
053    }
054
055
056    int rl = 3;
057
058
059    int kl = 5;
060
061
062    int ll = 5;
063
064
065    int el = 3;
066
067
068    float q = 0.3f;
069
070
071    @Override
072    protected void setUp() {
073    }
074
075
076    @Override
077    protected void tearDown() {
078        ComputerThreads.terminate();
079    }
080
081
082    /**
083     * Test dummy for empty test cases Junit.
084     */
085    public void xtestDummy() {
086    }
087
088
089    /**
090     * Test complex via algebraic factorization.
091     */
092    public void testComplexFactorization() {
093        TermOrder to = new TermOrder(TermOrder.INVLEX);
094        BigRational rfac = new BigRational(1);
095        ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(rfac);
096        GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 1,
097                        to);
098        //System.out.println("cfac  = " + cfac);
099        //System.out.println("cpfac = " + cpfac);
100
101        FactorComplex<BigRational> fac = new FactorComplex<BigRational>(cfac);
102
103        for (int i = 1; i < 3; i++) {
104            int facs = 0;
105            GenPolynomial<Complex<BigRational>> a;
106            GenPolynomial<Complex<BigRational>> c = cpfac.random(2, ll + i, el + i, q);
107            //a = a.monic();
108            GenPolynomial<Complex<BigRational>> b = cpfac.random(2, ll + i, el + i, q);
109            if (b.degree() == 0) {
110                b = b.multiply(cpfac.univariate(0));
111            }
112            if (c.degree() > 0) {
113                facs++;
114            }
115            b = b.multiply(b);
116            if (b.degree() > 0) {
117                facs++;
118            }
119            a = c.multiply(b);
120            //a = a.monic();
121            //System.out.println("\na = " + a);
122            //System.out.println("b = " + b.monic());
123            //System.out.println("c = " + c.monic());
124
125            SortedMap<GenPolynomial<Complex<BigRational>>, Long> sm = fac.baseFactors(a);
126            //System.out.println("\na   =  " + a);
127            //System.out.println("sm = " + sm);
128            if (sm.size() >= facs) {
129                assertTrue("#facs < " + facs, sm.size() >= facs);
130            } else {
131                System.out.println("sm.size() < facs = " + facs);
132            }
133            boolean t = fac.isFactorization(a, sm);
134            //System.out.println("t        = " + t);
135            assertTrue("prod(factor(a)) = a", t);
136        }
137    }
138
139
140    /**
141     * Test complex absolute via algebraic factorization.
142     */
143    public void testComplexAbsoluteFactorization() {
144        TermOrder to = new TermOrder(TermOrder.INVLEX);
145        BigRational rfac = new BigRational(1);
146        ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(rfac);
147        GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 1,
148                        to);
149        //System.out.println("cfac  = " + cfac);
150        //System.out.println("cpfac = " + cpfac);
151
152        FactorComplex<BigRational> fac = new FactorComplex<BigRational>(cfac);
153
154        for (int i = 1; i < 2; i++) {
155            int facs = 0;
156            GenPolynomial<Complex<BigRational>> a;
157            GenPolynomial<Complex<BigRational>> c = cpfac.random(2, ll, el, q);
158            //a = a.monic();
159            GenPolynomial<Complex<BigRational>> b = cpfac.random(2, ll, el, q);
160            if (b.degree() == 0) {
161                b = b.multiply(cpfac.univariate(0));
162            }
163            if (c.degree() > 0) {
164                facs++;
165            }
166            b = b.multiply(b);
167            if (b.degree() > 0) {
168                facs++;
169            }
170            a = c.multiply(b);
171            //a = a.monic();
172            //System.out.println("\na = " + a);
173            //System.out.println("b = " + b.monic());
174            //System.out.println("c = " + c.monic());
175
176            FactorsMap<Complex<BigRational>> sm = fac.baseFactorsAbsolute(a);
177            //System.out.println("\na   =  " + a);
178            //System.out.println("sm = " + sm);
179            boolean t = fac.isAbsoluteFactorization(sm);
180            //System.out.println("t        = " + t);
181            assertTrue("prod(factor(a)) = a", t);
182            assertTrue("facs <= #sm", facs <= sm.length());
183        }
184    }
185
186
187    /**
188     * Test bivariate complex via algebraic factorization.
189     */
190    public void testBivariateComplexFactorization() {
191        TermOrder to = new TermOrder(TermOrder.INVLEX);
192        BigRational rfac = new BigRational(1);
193        ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(rfac);
194        GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 2,
195                        to);
196        //System.out.println("cfac  = " + cfac);
197        //System.out.println("cpfac = " + cpfac);
198
199        FactorComplex<BigRational> fac = new FactorComplex<BigRational>(cfac);
200
201        for (int i = 1; i < 2; i++) {
202            int facs = 0;
203            GenPolynomial<Complex<BigRational>> a;
204            GenPolynomial<Complex<BigRational>> c = cpfac.random(2, ll + i, el, q);
205            //a = a.monic();
206            GenPolynomial<Complex<BigRational>> b = cpfac.random(2, ll + i, el, q);
207            if (b.degree() == 0) {
208                b = b.multiply(cpfac.univariate(0));
209            }
210            if (c.degree() > 0) {
211                facs++;
212            }
213            if (b.degree() > 0) {
214                facs++;
215            }
216            a = c.multiply(b);
217            //a = a.monic();
218            //System.out.println("\na = " + a);
219            //System.out.println("b = " + b.monic());
220            //System.out.println("c = " + c.monic());
221
222            SortedMap<GenPolynomial<Complex<BigRational>>, Long> sm = fac.factors(a);
223            //System.out.println("\na   =  " + a);
224            //System.out.println("sm = " + sm);
225            if (sm.size() >= facs) {
226                assertTrue("#facs < " + facs, sm.size() >= facs);
227            } else {
228                System.out.println("sm.size() < facs = " + facs);
229            }
230            boolean t = fac.isFactorization(a, sm);
231            //System.out.println("t        = " + t);
232            assertTrue("prod(factor(a)) = a", t);
233        }
234    }
235
236
237    /**
238     * Test bivariate complex factorization. Example from issue 10:
239     * https://github.com/kredel/java-algebra-system/issues/10
240     */
241    public void testComplexFactor() {
242        ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(BigRational.ZERO);
243        GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac,
244                        new String[] { "x1", "x0" }, TermOrderByName.INVLEX);
245        // GenPolynomial<Complex<BigRational>> a = cpfac.parse("x1^2 + x0^2") ; 
246        // GenPolynomial<Complex<BigRational>> a = cpfac.parse("x1^4 + x0^4") ; 
247        // GenPolynomial<Complex<BigRational>> a = cpfac.parse("x1^8 + x0^8") ; 
248        GenPolynomial<Complex<BigRational>> a = cpfac.parse("x1^12 - x0^12");
249        FactorComplex<BigRational> factorAbstract = new FactorComplex<BigRational>(cfac);
250        //System.out.println("factorAbstract = " + factorAbstract);
251        //System.out.println("factorFac      = " + FactorFactory.getImplementation(cfac));
252        SortedMap<GenPolynomial<Complex<BigRational>>, Long> map = factorAbstract.factors(a);
253
254        for (SortedMap.Entry<GenPolynomial<Complex<BigRational>>, Long> entry : map.entrySet()) {
255            if (entry.getKey().isONE() && entry.getValue().equals(1L)) {
256                continue;
257            }
258            assertTrue("degree <= 2 ", entry.getKey().degree() <= 2);
259            // System.out.print(" ( " + entry.getKey().toScript() + " )");
260            // if (!entry.getValue().equals(1L)) {
261            //     System.out.print(" ^ " + entry.getValue());
262            // }
263            // System.out.println();
264        }
265        boolean t = factorAbstract.isFactorization(a, map);
266        //System.out.println("t        = " + t);
267        assertTrue("prod(factor(a)) = a", t);
268    }
269
270}