001/*
002 * $Id: FactorComplexTest.java 5863 2018-07-20 11:13:34Z kredel $
003 */
004
005package edu.jas.ufd;
006
007
008import java.util.SortedMap;
009
010import junit.framework.Test;
011import junit.framework.TestCase;
012import junit.framework.TestSuite;
013
014import edu.jas.arith.BigRational;
015import edu.jas.kern.ComputerThreads;
016import edu.jas.poly.Complex;
017import edu.jas.poly.ComplexRing;
018import edu.jas.poly.GenPolynomial;
019import edu.jas.poly.GenPolynomialRing;
020import edu.jas.poly.TermOrder;
021
022
023/**
024 * Factor complex via algebraic tests with JUnit.
025 * @author Heinz Kredel
026 */
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 Junit.
084     * 
085     */
086    public void testDummy() {
087    }
088
089
090    /**
091     * Test complex via algebraic factorization.
092     * 
093     */
094    public void testComplexFactorization() {
095
096        TermOrder to = new TermOrder(TermOrder.INVLEX);
097        BigRational rfac = new BigRational(1);
098        ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(rfac);
099        GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 1,
100                        to);
101        //System.out.println("cfac  = " + cfac);
102        //System.out.println("cpfac = " + cpfac);
103
104        FactorComplex<BigRational> fac = new FactorComplex<BigRational>(cfac);
105
106        for (int i = 1; i < 3; i++) {
107            int facs = 0;
108            GenPolynomial<Complex<BigRational>> a;
109            GenPolynomial<Complex<BigRational>> c = cpfac.random(2, ll + i, el + i, q);
110            //a = a.monic();
111            GenPolynomial<Complex<BigRational>> b = cpfac.random(2, ll + i, el + i, q);
112            if (b.degree() == 0) {
113                b = b.multiply(cpfac.univariate(0));
114            }
115            if (c.degree() > 0) {
116                facs++;
117            }
118            b = b.multiply(b);
119            if (b.degree() > 0) {
120                facs++;
121            }
122            a = c.multiply(b);
123            //a = a.monic();
124            //System.out.println("\na = " + a);
125            //System.out.println("b = " + b.monic());
126            //System.out.println("c = " + c.monic());
127
128            SortedMap<GenPolynomial<Complex<BigRational>>, Long> sm = fac.baseFactors(a);
129            //System.out.println("\na   =  " + a);
130            //System.out.println("sm = " + sm);
131            if (sm.size() >= facs) {
132                assertTrue("#facs < " + facs, sm.size() >= facs);
133            } else {
134                System.out.println("sm.size() < facs = " + facs);
135            }
136            boolean t = fac.isFactorization(a, sm);
137            //System.out.println("t        = " + t);
138            assertTrue("prod(factor(a)) = a", t);
139        }
140    }
141
142
143    /**
144     * Test complex absolute via algebraic factorization.
145     * 
146     */
147    public void testComplexAbsoluteFactorization() {
148
149        TermOrder to = new TermOrder(TermOrder.INVLEX);
150        BigRational rfac = new BigRational(1);
151        ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(rfac);
152        GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 1,
153                        to);
154        //System.out.println("cfac  = " + cfac);
155        //System.out.println("cpfac = " + cpfac);
156
157        FactorComplex<BigRational> fac = new FactorComplex<BigRational>(cfac);
158
159        for (int i = 1; i < 2; i++) {
160            int facs = 0;
161            GenPolynomial<Complex<BigRational>> a;
162            GenPolynomial<Complex<BigRational>> c = cpfac.random(2, ll, el, q);
163            //a = a.monic();
164            GenPolynomial<Complex<BigRational>> b = cpfac.random(2, ll, el, q);
165            if (b.degree() == 0) {
166                b = b.multiply(cpfac.univariate(0));
167            }
168            if (c.degree() > 0) {
169                facs++;
170            }
171            b = b.multiply(b);
172            if (b.degree() > 0) {
173                facs++;
174            }
175            a = c.multiply(b);
176            //a = a.monic();
177            //System.out.println("\na = " + a);
178            //System.out.println("b = " + b.monic());
179            //System.out.println("c = " + c.monic());
180
181            FactorsMap<Complex<BigRational>> sm = fac.baseFactorsAbsolute(a);
182            //System.out.println("\na   =  " + a);
183            //System.out.println("sm = " + sm);
184            boolean t = fac.isAbsoluteFactorization(sm);
185            //System.out.println("t        = " + t);
186            assertTrue("prod(factor(a)) = a", t);
187            assertTrue("facs <= #sm", facs <= sm.length());
188        }
189    }
190
191
192    /**
193     * Test bivariate complex via algebraic factorization.
194     * 
195     */
196    public void testBivariateComplexFactorization() {
197
198        TermOrder to = new TermOrder(TermOrder.INVLEX);
199        BigRational rfac = new BigRational(1);
200        ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(rfac);
201        GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 2,
202                        to);
203        //System.out.println("cfac  = " + cfac);
204        //System.out.println("cpfac = " + cpfac);
205
206        FactorComplex<BigRational> fac = new FactorComplex<BigRational>(cfac);
207
208        for (int i = 1; i < 2; i++) {
209            int facs = 0;
210            GenPolynomial<Complex<BigRational>> a;
211            GenPolynomial<Complex<BigRational>> c = cpfac.random(2, ll + i, el, q);
212            //a = a.monic();
213            GenPolynomial<Complex<BigRational>> b = cpfac.random(2, ll + i, el, q);
214            if (b.degree() == 0) {
215                b = b.multiply(cpfac.univariate(0));
216            }
217            if (c.degree() > 0) {
218                facs++;
219            }
220            if (b.degree() > 0) {
221                facs++;
222            }
223            a = c.multiply(b);
224            //a = a.monic();
225            //System.out.println("\na = " + a);
226            //System.out.println("b = " + b.monic());
227            //System.out.println("c = " + c.monic());
228
229            SortedMap<GenPolynomial<Complex<BigRational>>, Long> sm = fac.factors(a);
230            //System.out.println("\na   =  " + a);
231            //System.out.println("sm = " + sm);
232            if (sm.size() >= facs) {
233                assertTrue("#facs < " + facs, sm.size() >= facs);
234            } else {
235                System.out.println("sm.size() < facs = " + facs);
236            }
237            boolean t = fac.isFactorization(a, sm);
238            //System.out.println("t        = " + t);
239            assertTrue("prod(factor(a)) = a", t);
240        }
241    }
242
243}