001/* 002 * $Id: RootUtilTest.java 5688 2017-01-03 08:45:09Z kredel $ 003 */ 004 005package edu.jas.root; 006 007 008import java.util.ArrayList; 009import java.util.List; 010 011import junit.framework.Test; 012import junit.framework.TestCase; 013import junit.framework.TestSuite; 014 015import edu.jas.arith.BigDecimal; 016import edu.jas.arith.BigRational; 017import edu.jas.arith.Roots; 018import edu.jas.kern.ComputerThreads; 019import edu.jas.poly.Complex; 020import edu.jas.poly.ComplexRing; 021import edu.jas.poly.GenPolynomial; 022import edu.jas.poly.GenPolynomialRing; 023import edu.jas.poly.PolyUtil; 024import edu.jas.poly.TermOrder; 025import edu.jas.structure.Power; 026 027 028/** 029 * RootUtil tests with JUnit. 030 * @author Heinz Kredel 031 */ 032 033public 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 assertTrue("#roots >= 0 ", lrn != null); 204 for (RealAlgebraicNumber<BigRational> ra : lrn) { 205 //System.out.println("ra = " + ra.toScript() + " in " + ra.toScriptFactory()); 206 assertTrue("f(r) == 0: " + ra, RootFactory.<BigRational> isRoot(a,ra)); 207 } 208 209 lrn = RootFactory.<BigRational> realAlgebraicNumbersField(a); 210 //System.out.println("lrn = " + lrn); 211 assertTrue("#roots >= 0 ", lrn != null); 212 for (RealAlgebraicNumber<BigRational> ra : lrn) { 213 //System.out.println("ra = " + ra.toScript() + " in " + ra.toScriptFactory()); 214 assertTrue("f(r) == 0: " + ra, RootFactory.<BigRational> isRoot(a,ra)); 215 } 216 } 217 218 219 /** 220 * Test complex algebraic factory. 221 */ 222 public void testComplexAlgebraicFactory() { 223 a = dfac.random(kl, ll, el, q); 224 //a = a.multiply( dfac.univariate(0) ); 225 //System.out.println("a = " + a); 226 ComplexRing<BigRational> cf = new ComplexRing<BigRational>(new BigRational()); 227 GenPolynomialRing<Complex<BigRational>> cfac = new GenPolynomialRing<Complex<BigRational>>(cf, dfac); 228 229 GenPolynomial<Complex<BigRational>> ca = PolyUtil.<BigRational> toComplex(cfac, a); 230 //System.out.println("ca = " + ca); 231 List<ComplexAlgebraicNumber<BigRational>> lcn = RootFactory.<BigRational> complexAlgebraicNumbersComplex(ca); 232 //System.out.println("lcn = " + lcn); 233 assertTrue("#roots == deg(a): " + a, lcn.size() == a.degree(0)); 234 235 for (ComplexAlgebraicNumber<BigRational> car : lcn) { 236 //System.out.println("car = " + car.toScript() + " in " + car.toScriptFactory()); 237 //System.out.println("car = " + car.ring.root); 238 //System.out.println("car = " + car.ring.root.centerApprox() + ", " 239 // + (Roots.sqrt(new BigDecimal(car.ring.root.rationalLength()))) + ", " + car.ring.root); 240 assertTrue("f(r) == 0: " + car, RootFactory.<BigRational> isRoot(a,car)); 241 } 242 } 243 244 245 /** 246 * Test complex rational factory. 247 */ 248 public void testComplexRationalFactory() { 249 a = dfac.random(kl, ll, el, q); 250 //a = a.multiply( dfac.univariate(0) ); 251 //a = dfac.parse(" 1/8 x^6 - 5/3 x^5 + 3/20 x^4 - 2 x^3 "); 252 //System.out.println("a = " + a); 253 254 List<ComplexAlgebraicNumber<BigRational>> lcn = RootFactory.<BigRational> complexAlgebraicNumbers(a); 255 //System.out.println("lcn = " + lcn); 256 assertTrue("#roots == deg(a): " + a, lcn.size() == a.degree(0)); 257 258 for (ComplexAlgebraicNumber<BigRational> car : lcn) { 259 //System.out.println("car = " + car.toScript() + " in " + car.toScriptFactory()); 260 //System.out.println("car = " + car.ring.root); 261 //System.out.println("car = " + car.ring.root.centerApprox() + ", " 262 // + (Roots.sqrt(new BigDecimal(car.ring.root.rationalLength()))) + ", " + car.ring.root); 263 assertTrue("f(r) == 0: " + car, RootFactory.<BigRational> isRoot(a,car)); 264 } 265 } 266}