001 /*
002 * $Id: FactorRealRealTest.java 3670 2011-06-25 19:04:28Z kredel $
003 */
004
005 package edu.jas.application;
006
007
008 import java.util.SortedMap;
009 import java.util.List;
010
011 import org.apache.log4j.BasicConfigurator;
012
013 import junit.framework.Test;
014 import junit.framework.TestCase;
015 import junit.framework.TestSuite;
016
017 import edu.jas.arith.BigRational;
018 import edu.jas.kern.ComputerThreads;
019 import edu.jas.poly.AlgebraicNumber;
020 import edu.jas.poly.AlgebraicNumberRing;
021 import edu.jas.poly.GenPolynomial;
022 import edu.jas.poly.GenPolynomialRing;
023 import edu.jas.poly.TermOrder;
024 import edu.jas.poly.Complex;
025 import edu.jas.poly.ComplexRing;
026 import edu.jas.root.Interval;
027 import edu.jas.root.RootUtil;
028
029
030 /**
031 * Factor real algebraic tests with JUnit.
032 * @author Heinz Kredel.
033 */
034
035 public class FactorRealRealTest extends TestCase {
036
037
038 /**
039 * main.
040 */
041 public static void main(String[] args) {
042 BasicConfigurator.configure();
043 junit.textui.TestRunner.run(suite());
044 }
045
046
047 /**
048 * Constructs a <CODE>FactorRealRealTest</CODE> object.
049 * @param name String.
050 */
051 public FactorRealRealTest(String name) {
052 super(name);
053 }
054
055
056 /**
057 */
058 public static Test suite() {
059 TestSuite suite = new TestSuite(FactorRealRealTest.class);
060 return suite;
061 }
062
063
064 int rl = 1;
065
066
067 int kl = 5;
068
069
070 int ll = 5;
071
072
073 int el = 3;
074
075
076 float q = 0.3f;
077
078
079 @Override
080 protected void setUp() {
081 }
082
083
084 @Override
085 protected void tearDown() {
086 ComputerThreads.terminate();
087 }
088
089
090 /**
091 * Test dummy for Junit.
092 */
093 public void testDummy() {
094 }
095
096
097 /**
098 * Test real real algebraic factorization.
099 */
100 public void testRealRealAlgebraicFactorization() {
101
102 TermOrder to = new TermOrder(TermOrder.INVLEX);
103 BigRational bfac = new BigRational(1);
104
105 ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(bfac);
106 String[] vars = new String[] { "z" };
107 GenPolynomialRing<Complex<BigRational>> dfac = new GenPolynomialRing<Complex<BigRational>>(cfac, to, vars);
108 GenPolynomial<Complex<BigRational>> ap = dfac.parse("z^3 - i2");
109
110 List<Complex<RealAlgebraicNumber<BigRational>>> roots
111 = RootFactory.<BigRational> complexAlgebraicNumbersComplex(ap);
112 //System.out.println("ap = " + ap);
113 //System.out.println("roots = " + roots);
114 assertTrue("#roots == deg(ap) ", roots.size() == ap.degree(0));
115
116 for ( Complex<RealAlgebraicNumber<BigRational>> root : roots ) {
117 RealAlgebraicRing<BigRational> rfac = root.getRe().ring;
118 FactorRealReal<BigRational> fac = new FactorRealReal<BigRational>(rfac);
119 String[] var = new String[] { "t" };
120 GenPolynomialRing<RealAlgebraicNumber<BigRational>> rpfac
121 = new GenPolynomialRing<RealAlgebraicNumber<BigRational>>(rfac, to, var); // univariate
122
123 GenPolynomial<RealAlgebraicNumber<BigRational>> a;
124 GenPolynomial<RealAlgebraicNumber<BigRational>> b = rpfac.random(2, ll, el, q);
125 GenPolynomial<RealAlgebraicNumber<BigRational>> c = rpfac.random(2, ll, el, q);
126 if (b.degree() == 0) {
127 b = b.multiply(rpfac.univariate(0));
128 }
129 //b = b.monic();
130 int facs = 0;
131 if (c.degree() > 0) {
132 facs++;
133 }
134 if (b.degree() > 0) {
135 facs++;
136 }
137 a = c.multiply(b);
138 //a = c;
139 //a = a.monic();
140 //System.out.println("\na = " + a);
141 //System.out.println("b = " + b);
142 //System.out.println("c = " + c);
143 //System.out.println("b = " + b.monic());
144 //System.out.println("c = " + c.monic());
145
146 SortedMap<GenPolynomial<RealAlgebraicNumber<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 break;
158 }
159 }
160
161 }