001/*
002 * $Id$
003 */
004
005package edu.jas.application;
006
007
008import java.util.SortedMap;
009
010import junit.framework.Test;
011import junit.framework.TestCase;
012import junit.framework.TestSuite;
013
014
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;
023
024
025/**
026 * Factor algebraic tests with JUnit.
027 * @author Heinz Kredel
028 */
029
030public class FactorAlgebraicPrimTest extends TestCase {
031
032
033    /**
034     * main.
035     */
036    public static void main(String[] args) {
037        //
038        junit.textui.TestRunner.run(suite());
039    }
040
041
042    /**
043     * Constructor.
044     * @param name String.
045     */
046    public FactorAlgebraicPrimTest(String name) {
047        super(name);
048    }
049
050
051    /**
052     */
053    public static Test suite() {
054        TestSuite suite = new TestSuite(FactorAlgebraicPrimTest.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 algebraic factorization.
095     * 
096     */
097    public void testAlgebraicFactorization() {
098
099        TermOrder to = new TermOrder(TermOrder.INVLEX);
100        BigRational cfac = new BigRational(1);
101        String[] alpha = new String[] { "alpha" };
102        String[] vars = new String[] { "z" };
103        GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, alpha);
104        GenPolynomial<BigRational> agen = pfac.univariate(0, 2);
105        agen = agen.sum(pfac.getONE()); // x^2 + 1
106        AlgebraicNumberRing<BigRational> afac = new AlgebraicNumberRing<BigRational>(agen, true);
107        GenPolynomialRing<AlgebraicNumber<BigRational>> apfac = new GenPolynomialRing<AlgebraicNumber<BigRational>>(
108                afac, 1, to, vars); // univariate
109
110        //System.out.println("agen  = " + agen);
111        //System.out.println("afac  = " + afac);
112        //System.out.println("apfac = " + apfac);
113
114        FactorAlgebraicPrim<BigRational> fac = new FactorAlgebraicPrim<BigRational>(afac);
115
116        for (int i = 1; i < 7; i++) {
117            int facs = 0;
118            GenPolynomial<AlgebraicNumber<BigRational>> a;
119            GenPolynomial<AlgebraicNumber<BigRational>> c = apfac.random(2, ll + i, el + i, q);
120            //a = a.monic();
121            GenPolynomial<AlgebraicNumber<BigRational>> b = apfac.random(2, ll + i, el + i, q);
122            if (b.degree() == 0) {
123                b = b.multiply(apfac.univariate(0));
124            }
125            //b = b.monic();
126            //if ( false && ! a.leadingBaseCoefficient().isONE() ) {
127            //continue;
128            //ExpVector e = a.leadingExpVector();
129            //a.doPutToMap(e,cfac.getONE());
130            //}
131            if (c.degree() > 0) {
132                facs++;
133            }
134            if (b.degree() > 0) {
135                facs++;
136            }
137            //a = apfac.univariate(0,2).sum( apfac.getONE() ); // x^2 + 1 
138            //a = a.multiply(a);
139            //a = a.multiply( apfac.univariate(0,2).subtract( apfac.getONE() ) ); // x^2 - 1 
140            //a = apfac.univariate(0,3).subtract( apfac.getONE() ); // x^3 - 1 
141            //a = apfac.univariate(0,3).sum( apfac.getONE() ); // x^3 + 1 
142            a = c.multiply(b);
143            //a = a.monic();
144            //System.out.println("\na = " + a);
145            //System.out.println("b = " + b.monic());
146            //System.out.println("c = " + c.monic());
147
148            SortedMap<GenPolynomial<AlgebraicNumber<BigRational>>, Long> smi, smr;
149
150            long si = System.currentTimeMillis();
151            smi = fac.baseFactors(a);
152            si = System.currentTimeMillis() - si;
153            //System.out.println("\na   =  " + a);
154            //System.out.println("sm = " + sm);
155            if (smi.size() >= facs) {
156                assertTrue("#facs < " + facs, smi.size() >= facs);
157            } else {
158                System.out.println("smi.size() < facs = " + facs);
159            }
160            boolean t = fac.isFactorization(a, smi);
161            //System.out.println("t        = " + t);
162            assertTrue("prod(factor(a)) = a", t);
163
164            long sr = System.currentTimeMillis();
165            smr = new edu.jas.ufd.FactorAlgebraic<BigRational>(afac).baseFactors(a);
166            sr = System.currentTimeMillis() - sr;
167            //System.out.println("\na   =  " + a);
168            //System.out.println("smr = " + smr);
169            if (smr.size() >= facs) {
170                assertTrue("#facs < " + facs, smr.size() >= facs);
171            } else {
172                System.out.println("smr.size() < facs = " + facs);
173            }
174            t = fac.isFactorization(a, smr);
175            //System.out.println("t        = " + t);
176            assertTrue("prod(factor(a)) = a", t);
177            //System.out.println("time: si = " + si + ", sr = " + sr + " milliseconds");
178            assertTrue("positive times", sr >= 0L && si >= 0L);
179            assertEquals("smi == smr: ", smi, smr);
180        }
181    }
182
183}