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