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