001    /*
002     * $Id: FactorComplexTest.java 3364 2010-10-24 12:56:06Z kredel $
003     */
004    
005    package edu.jas.ufd;
006    
007    
008    import java.util.SortedMap;
009    
010    import junit.framework.Test;
011    import junit.framework.TestCase;
012    import junit.framework.TestSuite;
013    
014    import org.apache.log4j.BasicConfigurator;
015    
016    import edu.jas.arith.BigRational;
017    import edu.jas.kern.ComputerThreads;
018    import edu.jas.poly.Complex;
019    import edu.jas.poly.ComplexRing;
020    import edu.jas.poly.GenPolynomial;
021    import edu.jas.poly.GenPolynomialRing;
022    import edu.jas.poly.TermOrder;
023    
024    
025    /**
026     * Factor complex via algebraic tests with JUnit.
027     * @author Heinz Kredel.
028     */
029    
030    public 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    }