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