001 /*
002 * $Id: RootUtilTest.java 3630 2011-05-12 21:44:36Z kredel $
003 */
004
005 package edu.jas.root;
006
007
008 import java.util.ArrayList;
009 import java.util.List;
010
011 import junit.framework.Test;
012 import junit.framework.TestCase;
013 import junit.framework.TestSuite;
014
015 import edu.jas.arith.BigDecimal;
016 import edu.jas.arith.BigRational;
017 import edu.jas.arith.Roots;
018 import edu.jas.kern.ComputerThreads;
019 import edu.jas.poly.Complex;
020 import edu.jas.poly.ComplexRing;
021 import edu.jas.poly.GenPolynomial;
022 import edu.jas.poly.GenPolynomialRing;
023 import edu.jas.poly.PolyUtil;
024 import edu.jas.poly.TermOrder;
025 import edu.jas.structure.Power;
026
027
028 /**
029 * RootUtil tests with JUnit.
030 * @author Heinz Kredel.
031 */
032
033 public class RootUtilTest extends TestCase {
034
035
036 /**
037 * main.
038 */
039 public static void main(String[] args) {
040 junit.textui.TestRunner.run(suite());
041 }
042
043
044 /**
045 * Constructs a <CODE>RootUtilTest</CODE> object.
046 * @param name String.
047 */
048 public RootUtilTest(String name) {
049 super(name);
050 }
051
052
053 /**
054 */
055 public static Test suite() {
056 TestSuite suite = new TestSuite(RootUtilTest.class);
057 return suite;
058 }
059
060
061 //private final static int bitlen = 100;
062
063 TermOrder to = new TermOrder(TermOrder.INVLEX);
064
065
066 GenPolynomialRing<BigRational> dfac;
067
068
069 BigRational ai;
070
071
072 BigRational bi;
073
074
075 BigRational ci;
076
077
078 BigRational di;
079
080
081 BigRational ei;
082
083
084 BigRational eps;
085
086
087 GenPolynomial<BigRational> a;
088
089
090 GenPolynomial<BigRational> b;
091
092
093 GenPolynomial<BigRational> c;
094
095
096 GenPolynomial<BigRational> d;
097
098
099 GenPolynomial<BigRational> e;
100
101
102 int rl = 1;
103
104
105 int kl = 3;
106
107
108 int ll = 5;
109
110
111 int el = 7;
112
113
114 float q = 0.7f;
115
116
117 @Override
118 protected void setUp() {
119 a = b = c = d = e = null;
120 ai = bi = ci = di = ei = null;
121 String[] vars = new String[] { "x" };
122 dfac = new GenPolynomialRing<BigRational>(new BigRational(1), rl, to, vars);
123 // eps = new BigRational(1L,1000000L*1000000L*1000000L);
124 eps = Power.positivePower(new BigRational(1L, 10L), BigDecimal.DEFAULT_PRECISION);
125 }
126
127
128 @Override
129 protected void tearDown() {
130 a = b = c = d = e = null;
131 ai = bi = ci = di = ei = null;
132 dfac = null;
133 eps = null;
134 ComputerThreads.terminate();
135 }
136
137
138 /**
139 * Test sign variations.
140 */
141 public void testSignVar() {
142 int[] li = new int[] { 1, 0, 0, -1, 2, 3, 0, 1, 0, 0, 0, -1 };
143
144 List<BigRational> Li = new ArrayList<BigRational>();
145
146 ai = new BigRational();
147
148 for (int i = 0; i < li.length; i++) {
149 bi = ai.fromInteger(li[i]);
150 Li.add(bi);
151 }
152 //System.out.println("Li = " + Li);
153
154 long v = RootUtil.<BigRational> signVar(Li);
155 //System.out.println("v = " + v);
156
157 assertEquals("varSign(Li)", v, 3);
158
159 List<BigRational> Mi = new ArrayList<BigRational>();
160 for (int i = 0; i < 7; i++) {
161 bi = ai.random(kl);
162 Mi.add(bi);
163 }
164 //System.out.println("Mi = " + Mi);
165
166 v = RootUtil.<BigRational> signVar(Mi);
167 //System.out.println("v = " + v);
168 long vv = v;
169
170 assertTrue("varSign(Mi)>=0", v >= 0);
171
172 List<BigRational> Ni = new ArrayList<BigRational>(Mi);
173 Ni.addAll(Li);
174 //System.out.println("Ni = " + Ni);
175
176 v = RootUtil.<BigRational> signVar(Ni);
177 //System.out.println("v = " + v);
178
179 assertTrue("varSign(Mi)>=3", v >= 3 + vv);
180
181 Ni = new ArrayList<BigRational>(Ni);
182 Ni.addAll(Mi);
183 //System.out.println("Ni = " + Ni);
184
185 v = RootUtil.<BigRational> signVar(Ni);
186 //System.out.println("v = " + v);
187
188 assertTrue("varSign(Mi)>=3", v >= 3 + vv);
189 }
190
191
192 /**
193 * Test real algebraic factory.
194 */
195 public void testRealAlgebraicFactory() {
196 a = dfac.random(kl, ll * 2, el * 2, q);
197 //a = a.multiply( dfac.univariate(0) );
198 //System.out.println("a = " + a);
199
200 List<RealAlgebraicNumber<BigRational>> lrn = RootFactory.<BigRational> realAlgebraicNumbers(a);
201 //System.out.println("lrn = " + lrn);
202 assertTrue("#roots >= 0 ", lrn.size() >= 0);
203 for (RealAlgebraicNumber<BigRational> ra : lrn) {
204 //System.out.println("ra = " + ra.toScript() + " in " + ra.toScriptFactory());
205 assertTrue("f(r) == 0: " + ra, RootFactory.<BigRational> isRoot(a,ra));
206 }
207
208 lrn = RootFactory.<BigRational> realAlgebraicNumbersField(a);
209 //System.out.println("lrn = " + lrn);
210 assertTrue("#roots >= 0 ", lrn.size() >= 0);
211 for (RealAlgebraicNumber<BigRational> ra : lrn) {
212 //System.out.println("ra = " + ra.toScript() + " in " + ra.toScriptFactory());
213 assertTrue("f(r) == 0: " + ra, RootFactory.<BigRational> isRoot(a,ra));
214 }
215 }
216
217
218 /**
219 * Test complex algebraic factory.
220 */
221 public void testComplexAlgebraicFactory() {
222 a = dfac.random(kl, ll, el, q);
223 //a = a.multiply( dfac.univariate(0) );
224 //System.out.println("a = " + a);
225 ComplexRing<BigRational> cf = new ComplexRing<BigRational>(new BigRational());
226 GenPolynomialRing<Complex<BigRational>> cfac = new GenPolynomialRing<Complex<BigRational>>(cf, dfac);
227
228 GenPolynomial<Complex<BigRational>> ca = PolyUtil.<BigRational> toComplex(cfac, a);
229 //System.out.println("ca = " + ca);
230 List<ComplexAlgebraicNumber<BigRational>> lcn = RootFactory.<BigRational> complexAlgebraicNumbersComplex(ca);
231 //System.out.println("lcn = " + lcn);
232 assertTrue("#roots == deg(a): " + lcn.size() + " != " + a.degree(0), lcn.size() == a.degree(0));
233
234 for (ComplexAlgebraicNumber<BigRational> car : lcn) {
235 //System.out.println("car = " + car.toScript() + " in " + car.toScriptFactory());
236 //System.out.println("car = " + car.ring.root);
237 //System.out.println("car = " + car.ring.root.centerApprox() + ", "
238 // + (Roots.sqrt(new BigDecimal(car.ring.root.rationalLength()))) + ", " + car.ring.root);
239 assertTrue("f(r) == 0: " + car, RootFactory.<BigRational> isRoot(a,car));
240 }
241 }
242
243
244 /**
245 * Test complex rational factory.
246 */
247 public void testComplexRationalFactory() {
248 a = dfac.random(kl, ll, el, q);
249 //a = a.multiply( dfac.univariate(0) );
250 //System.out.println("a = " + a);
251
252 List<ComplexAlgebraicNumber<BigRational>> lcn = RootFactory.<BigRational> complexAlgebraicNumbers(a);
253 //System.out.println("lcn = " + lcn);
254 assertTrue("#roots == deg(a) " + lcn.size() + ", " + a.degree(0), lcn.size() == a.degree(0));
255
256 for (ComplexAlgebraicNumber<BigRational> car : lcn) {
257 //System.out.println("car = " + car.toScript() + " in " + car.toScriptFactory());
258 //System.out.println("car = " + car.ring.root);
259 //System.out.println("car = " + car.ring.root.centerApprox() + ", "
260 // + (Roots.sqrt(new BigDecimal(car.ring.root.rationalLength()))) + ", " + car.ring.root);
261 assertTrue("f(r) == 0: " + car, RootFactory.<BigRational> isRoot(a,car));
262 }
263 }
264 }