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