001    /*
002     * $Id: FactorAlgebraicPrimTest.java 3650 2011-05-28 18:32:35Z kredel $
003     */
004    
005    package edu.jas.application;
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 org.apache.log4j.BasicConfigurator;
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    
024    
025    /**
026     * Factor algebraic tests with JUnit.
027     * @author Heinz Kredel.
028     */
029    
030    public class FactorAlgebraicPrimTest extends TestCase {
031    
032    
033        /**
034         * main.
035         */
036        public static void main(String[] args) {
037            //BasicConfigurator.configure();
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                long sp = System.currentTimeMillis();
149                SortedMap<GenPolynomial<AlgebraicNumber<BigRational>>, Long> sm = fac.baseFactors(a);
150                sp = System.currentTimeMillis() - sp;
151                //System.out.println("\na   =  " + a);
152                //System.out.println("sm = " + sm);
153                if (sm.size() >= facs) {
154                    assertTrue("#facs < " + facs, sm.size() >= facs);
155                } else {
156                    System.out.println("sm.size() < facs = " + facs);
157                }
158                boolean t = fac.isFactorization(a, sm);
159                //System.out.println("t        = " + t);
160                assertTrue("prod(factor(a)) = a", t);
161    
162                long sr = System.currentTimeMillis();
163                sm = new edu.jas.ufd.FactorAlgebraic<BigRational>(afac).baseFactors(a);
164                sr = System.currentTimeMillis() - sr;
165                //System.out.println("\na   =  " + a);
166                //System.out.println("sm = " + sm);
167                if (sm.size() >= facs) {
168                    assertTrue("#facs < " + facs, sm.size() >= facs);
169                } else {
170                    System.out.println("sm.size() < facs = " + facs);
171                }
172                t = fac.isFactorization(a, sm);
173                //System.out.println("t        = " + t);
174                assertTrue("prod(factor(a)) = a", t);
175                //System.out.println("time: sp = " + sp + ", sr = " + sr + " milliseconds");
176            }
177        }
178    
179    }