001/* 002 * $Id$ 003 */ 004 005package edu.jas.application; 006 007 008import java.util.ArrayList; 009import java.util.List; 010import java.util.Map; 011 012import edu.jas.arith.BigRational; 013import edu.jas.poly.ExpVector; 014import edu.jas.poly.GenPolynomial; 015import edu.jas.poly.GenPolynomialRing; 016import edu.jas.poly.GenSolvablePolynomial; 017import edu.jas.poly.GenSolvablePolynomialRing; 018import edu.jas.poly.PolyUtil; 019import edu.jas.poly.RecSolvablePolynomial; 020import edu.jas.poly.RelationGenerator; 021import edu.jas.poly.TermOrder; 022import edu.jas.poly.WeylRelations; 023 024import junit.framework.Test; 025import junit.framework.TestCase; 026import junit.framework.TestSuite; 027 028 029/** 030 * BigRational coefficients ResidueSolvablePolynomial tests with JUnit. 031 * @author Heinz Kredel 032 */ 033 034public class ResidueSolvablePolynomialTest extends TestCase { 035 036 037 /** 038 * main. 039 */ 040 public static void main(String[] args) { 041 042 junit.textui.TestRunner.run(suite()); 043 } 044 045 046 /** 047 * Constructs a <CODE>ResidueSolvablePolynomialTest</CODE> object. 048 * @param name String. 049 */ 050 public ResidueSolvablePolynomialTest(String name) { 051 super(name); 052 } 053 054 055 /** 056 */ 057 public static Test suite() { 058 TestSuite suite = new TestSuite(ResidueSolvablePolynomialTest.class); 059 return suite; 060 } 061 062 063 ResidueSolvablePolynomial<BigRational> a, b, c, d, e, f, x1, x2; 064 065 066 int rl = 4; 067 068 069 int kl = 3; 070 071 072 int ll = 4; 073 074 075 int el = 3; 076 077 078 float q = 0.3f; 079 080 081 String[] cvars = new String[] { "a", "b" }; 082 083 084 String[] vars = new String[] { "w", "x", "y", "z" }; 085 086 087 SolvableResidueRing<BigRational> rring; 088 089 090 SolvableIdeal<BigRational> sideal; 091 092 093 ResidueSolvablePolynomialRing<BigRational> ring; 094 095 096 BigRational cfac; 097 098 099 GenSolvablePolynomialRing<BigRational> sring; 100 101 102 GenPolynomialRing<BigRational> cring; 103 104 105 TermOrder tord = new TermOrder(TermOrder.INVLEX); 106 107 108 @Override 109 protected void setUp() { 110 cfac = new BigRational(1); 111 sring = new GenSolvablePolynomialRing<BigRational>(cfac, tord, cvars); 112 //RelationGenerator<BigRational> wc = new WeylRelations<BigRational>(); 113 //not possible: sring.addRelations(wc); 114 List<GenSolvablePolynomial<BigRational>> il = new ArrayList<GenSolvablePolynomial<BigRational>>(); 115 GenSolvablePolynomial<BigRational> p1 = sring.parse("b - a^2"); 116 il.add(p1); 117 //p1 = sring.parse("a - b^5"); 118 //il.add(p1); 119 sideal = new SolvableIdeal<BigRational>(sring, il); 120 sideal = sideal.twosidedGB(); 121 if (sideal.isONE()) { 122 System.out.println("twosided sideal = " + sideal.toScript()); 123 throw new IllegalArgumentException("ideal is one"); 124 } 125 rring = new SolvableResidueRing<BigRational>(sideal); 126 ring = new ResidueSolvablePolynomialRing<BigRational>(rring, tord, vars); 127 RelationGenerator<SolvableResidue<BigRational>> wl = new WeylRelations<SolvableResidue<BigRational>>(); 128 wl.generate(ring); 129 List<GenSolvablePolynomial<SolvableResidue<BigRational>>> qrel = ring.table.relationList(); 130 //System.out.println("qrel = " + qrel); 131 List<GenSolvablePolynomial<GenPolynomial<BigRational>>> prel = new ArrayList<GenSolvablePolynomial<GenPolynomial<BigRational>>>(); 132 for (GenSolvablePolynomial<SolvableResidue<BigRational>> q : qrel) { 133 GenSolvablePolynomial<GenPolynomial<BigRational>> p = ring.toPolyCoefficients(q); 134 prel.add(p); 135 } 136 //System.out.println("prel = " + prel); 137 ring.polCoeff.table.addSolvRelations(prel); 138 a = b = c = d = e = null; 139 } 140 141 142 @Override 143 protected void tearDown() { 144 ring = null; 145 a = b = c = d = e = null; 146 } 147 148 149 /** 150 * Test constructor, generators and properties. 151 */ 152 public void testConstructor() { 153 a = ring.getZERO(); 154 assertTrue("length( a ) = 0", a.length() == 0); 155 assertTrue("isZERO( a )", a.isZERO()); 156 assertTrue("isONE( a )", !a.isONE()); 157 158 assertFalse("not commutative", ring.isCommutative()); 159 assertTrue("associative", ring.isAssociative()); 160 161 a = new ResidueSolvablePolynomial<BigRational>(ring); 162 assertTrue("length( a ) = 0", a.length() == 0); 163 assertTrue("isZERO( a )", a.isZERO()); 164 assertTrue("isONE( a )", !a.isONE()); 165 166 c = ring.getONE(); 167 assertTrue("length( c ) = 1", c.length() == 1); 168 assertTrue("isZERO( c )", !c.isZERO()); 169 assertTrue("isONE( c )", c.isONE()); 170 171 //System.out.println(""); 172 for (GenPolynomial<SolvableResidue<BigRational>> g : ring.generators()) { 173 //System.out.print("g = " + g + ", "); 174 assertFalse("not isZERO( g )", g.isZERO()); 175 } 176 //System.out.println(""); 177 } 178 179 180 /** 181 * Test random polynomial. 182 */ 183 public void testRandom() { 184 for (int i = 0; i < 3; i++) { 185 // a = ring.random(ll+2*i); 186 a = ring.random(kl * (i + 1), ll + 2 * i, el + i, q); 187 //System.out.println("a = " + a); 188 assertTrue("length( a" + i + " ) <> 0", a.length() >= 0); 189 assertTrue(" not isZERO( a" + i + " )", !a.isZERO()); 190 assertTrue(" not isONE( a" + i + " )", !a.isONE()); 191 } 192 } 193 194 195 /** 196 * Test addition. 197 */ 198 public void testAddition() { 199 a = ring.random(kl, ll, el, q); 200 c = (ResidueSolvablePolynomial<BigRational>) a.subtract(a); 201 assertTrue("a-a = 0", c.isZERO()); 202 203 b = (ResidueSolvablePolynomial<BigRational>) a.sum(a); 204 c = (ResidueSolvablePolynomial<BigRational>) b.subtract(a); 205 assertEquals("a+a-a = a", c, a); 206 207 b = ring.random(kl, ll, el, q); 208 c = (ResidueSolvablePolynomial<BigRational>) b.sum(a); 209 d = (ResidueSolvablePolynomial<BigRational>) a.sum(b); 210 assertEquals("a+b = b+a", c, d); 211 212 c = ring.random(kl, ll, el, q); 213 d = (ResidueSolvablePolynomial<BigRational>) a.sum(b.sum(c)); 214 e = (ResidueSolvablePolynomial<BigRational>) a.sum(b).sum(c); 215 assertEquals("a+(b+c) = (a+b)+c", d, e); 216 //System.out.println("a = " + a); 217 //System.out.println("b = " + b); 218 //System.out.println("c = " + c); 219 //System.out.println("d = " + d); 220 //System.out.println("e = " + e); 221 222 ExpVector u = ExpVector.random(rl, el, q); 223 SolvableResidue<BigRational> x = rring.random(kl); 224 //System.out.println("x = " + x); 225 //System.out.println("u = " + u); 226 227 b = ring.getONE().multiply(x, u); 228 c = (ResidueSolvablePolynomial<BigRational>) a.sum(b); 229 d = (ResidueSolvablePolynomial<BigRational>) a.sum(x, u); 230 //System.out.println("a = " + a); 231 //System.out.println("b = " + b); 232 //System.out.println("c = " + c); 233 //System.out.println("d = " + d); 234 assertEquals("a+p(x,u) = a+(x,u)", c, d); 235 236 c = (ResidueSolvablePolynomial<BigRational>) a.subtract(b); 237 d = (ResidueSolvablePolynomial<BigRational>) a.subtract(x, u); 238 assertEquals("a-p(x,u) = a-(x,u)", c, d); 239 240 a = ring.getZERO(); 241 b = ring.getONE().multiply(x, u); 242 c = (ResidueSolvablePolynomial<BigRational>) b.sum(a); 243 d = (ResidueSolvablePolynomial<BigRational>) a.sum(x, u); 244 assertEquals("a+p(x,u) = a+(x,u)", c, d); 245 246 c = (ResidueSolvablePolynomial<BigRational>) a.subtract(b); 247 d = (ResidueSolvablePolynomial<BigRational>) a.subtract(x, u); 248 assertEquals("a-p(x,u) = a-(x,u)", c, d); 249 } 250 251 252 /** 253 * Test multiplication. 254 */ 255 public void testMultiplication() { 256 //System.out.println("ring = " + ring); 257 a = ring.random(kl, ll, el, q); 258 //a = ring.parse(" b y z + a w z "); 259 b = ring.random(kl, ll, el, q); 260 //b = ring.parse(" w x - b x "); 261 262 c = b.multiply(a); 263 d = a.multiply(b); 264 //System.out.println("a = " + a); 265 //System.out.println("b = " + b); 266 //System.out.println("c = " + c); 267 //System.out.println("d = " + d); 268 assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector())); 269 270 c = ring.random(kl, ll, el, q); 271 d = a.multiply(b.multiply(c)); 272 e = a.multiply(b).multiply(c); 273 assertEquals("a(bc) = (ab)c", d, e); 274 //System.out.println("a = " + a); 275 //System.out.println("b = " + b); 276 //System.out.println("c = " + c); 277 //System.out.println("d = " + d); 278 //System.out.println("e = " + e); 279 280 d = (ResidueSolvablePolynomial<BigRational>) a.monic(); 281 //System.out.println("d = " + d); 282 assertTrue("a.monic(): " + d, d.leadingBaseCoefficient().isONE() 283 || d.leadingBaseCoefficient().equals(a.leadingBaseCoefficient())); 284 } 285 286 287 /** 288 * Test partially commutative ring. 289 */ 290 public void testPartCommutative() { 291 //System.out.println("table = " + table.toString(vars)); 292 //System.out.println("table = " + table.toScript()); 293 //System.out.println("ring = " + ring); 294 //System.out.println("ring.table = " + ring.table.toScript()); 295 //assertEquals("table == ring.table: ", table, ring.table); // ? 296 assertTrue("# relations == 2", ring.table.size() == 2); 297 298 ring = new ResidueSolvablePolynomialRing<BigRational>(rring, ring); 299 //System.out.println("ring = " + ring); 300 301 assertTrue("isCommutative()", ring.isCommutative() || !rring.isCommutative()); 302 assertTrue("isAssociative()", ring.isAssociative()); 303 304 a = ring.random(kl, ll, el, q); 305 //a = ring.parse(" b x y z + a w z "); 306 //System.out.println("a = " + a); 307 b = ring.random(kl, ll, el, q); 308 //b = ring.parse(" w y z - b x "); 309 //System.out.println("b = " + b); 310 311 // commutative 312 c = b.multiply(a); 313 //System.out.println("c = " + c); 314 d = a.multiply(b); 315 //d = ring.getONE(); 316 //System.out.println("d = " + d); 317 assertEquals("ba == ab: ", c, d); 318 } 319 320 321 /** 322 * Test distributive law. 323 */ 324 public void testDistributive() { 325 a = ring.random(kl, ll, el, q); 326 b = ring.random(kl, ll, el, q); 327 c = ring.random(kl, ll, el, q); 328 329 d = a.multiply((ResidueSolvablePolynomial<BigRational>) b.sum(c)); 330 e = (ResidueSolvablePolynomial<BigRational>) a.multiply(b).sum(a.multiply(c)); 331 assertEquals("a(b+c) = ab+ac", d, e); 332 } 333 334 335 /** 336 * Test solvable coefficient ring. 337 */ 338 public void testSolvableCoeffsRelations() { 339 assertTrue("# relations == 2", ring.table.size() == 2); 340 assertFalse("isCommutative()", ring.isCommutative()); 341 assertTrue("isAssociative()", ring.isAssociative()); 342 //System.out.println("ring = " + ring.toScript()); 343 344 ResidueSolvablePolynomial<BigRational> r1 = ring.parse("x"); 345 GenSolvablePolynomial<BigRational> r2 = sring.parse("a"); 346 ResidueSolvablePolynomial<BigRational> rp = ring.parse("a x + b"); 347 GenSolvablePolynomial<GenPolynomial<BigRational>> pp = ring.toPolyCoefficients(rp); 348 //System.out.println("r1 = " + r1); 349 //System.out.println("r2 = " + r2); 350 //System.out.println("rp = " + rp); 351 //System.out.println("pp = " + pp); 352 ring.polCoeff.coeffTable.update(r1.leadingExpVector(), r2.leadingExpVector(), pp); 353 354 //System.out.println("ring = " + ring.toScript()); 355 356 assertFalse("isCommutative()", ring.isCommutative()); 357 assertTrue("isAssociative()", ring.isAssociative()); 358 359 List<GenPolynomial<SolvableResidue<BigRational>>> gens = ring.generators(); 360 //System.out.println("gens = " + gens); 361 for (GenPolynomial<SolvableResidue<BigRational>> x : gens) { 362 GenSolvablePolynomial<SolvableResidue<BigRational>> xx = (GenSolvablePolynomial<SolvableResidue<BigRational>>) x; 363 try { 364 GenSolvablePolynomial<GenPolynomial<BigRational>> ap = ring.toPolyCoefficients(xx); 365 //System.out.println("ap = " + ap); 366 c = ring.fromPolyCoefficients(ap); 367 //System.out.println("c = " + c); 368 assertEquals("from(to(xx)) == xx", xx, c); 369 } catch (IllegalArgumentException iae) { 370 // pass 371 } 372 a = new ResidueSolvablePolynomial<BigRational>(ring, xx); 373 try { 374 GenSolvablePolynomial<GenPolynomial<BigRational>> ap = ring.toPolyCoefficients(a); 375 //System.out.println("ap = " + ap); 376 c = ring.fromPolyCoefficients(ap); 377 //System.out.println("c = " + c); 378 assertEquals("from(to(a)) == a", a, c); 379 } catch (IllegalArgumentException iae) { 380 // pass 381 } 382 for (GenPolynomial<SolvableResidue<BigRational>> y : gens) { 383 GenSolvablePolynomial<SolvableResidue<BigRational>> yy = (GenSolvablePolynomial<SolvableResidue<BigRational>>) y; 384 b = new ResidueSolvablePolynomial<BigRational>(ring, yy); 385 c = a.multiply(b); 386 //System.out.println("gens:" + a + " * " + b + " = " + c); 387 ExpVector ev = a.leadingExpVector().sum(b.leadingExpVector()); 388 assertTrue("LT(a)*LT(b) == LT(c)", c.leadingExpVector().equals(ev)); 389 ev = a.leadingBaseCoefficient().val.leadingExpVector() 390 .sum(b.leadingBaseCoefficient().val.leadingExpVector()); 391 assertTrue("LT(lc(a))*LT(lc(b)) == LT(lc(c))", 392 c.leadingBaseCoefficient().val.leadingExpVector().equals(ev)); 393 } 394 } 395 //System.out.println("ring = " + ring.toScript()); 396 397 a = ring.random(kl, ll, el, q); 398 //a = ring.getONE(); 399 //System.out.println("a = " + a); 400 b = ring.random(kl, ll, el, q); 401 //b = ring.getONE(); 402 //System.out.println("b = " + b); 403 404 // non-commutative 405 c = b.multiply(a); 406 d = a.multiply(b); 407 //System.out.println("c = " + c); 408 //System.out.println("d = " + d); 409 assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector())); 410 } 411 412 413 /** 414 * Test extension and contraction for Weyl relations. 415 */ 416 public void testExtendContractWeyl() { 417 ResidueSolvablePolynomial<BigRational> r1 = ring.parse("x"); 418 GenSolvablePolynomial<BigRational> r2 = sring.parse("a"); 419 ResidueSolvablePolynomial<BigRational> rp = ring.parse("a x + b"); 420 ring.polCoeff.coeffTable.update(r1.leadingExpVector(), r2.leadingExpVector(), 421 ring.toPolyCoefficients(rp)); 422 423 int k = rl; 424 ResidueSolvablePolynomialRing<BigRational> pfe = ring.extend(k); 425 //System.out.println("pfe = " + pfe); 426 ResidueSolvablePolynomialRing<BigRational> pfec = pfe.contract(k); 427 //System.out.println("pfec = " + pfec); 428 assertEquals("ring == pfec", ring, pfec); 429 430 ResidueSolvablePolynomial<BigRational> a = ring.random(kl, ll, el, q); 431 //System.out.println("a = " + a); 432 433 ResidueSolvablePolynomial<BigRational> ae = (ResidueSolvablePolynomial<BigRational>) a.extend(pfe, 0, 434 0); 435 //System.out.println("ae = " + ae); 436 437 Map<ExpVector, GenPolynomial<SolvableResidue<BigRational>>> m = ae.contract(pfec); 438 List<GenPolynomial<SolvableResidue<BigRational>>> ml = new ArrayList<GenPolynomial<SolvableResidue<BigRational>>>( 439 m.values()); 440 GenPolynomial<SolvableResidue<BigRational>> aec = ml.get(0); 441 //System.out.println("ae = " + ae); 442 //System.out.println("aec = " + aec); 443 assertEquals("a == aec", a, aec); 444 } 445 446 447 /** 448 * Test reversion for Weyl relations. 449 */ 450 public void testReverseWeyl() { 451 ResidueSolvablePolynomial<BigRational> r1 = ring.parse("x"); 452 GenSolvablePolynomial<BigRational> r2 = sring.parse("a"); 453 ResidueSolvablePolynomial<BigRational> rp = ring.parse("a x + b"); 454 ring.polCoeff.coeffTable.update(r1.leadingExpVector(), r2.leadingExpVector(), 455 ring.toPolyCoefficients(rp)); 456 457 ResidueSolvablePolynomialRing<BigRational> pfr = ring.reverse(); 458 ResidueSolvablePolynomialRing<BigRational> pfrr = pfr.reverse(); 459 assertEquals("pf == pfrr", ring, pfrr); 460 //System.out.println("ring = " + ring); 461 //System.out.println("pfr = " + pfr); 462 463 ResidueSolvablePolynomial<BigRational> a = ring.random(kl, ll, el, q); 464 //System.out.println("a = " + a); 465 466 ResidueSolvablePolynomial<BigRational> ar = (ResidueSolvablePolynomial<BigRational>) a.reverse(pfr); 467 ResidueSolvablePolynomial<BigRational> arr = (ResidueSolvablePolynomial<BigRational>) ar 468 .reverse(pfrr); 469 assertEquals("a == arr", a, arr); 470 //System.out.println("ar = " + ar); 471 //System.out.println("arr = " + arr); 472 } 473 474 475 /** 476 * Test recursive for Weyl relations. 477 */ 478 public void testRecursiveWeyl() { 479 GenSolvablePolynomialRing<GenPolynomial<SolvableResidue<BigRational>>> rsring = ring.recursive(2); // 1,2,3 480 //System.out.println("rsring = " + rsring.toScript()); 481 482 GenSolvablePolynomial<SolvableResidue<BigRational>> ad, bd, cd, dd; 483 RecSolvablePolynomial<SolvableResidue<BigRational>> ar, br, cr, dr; 484 ad = ring.random(kl, ll, el, q); 485 bd = ring.random(kl, ll, el, q); 486 //ad = sring.parse("7/2 y^2 * z"); // - 15/2 w^2 + 262/225"); 487 //bd = sring.parse("-10/13 x "); //+ 413/150"); 488 //ad = (GenSolvablePolynomial<BigRational>) ad.monic(); 489 //bd = (GenSolvablePolynomial<BigRational>) bd.monic(); 490 491 //System.out.println("ad = " + ad); 492 //System.out.println("bd = " + bd); 493 494 cd = ad.multiply(bd); 495 //System.out.println("cd = " + cd); 496 497 ar = (RecSolvablePolynomial<SolvableResidue<BigRational>>) PolyUtil 498 .<SolvableResidue<BigRational>> recursive(rsring, ad); 499 br = (RecSolvablePolynomial<SolvableResidue<BigRational>>) PolyUtil 500 .<SolvableResidue<BigRational>> recursive(rsring, bd); 501 //System.out.println("ar = " + ar); 502 //System.out.println("br = " + br); 503 504 cr = ar.multiply(br); 505 //System.out.println("cr = " + cr); 506 //System.out.println("cr.ring = " + cr.ring.toScript()); 507 508 dr = (RecSolvablePolynomial<SolvableResidue<BigRational>>) PolyUtil 509 .<SolvableResidue<BigRational>> recursive(rsring, cd); 510 //System.out.println("dr = " + dr); 511 512 assertEquals("dr.ring == cr.ring", dr.ring, cr.ring); 513 assertEquals("dr == cr", dr, cr); 514 515 dd = (GenSolvablePolynomial<SolvableResidue<BigRational>>) PolyUtil 516 .<SolvableResidue<BigRational>> distribute(ring, cr); 517 // //System.out.println("dd = " + dd); 518 assertEquals("dd == cd", dd, cd); 519 } 520 521}