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