001/*
002 * $Id: FactorRealAlgebraicTest.java 4010 2012-07-21 20:39:56Z kredel $
003 */
004
005package edu.jas.ufdroot;
006
007
008import java.util.SortedMap;
009
010import org.apache.log4j.BasicConfigurator;
011
012import junit.framework.Test;
013import junit.framework.TestCase;
014import junit.framework.TestSuite;
015
016import edu.jas.arith.BigRational;
017import edu.jas.kern.ComputerThreads;
018import edu.jas.poly.AlgebraicNumber;
019import edu.jas.poly.AlgebraicNumberRing;
020import edu.jas.poly.GenPolynomial;
021import edu.jas.poly.GenPolynomialRing;
022import edu.jas.poly.TermOrder;
023import edu.jas.root.RealAlgebraicNumber;
024import edu.jas.root.RealAlgebraicRing;
025import edu.jas.root.Interval;
026import edu.jas.root.RootUtil;
027import edu.jas.ufdroot.FactorRealAlgebraic;
028
029
030/**
031 * Factor real algebraic tests with JUnit.
032 * @author Heinz Kredel.
033 */
034
035public class FactorRealAlgebraicTest 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>FactorRealAlgebraicTest</CODE> object.
049     * @param name String.
050     */
051    public FactorRealAlgebraicTest(String name) {
052        super(name);
053    }
054
055
056    /**
057     */
058    public static Test suite() {
059        TestSuite suite = new TestSuite(FactorRealAlgebraicTest.class);
060        return suite;
061    }
062
063
064    int rl = 3;
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 algebraic factorization.
099     */
100    public void testRealAlgebraicFactorization() {
101
102        TermOrder to = new TermOrder(TermOrder.INVLEX);
103        BigRational cfac = new BigRational(1);
104        String[] alpha = new String[] { "alpha" };
105        String[] vars = new String[] { "z" };
106        GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, alpha);
107        GenPolynomial<BigRational> agen = pfac.univariate(0, 2);
108        //agen = agen.subtract(pfac.getONE()); // x^2 - 1
109        agen = agen.subtract(pfac.fromInteger(2)); // x^2 - 2
110        //AlgebraicNumberRing<BigRational> afac = new AlgebraicNumberRing<BigRational>(agen, true);
111        Interval<BigRational> iv = RootUtil.<BigRational>parseInterval(cfac, "[0,2]");
112        //System.out.println("iv = " + iv);
113        RealAlgebraicRing<BigRational> rfac = new RealAlgebraicRing<BigRational>(agen,iv,true);
114
115        GenPolynomialRing<RealAlgebraicNumber<BigRational>> rpfac = new GenPolynomialRing<RealAlgebraicNumber<BigRational>>(
116                rfac, 1, to, vars); // univariate
117
118        //System.out.println("agen  = " + agen);
119        //System.out.println("afac  = " + afac);
120        //System.out.println("rfac  = " + rfac);
121        //System.out.println("rpfac = " + rpfac);
122
123        FactorRealAlgebraic<BigRational> fac = new FactorRealAlgebraic<BigRational>(rfac);
124
125        for (int i = 1; i < 2; i++) {
126            int facs = 0;
127            GenPolynomial<RealAlgebraicNumber<BigRational>> a;
128            GenPolynomial<RealAlgebraicNumber<BigRational>> c = rpfac.random(2, ll + i, el + i, q);
129            GenPolynomial<RealAlgebraicNumber<BigRational>> b = rpfac.random(2, ll + i, el + i, q);
130            if (b.degree() == 0) {
131                b = b.multiply(rpfac.univariate(0));
132            }
133            //b = b.monic();
134            //if ( false && ! a.leadingBaseCoefficient().isONE() ) {
135            //continue;
136            //ExpVector e = a.leadingExpVector();
137            //a.doPutToMap(e,cfac.getONE());
138            //}
139            if (c.degree() > 0) {
140                facs++;
141            }
142            if (b.degree() > 0) {
143                facs++;
144            }
145            //a = apfac.univariate(0,2).sum( apfac.getONE() ); // x^2 + 1 
146            //a = a.multiply(a);
147            //a = a.multiply( apfac.univariate(0,2).subtract( apfac.getONE() ) ); // x^2 - 1 
148            //a = apfac.univariate(0,3).subtract( apfac.getONE() ); // x^3 - 1 
149            //a = apfac.univariate(0,3).sum( apfac.getONE() ); // x^3 + 1 
150            a = c.multiply(b);
151            //a = c;
152            //a = a.monic();
153            //System.out.println("\na = " + a);
154            //System.out.println("b = " + b);
155            //System.out.println("c = " + c);
156            //System.out.println("b = " + b.monic());
157            //System.out.println("c = " + c.monic());
158
159            SortedMap<GenPolynomial<RealAlgebraicNumber<BigRational>>, Long> sm = fac.baseFactors(a);
160            //System.out.println("\na   =  " + a);
161            //System.out.println("sm = " + sm);
162            if (sm.size() >= facs) {
163                assertTrue("#facs < " + facs, sm.size() >= facs);
164            } else {
165                System.out.println("sm.size() < facs = " + facs);
166            }
167            boolean t = fac.isFactorization(a, sm);
168            //System.out.println("t        = " + t);
169            assertTrue("prod(factor(a)) = a", t);
170        }
171    }
172
173}