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