001    /*
002     * $Id: FactorRealRealTest.java 3670 2011-06-25 19:04:28Z kredel $
003     */
004    
005    package edu.jas.application;
006    
007    
008    import java.util.SortedMap;
009    import java.util.List;
010    
011    import org.apache.log4j.BasicConfigurator;
012    
013    import junit.framework.Test;
014    import junit.framework.TestCase;
015    import junit.framework.TestSuite;
016    
017    import edu.jas.arith.BigRational;
018    import edu.jas.kern.ComputerThreads;
019    import edu.jas.poly.AlgebraicNumber;
020    import edu.jas.poly.AlgebraicNumberRing;
021    import edu.jas.poly.GenPolynomial;
022    import edu.jas.poly.GenPolynomialRing;
023    import edu.jas.poly.TermOrder;
024    import edu.jas.poly.Complex;
025    import edu.jas.poly.ComplexRing;
026    import edu.jas.root.Interval;
027    import edu.jas.root.RootUtil;
028    
029    
030    /**
031     * Factor real algebraic tests with JUnit.
032     * @author Heinz Kredel.
033     */
034    
035    public class FactorRealRealTest extends TestCase {
036    
037    
038        /**
039         * main.
040         */
041        public static void main(String[] args) {
042            BasicConfigurator.configure();
043            junit.textui.TestRunner.run(suite());
044        }
045    
046    
047        /**
048         * Constructs a <CODE>FactorRealRealTest</CODE> object.
049         * @param name String.
050         */
051        public FactorRealRealTest(String name) {
052            super(name);
053        }
054    
055    
056        /**
057         */
058        public static Test suite() {
059            TestSuite suite = new TestSuite(FactorRealRealTest.class);
060            return suite;
061        }
062    
063    
064        int rl = 1;
065    
066    
067        int kl = 5;
068    
069    
070        int ll = 5;
071    
072    
073        int el = 3;
074    
075    
076        float q = 0.3f;
077    
078    
079        @Override
080        protected void setUp() {
081        }
082    
083    
084        @Override
085        protected void tearDown() {
086            ComputerThreads.terminate();
087        }
088    
089    
090        /**
091         * Test dummy for Junit.
092         */
093        public void testDummy() {
094        }
095    
096    
097        /**
098         * Test real real algebraic factorization.
099         */
100        public void testRealRealAlgebraicFactorization() {
101    
102            TermOrder to = new TermOrder(TermOrder.INVLEX);
103            BigRational bfac = new BigRational(1);
104    
105            ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(bfac);
106            String[] vars = new String[] { "z" };
107            GenPolynomialRing<Complex<BigRational>> dfac = new GenPolynomialRing<Complex<BigRational>>(cfac, to, vars);
108            GenPolynomial<Complex<BigRational>> ap = dfac.parse("z^3 - i2");
109    
110            List<Complex<RealAlgebraicNumber<BigRational>>> roots
111                = RootFactory.<BigRational> complexAlgebraicNumbersComplex(ap); 
112            //System.out.println("ap = " + ap);
113            //System.out.println("roots = " + roots);
114            assertTrue("#roots == deg(ap) ", roots.size() == ap.degree(0));
115    
116            for ( Complex<RealAlgebraicNumber<BigRational>> root : roots ) {
117                RealAlgebraicRing<BigRational> rfac = root.getRe().ring;
118                FactorRealReal<BigRational> fac = new FactorRealReal<BigRational>(rfac);
119                String[] var = new String[] { "t" };
120                GenPolynomialRing<RealAlgebraicNumber<BigRational>> rpfac 
121                    = new GenPolynomialRing<RealAlgebraicNumber<BigRational>>(rfac, to, var); // univariate
122    
123                GenPolynomial<RealAlgebraicNumber<BigRational>> a;
124                GenPolynomial<RealAlgebraicNumber<BigRational>> b = rpfac.random(2, ll, el, q);
125                GenPolynomial<RealAlgebraicNumber<BigRational>> c = rpfac.random(2, ll, el, q);
126                if (b.degree() == 0) {
127                    b = b.multiply(rpfac.univariate(0));
128                }
129                //b = b.monic();
130                int facs = 0;
131                if (c.degree() > 0) {
132                    facs++;
133                }
134                if (b.degree() > 0) {
135                    facs++;
136                }
137                a = c.multiply(b);
138                //a = c;
139                //a = a.monic();
140                //System.out.println("\na = " + a);
141                //System.out.println("b = " + b);
142                //System.out.println("c = " + c);
143                //System.out.println("b = " + b.monic());
144                //System.out.println("c = " + c.monic());
145    
146                SortedMap<GenPolynomial<RealAlgebraicNumber<BigRational>>, Long> sm = fac.baseFactors(a);
147                //System.out.println("\na   =  " + a);
148                //System.out.println("sm = " + sm);
149                if (sm.size() >= facs) {
150                    assertTrue("#facs < " + facs, sm.size() >= facs);
151                } else {
152                    System.out.println("sm.size() < facs = " + facs);
153                }
154                boolean t = fac.isFactorization(a, sm);
155                //System.out.println("t        = " + t);
156                assertTrue("prod(factor(a)) = a", t);
157                break;
158            }
159        }
160    
161    }