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 }