001/*
002 * $Id: FactorComplexTest.java 5049 2014-12-30 19:40:29Z 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        //BasicConfigurator.configure();
036        junit.textui.TestRunner.run(suite());
037    }
038
039
040    /**
041     * Constructs a <CODE>FactorComplexTest</CODE> object.
042     * @param name String.
043     */
044    public FactorComplexTest(String name) {
045        super(name);
046    }
047
048
049    /**
050     */
051    public static Test suite() {
052        TestSuite suite = new TestSuite(FactorComplexTest.class);
053        return suite;
054    }
055
056
057    int rl = 3;
058
059
060    int kl = 5;
061
062
063    int ll = 5;
064
065
066    int el = 3;
067
068
069    float q = 0.3f;
070
071
072    @Override
073    protected void setUp() {
074    }
075
076
077    @Override
078    protected void tearDown() {
079        ComputerThreads.terminate();
080    }
081
082
083    /**
084     * Test dummy for Junit.
085     * 
086     */
087    public void testDummy() {
088    }
089
090
091    /**
092     * Test complex via algebraic factorization.
093     * 
094     */
095    public void testComplexFactorization() {
096
097        TermOrder to = new TermOrder(TermOrder.INVLEX);
098        BigRational rfac = new BigRational(1);
099        ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(rfac);
100        GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 1,
101                        to);
102        //System.out.println("cfac  = " + cfac);
103        //System.out.println("cpfac = " + cpfac);
104
105        FactorComplex<BigRational> fac = new FactorComplex<BigRational>(cfac);
106
107        for (int i = 1; i < 3; i++) {
108            int facs = 0;
109            GenPolynomial<Complex<BigRational>> a;
110            GenPolynomial<Complex<BigRational>> c = cpfac.random(2, ll + i, el + i, q);
111            //a = a.monic();
112            GenPolynomial<Complex<BigRational>> b = cpfac.random(2, ll + i, el + i, q);
113            if (b.degree() == 0) {
114                b = b.multiply(cpfac.univariate(0));
115            }
116            if (c.degree() > 0) {
117                facs++;
118            }
119            b = b.multiply(b);
120            if (b.degree() > 0) {
121                facs++;
122            }
123            a = c.multiply(b);
124            //a = a.monic();
125            //System.out.println("\na = " + a);
126            //System.out.println("b = " + b.monic());
127            //System.out.println("c = " + c.monic());
128
129            SortedMap<GenPolynomial<Complex<BigRational>>, Long> sm = fac.baseFactors(a);
130            //System.out.println("\na   =  " + a);
131            //System.out.println("sm = " + sm);
132            if (sm.size() >= facs) {
133                assertTrue("#facs < " + facs, sm.size() >= facs);
134            } else {
135                System.out.println("sm.size() < facs = " + facs);
136            }
137            boolean t = fac.isFactorization(a, sm);
138            //System.out.println("t        = " + t);
139            assertTrue("prod(factor(a)) = a", t);
140        }
141    }
142
143
144    /**
145     * Test complex absolute via algebraic factorization.
146     * 
147     */
148    public void testComplexAbsoluteFactorization() {
149
150        TermOrder to = new TermOrder(TermOrder.INVLEX);
151        BigRational rfac = new BigRational(1);
152        ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(rfac);
153        GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 1,
154                        to);
155        //System.out.println("cfac  = " + cfac);
156        //System.out.println("cpfac = " + cpfac);
157
158        FactorComplex<BigRational> fac = new FactorComplex<BigRational>(cfac);
159
160        for (int i = 1; i < 2; i++) {
161            int facs = 0;
162            GenPolynomial<Complex<BigRational>> a;
163            GenPolynomial<Complex<BigRational>> c = cpfac.random(2, ll, el, q);
164            //a = a.monic();
165            GenPolynomial<Complex<BigRational>> b = cpfac.random(2, ll, el, q);
166            if (b.degree() == 0) {
167                b = b.multiply(cpfac.univariate(0));
168            }
169            if (c.degree() > 0) {
170                facs++;
171            }
172            b = b.multiply(b);
173            if (b.degree() > 0) {
174                facs++;
175            }
176            a = c.multiply(b);
177            //a = a.monic();
178            //System.out.println("\na = " + a);
179            //System.out.println("b = " + b.monic());
180            //System.out.println("c = " + c.monic());
181
182            FactorsMap<Complex<BigRational>> sm = fac.baseFactorsAbsolute(a);
183            //System.out.println("\na   =  " + a);
184            //System.out.println("sm = " + sm);
185            boolean t = fac.isAbsoluteFactorization(sm);
186            //System.out.println("t        = " + t);
187            assertTrue("prod(factor(a)) = a", t);
188            assertTrue("facs <= #sm", facs <= sm.length());
189        }
190    }
191
192
193    /**
194     * Test bivariate complex via algebraic factorization.
195     * 
196     */
197    public void testBivariateComplexFactorization() {
198
199        TermOrder to = new TermOrder(TermOrder.INVLEX);
200        BigRational rfac = new BigRational(1);
201        ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(rfac);
202        GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 2,
203                        to);
204        //System.out.println("cfac  = " + cfac);
205        //System.out.println("cpfac = " + cpfac);
206
207        FactorComplex<BigRational> fac = new FactorComplex<BigRational>(cfac);
208
209        for (int i = 1; i < 2; i++) {
210            int facs = 0;
211            GenPolynomial<Complex<BigRational>> a;
212            GenPolynomial<Complex<BigRational>> c = cpfac.random(2, ll + i, el, q);
213            //a = a.monic();
214            GenPolynomial<Complex<BigRational>> b = cpfac.random(2, ll + i, el, q);
215            if (b.degree() == 0) {
216                b = b.multiply(cpfac.univariate(0));
217            }
218            if (c.degree() > 0) {
219                facs++;
220            }
221            if (b.degree() > 0) {
222                facs++;
223            }
224            a = c.multiply(b);
225            //a = a.monic();
226            //System.out.println("\na = " + a);
227            //System.out.println("b = " + b.monic());
228            //System.out.println("c = " + c.monic());
229
230            SortedMap<GenPolynomial<Complex<BigRational>>, Long> sm = fac.factors(a);
231            //System.out.println("\na   =  " + a);
232            //System.out.println("sm = " + sm);
233            if (sm.size() >= facs) {
234                assertTrue("#facs < " + facs, sm.size() >= facs);
235            } else {
236                System.out.println("sm.size() < facs = " + facs);
237            }
238            boolean t = fac.isFactorization(a, sm);
239            //System.out.println("t        = " + t);
240            assertTrue("prod(factor(a)) = a", t);
241        }
242    }
243
244}