001/* 002 * $Id$ 003 */ 004 005package edu.jas.application; 006 007 008import java.util.ArrayList; 009import java.util.List; 010 011import edu.jas.arith.BigDecimal; 012import edu.jas.arith.BigRational; 013import edu.jas.kern.ComputerThreads; 014import edu.jas.poly.Complex; 015import edu.jas.poly.ComplexRing; 016import edu.jas.poly.GenPolynomial; 017import edu.jas.poly.GenPolynomialRing; 018import edu.jas.poly.TermOrder; 019import edu.jas.root.RealRootTuple; 020import edu.jas.structure.NotInvertibleException; 021import edu.jas.structure.Power; 022 023import junit.framework.Test; 024import junit.framework.TestCase; 025import junit.framework.TestSuite; 026 027 028/** 029 * RealAlgebraicNumber Test using JUnit. 030 * @author Heinz Kredel 031 */ 032 033public class RealAlgebraicTest 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>RealAlgebraicTest</CODE> object. 046 * @param name String. 047 */ 048 public RealAlgebraicTest(String name) { 049 super(name); 050 } 051 052 053 /** 054 * suite. 055 */ 056 public static Test suite() { 057 TestSuite suite = new TestSuite(RealAlgebraicTest.class); 058 return suite; 059 } 060 061 062 RealAlgebraicRing<BigRational> fac; 063 064 065 GenPolynomialRing<BigRational> mfac; 066 067 068 RealAlgebraicNumber<BigRational> a, b, c, d, e; 069 070 071 int rl = 2; 072 073 074 int kl = 10; 075 076 077 int ll = 10; 078 079 080 int el = ll; 081 082 083 float q = 0.5f; 084 085 086 @Override 087 protected void setUp() { 088 a = b = c = d = e = null; 089 BigRational rfac = new BigRational(); 090 String[] vars = new String[] { "x", "y" }; 091 rl = vars.length; 092 TermOrder tord = new TermOrder(TermOrder.INVLEX); 093 mfac = new GenPolynomialRing<BigRational>(rfac, tord, vars); 094 //System.out.println("mfac = " + mfac); 095 // z^3 - 2 i: z |--> x + i y 096 GenPolynomial<BigRational> fr = mfac.parse("y**3 - 3 * x**2 * y - 2"); 097 GenPolynomial<BigRational> fi = mfac.parse("-3 * x * y**2 + x**3"); 098 List<GenPolynomial<BigRational>> li = new ArrayList<GenPolynomial<BigRational>>(2); 099 li.add(fr); 100 li.add(fi); 101 Ideal<BigRational> id = new Ideal<BigRational>(mfac, li); 102 //System.out.println("id = " + id); 103 104 List<IdealWithUniv<BigRational>> idul = id.zeroDimRootDecomposition(); 105 IdealWithUniv<BigRational> idu = idul.get(0); 106 //if (idul.size() > 1) { 107 //System.out.println("idul = " + idul); 108 //idu = idul.get(1); 109 //} 110 //System.out.println("idu = " + idu); 111 GenPolynomial<BigRational> x = idu.ideal.list.list.remove(1); 112 //System.out.println("x = " + x); 113 x = x.multiply(x).subtract(mfac.fromInteger(3)); 114 //System.out.println("x = " + x); 115 idu.ideal.list.list.add(x); 116 //System.out.println("idu = " + idu); 117 118 IdealWithRealAlgebraicRoots<BigRational> idr = PolyUtilApp.<BigRational> realAlgebraicRoots(idu.ideal) 119 .get(0); 120 //System.out.println("idr = " + idr); 121 //idr.doDecimalApproximation(); 122 //for ( List<BigDecimal> d : idr.decimalApproximation() ) { 123 // System.out.println("d = " + d); 124 //} 125 List<List<edu.jas.root.RealAlgebraicNumber<BigRational>>> ran = idr.ran; 126 RealRootTuple<BigRational> root = new RealRootTuple<BigRational>(ran.get(0)); 127 if (ran.size() > 1) { 128 //System.out.println("ran = " + ran); 129 root = new RealRootTuple<BigRational>(ran.get(1)); 130 } 131 //System.out.println("root = " + root); 132 fac = new RealAlgebraicRing<BigRational>(idu, root); //,not true); 133 //System.out.println("fac = " + fac); 134 } 135 136 137 @Override 138 protected void tearDown() { 139 ComputerThreads.terminate(); 140 a = b = c = d = e = null; 141 fac = null; 142 } 143 144 145 /** 146 * Test constructor and toString. 147 */ 148 public void testConstruction() { 149 c = fac.getONE(); 150 //System.out.println("c = " + c); 151 //System.out.println("c.getVal() = " + c.getVal()); 152 //assertTrue("length( c ) = 1", c.number.getVal().length() == 1); 153 assertTrue("isZERO( c )", !c.isZERO()); 154 assertTrue("isONE( c )", c.isONE()); 155 156 d = fac.getZERO(); 157 //System.out.println("d = " + d); 158 //System.out.println("d.getVal() = " + d.getVal()); 159 //assertTrue("length( d ) = 0", d.number.getVal().length() == 0); 160 assertTrue("isZERO( d )", d.isZERO()); 161 assertTrue("isONE( d )", !d.isONE()); 162 163 String ts = fac.toScript(); 164 //System.out.println("ts = " + ts); 165 assertTrue("RealN in toScript", ts.indexOf("RealN") >= 0); 166 ts = fac.getRoot().toScript(); 167 //System.out.println("ts = " + ts); 168 assertTrue("ts = [x,y]", ts.indexOf("[x,y]") >= 0); 169 assertTrue("#rat(root) = 2", fac.getRoot().getRational().size() == rl); 170 assertTrue("#dec(root) = 2", fac.getRoot().decimalMagnitude().size() == rl); 171 } 172 173 174 /** 175 * Test random polynomial. 176 */ 177 public void testRandom() { 178 for (int i = 0; i < 7; i++) { 179 a = fac.random(el); 180 //System.out.println("a = " + a); 181 if (a.isZERO() || a.isONE()) { 182 continue; 183 } 184 // fac.random(kl*(i+1), ll+2*i, el+i, q ); 185 //assertTrue("length( a" + i + " ) <> 0", a.number.getVal().length() >= 0); 186 assertTrue(" not isZERO( a" + i + " )", !a.isZERO()); 187 assertTrue(" not isONE( a" + i + " )", !a.isONE()); 188 } 189 } 190 191 192 /** 193 * Test real and imaginary. 194 */ 195 public void testReIm() { 196 //System.out.println("fac = " + fac.toScript()); 197 a = fac.random(ll); 198 b = fac.random(ll); 199 //a = fac.getZERO(); 200 //a = fac.getONE(); 201 //a = fac.parse("x"); 202 //a = fac.parse("y^3 + 2"); 203 //a = fac.parse("3 y^2"); 204 //b = fac.parse("y"); 205 //System.out.println("a = " + a); 206 //System.out.println("b = " + b); 207 208 ComplexRing<RealAlgebraicNumber<BigRational>> crr; 209 crr = new ComplexRing<RealAlgebraicNumber<BigRational>>(fac); 210 211 Complex<RealAlgebraicNumber<BigRational>> ac, cc, dc, ec; 212 cc = new Complex<RealAlgebraicNumber<BigRational>>(crr, a, b); 213 //System.out.println("cc = " + cc); 214 assertEquals("a == re(c)", a, cc.getRe()); 215 assertEquals("b == im(c)", b, cc.getIm()); 216 217 dc = cc.conjugate(); 218 ec = dc.conjugate(); 219 //System.out.println("dc = " + dc); 220 //System.out.println("ec = " + ec); 221 assertEquals("con(con(c)) = c", cc, ec); 222 223 ac = cc.multiply(dc); 224 ec = cc.norm(); 225 //System.out.println("ac = " + ac); 226 //System.out.println("ec = " + ec); 227 228 c = ac.getRe(); 229 e = ec.getRe(); 230 //System.out.println("c = " + c); 231 //System.out.println("e = " + e); 232 assertEquals("c*con(c) = norm(c)", c, e); 233 234 c = ac.getIm(); 235 e = ec.getIm(); 236 //System.out.println("c = " + c); 237 //System.out.println("e = " + e); 238 assertEquals("c*con(c) = norm(c)", c, e); 239 } 240 241 242 /** 243 * Test addition. 244 */ 245 public void testAddition() { 246 a = fac.random(ll); 247 b = fac.random(ll); 248 249 c = a.sum(b); 250 d = c.subtract(b); 251 assertEquals("a+b-b = a", a, d); 252 253 c = a.sum(b); 254 d = b.sum(a); 255 assertEquals("a+b = b+a", c, d); 256 257 c = fac.random(ll); 258 d = c.sum(a.sum(b)); 259 e = c.sum(a).sum(b); 260 assertEquals("c+(a+b) = (c+a)+b", d, e); 261 262 c = a.sum(fac.getZERO()); 263 d = a.subtract(fac.getZERO()); 264 assertEquals("a+0 = a-0", c, d); 265 266 c = fac.getZERO().sum(a); 267 d = fac.getZERO().subtract(a.negate()); 268 assertEquals("0+a = 0+(-a)", c, d); 269 } 270 271 272 /** 273 * Test object multiplication. 274 */ 275 public void testMultiplication() { 276 a = fac.random(ll); 277 assertTrue("not isZERO( a )", !a.isZERO()); 278 279 b = fac.random(ll); 280 assertTrue("not isZERO( b )", !b.isZERO()); 281 282 c = b.multiply(a); 283 d = a.multiply(b); 284 assertTrue("not isZERO( c )", !c.isZERO()); 285 assertTrue("not isZERO( d )", !d.isZERO()); 286 287 //System.out.println("a = " + a); 288 //System.out.println("b = " + b); 289 e = d.subtract(c); 290 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO()); 291 292 assertTrue("a*b = b*a", c.equals(d)); 293 assertEquals("a*b = b*a", c, d); 294 295 c = fac.random(ll); 296 //System.out.println("c = " + c); 297 d = a.multiply(b.multiply(c)); 298 e = (a.multiply(b)).multiply(c); 299 300 //System.out.println("d = " + d); 301 //System.out.println("e = " + e); 302 303 //System.out.println("d-e = " + d.subtract(c) ); 304 305 assertEquals("a(bc) = (ab)c", d, e); 306 assertTrue("a(bc) = (ab)c", d.equals(e)); 307 308 c = a.multiply(fac.getONE()); 309 d = fac.getONE().multiply(a); 310 assertEquals("a*1 = 1*a", c, d); 311 312 313 c = a.inverse(); 314 d = c.multiply(a); 315 //System.out.println("a = " + a); 316 //System.out.println("c = " + c); 317 //System.out.println("d = " + d); 318 assertEquals("a*1/a = 1", fac.getONE(), d); 319 320 try { 321 a = fac.getZERO().inverse(); 322 fail("0 invertible"); 323 } catch (NotInvertibleException expected) { 324 //pass, return; 325 } 326 } 327 328 329 /** 330 * Test distributive law. 331 */ 332 public void testDistributive() { 333 a = fac.random(ll); 334 b = fac.random(ll); 335 c = fac.random(ll); 336 337 d = a.multiply(b.sum(c)); 338 e = a.multiply(b).sum(a.multiply(c)); 339 340 assertEquals("a(b+c) = ab+ac", d, e); 341 } 342 343 344 /** 345 * Test signum and magnitude. 346 */ 347 public void testSignum() { 348 a = fac.random(ll); 349 //a = fac.getONE(); 350 //System.out.println("a = " + a); 351 352 int s = a.signum(); 353 //System.out.println("sign(a) = " + s); 354 assertTrue("isZERO( c )", (a.isZERO() && s == 0) || (!a.isZERO() && s != 0)); 355 356 BigDecimal r = a.decimalMagnitude(); 357 //System.out.println("magnitude(a) = " + r); 358 359 b = a.multiply(a); 360 BigDecimal rb = b.decimalMagnitude(); 361 //System.out.println("magnitude(a*a) = " + rb); 362 BigDecimal rr = r.multiply(r); 363 //System.out.println("magnitude(a)*magnitude(a) = " + rr); 364 BigDecimal eps = Power.positivePower(new BigDecimal(0.1), BigDecimal.DEFAULT_PRECISION - 8); 365 //System.out.println("eps = " + eps); 366 BigDecimal err = rr.subtract(rb).abs().divide(rr.abs().sum(rb.abs())); 367 //System.out.println("err = " + err); 368 assertTrue("magnitude(a)*magnitude(a) == magnitude(a*a): " + err + " <= " + eps, 369 err.compareTo(eps) <= 0); 370 } 371 372 373 /** 374 * Test compareTo of complex algebraic numbers. 375 */ 376 public void testCompare() { 377 a = fac.random(ll).abs(); 378 b = a.sum(fac.getONE()); 379 c = b.sum(fac.getONE()); 380 381 int ab = a.compareTo(b); 382 int bc = b.compareTo(c); 383 int ac = a.compareTo(c); 384 385 assertTrue("a < a+1 ", ab < 0); 386 assertTrue("a+1 < a+2 ", bc < 0); 387 assertTrue("a < a+2 ", ac < 0); 388 389 a = a.negate(); 390 b = a.sum(fac.getONE()); 391 c = b.sum(fac.getONE()); 392 393 ab = a.compareTo(b); 394 bc = b.compareTo(c); 395 ac = a.compareTo(c); 396 397 assertTrue("a < a+1 ", ab < 0); 398 assertTrue("a+1 < a+2 ", bc < 0); 399 assertTrue("a < a+2 ", ac < 0); 400 } 401 402}