001/* 002 * $Id$ 003 */ 004 005package edu.jas.poly; 006 007 008import java.util.List; 009import java.util.ArrayList; 010import java.io.StringReader; 011import java.io.IOException; 012 013import junit.framework.Test; 014import junit.framework.TestCase; 015import junit.framework.TestSuite; 016 017 018import edu.jas.arith.BigInteger; 019import edu.jas.arith.BigRational; 020import edu.jas.arith.BigComplex; 021import edu.jas.structure.RingElem; 022 023 024/** 025 * GenWordPolynomial tests with JUnit. 026 * @author Heinz Kredel 027 */ 028 029public class GenWordPolynomialTest extends TestCase { 030 031 032 /** 033 * main 034 */ 035 public static void main(String[] args) { 036 junit.textui.TestRunner.run(suite()); 037 } 038 039 040 /** 041 * Constructs a <CODE>GenWordPolynomialTest</CODE> object. 042 * @param name String. 043 */ 044 public GenWordPolynomialTest(String name) { 045 super(name); 046 } 047 048 049 /** 050 * suite. 051 */ 052 public static Test suite() { 053 TestSuite suite = new TestSuite(GenWordPolynomialTest.class); 054 return suite; 055 } 056 057 058 int rl = 6; 059 060 061 int kl = 10; 062 063 064 int ll = 7; 065 066 067 int el = 5; 068 069 070 @Override 071 protected void setUp() { 072 } 073 074 075 @Override 076 protected void tearDown() { 077 } 078 079 080 /** 081 * Test constructors and factory. 082 */ 083 public void testConstructors() { 084 // integers 085 BigInteger rf = new BigInteger(); 086 //System.out.println("rf = " + rf); 087 088 // non-commuting vars: abcdef 089 WordFactory wf = new WordFactory("abcdef"); 090 //System.out.println("wf = " + wf); 091 092 // polynomials over integers 093 GenWordPolynomialRing<BigInteger> pf = new GenWordPolynomialRing<BigInteger>(rf, wf); 094 //System.out.println("pf = " + pf); 095 assertFalse("not commutative",pf.isCommutative()); 096 assertTrue("associative",pf.isAssociative()); 097 assertFalse("not field",pf.isField()); 098 099 GenWordPolynomial<BigInteger> p = pf.getONE(); 100 //System.out.println("p = " + p); 101 assertTrue("p == 1", p.isONE()); 102 p = pf.getZERO(); 103 assertTrue("p == 0", p.isZERO()); 104 //System.out.println("p = " + p); 105 //p = pf.random(9); 106 //System.out.println("p = " + p); 107 108 List<GenWordPolynomial<BigInteger>> gens = pf.generators(); 109 //System.out.println("gens = " + gens); 110 assertTrue("#gens == 7", gens.size() == 7); 111 112 RingElem<GenWordPolynomial<BigInteger>> pe = new GenWordPolynomial<BigInteger>(pf); 113 //System.out.println("pe = " + pe); 114 //System.out.println("p.equals(pe) = " + p.equals(pe) ); 115 //System.out.println("p.equals(p) = " + p.equals(p) ); 116 assertTrue("p.equals(pe) = ", p.equals(pe)); 117 assertTrue("p.equals(p) = ", p.equals(p)); 118 119 pe = pe.sum(p); 120 //System.out.println("pe = " + pe); 121 assertTrue("pe.isZERO() = ", pe.isZERO()); 122 p = pf.random(9); 123 p = p.subtract(p); 124 //System.out.println("p = " + p); 125 //System.out.println("p.isZERO() = " + p.isZERO()); 126 assertTrue("p.isZERO() = ", p.isZERO()); 127 128 // polynomials over (polynomials over integers) 129 // non-commuting vars: xyz 130 WordFactory wf2 = new WordFactory("xyz"); 131 //System.out.println("wf2 = " + wf2); 132 133 GenWordPolynomialRing<GenWordPolynomial<BigInteger>> 134 ppf = new GenWordPolynomialRing<GenWordPolynomial<BigInteger>>(pf, wf2); 135 //System.out.println("ppf = " + ppf); 136 137 GenWordPolynomial<GenWordPolynomial<BigInteger>> pp = ppf.getONE(); 138 //System.out.println("pp = " + pp); 139 assertTrue("pp == 1", pp.isONE()); 140 //pp = ppf.random(2); 141 //System.out.println("pp = " + pp); 142 pp = ppf.getZERO(); 143 //System.out.println("pp = " + pp); 144 assertTrue("pp == 0", pp.isZERO()); 145 146 List<GenWordPolynomial<GenWordPolynomial<BigInteger>>> pgens = ppf.generators(); 147 //System.out.println("pgens = " + pgens); 148 assertTrue("#pgens == 7+3", pgens.size() == 10); 149 150 RingElem<GenWordPolynomial<GenWordPolynomial<BigInteger>>> 151 ppe = new GenWordPolynomial<GenWordPolynomial<BigInteger>>(ppf); 152 //System.out.println("ppe = " + ppe); 153 //System.out.println("pp.equals(ppe) = " + pp.equals(ppe) ); 154 //System.out.println("pp.equals(pp) = " + pp.equals(pp) ); 155 assertTrue("pp.equals(ppe) = ", pp.equals(ppe)); 156 assertTrue("pp.equals(pp) = ", pp.equals(pp)); 157 158 ppe = ppe.sum(pp); // why not pp = pp.add(ppe) ? 159 //System.out.println("ppe = " + ppe); 160 assertTrue("ppe.isZERO() = ", ppe.isZERO()); 161 pp = ppf.random(2); 162 pp = pp.subtract(pp); 163 //System.out.println("pp = " + pp); 164 //System.out.println("pp.isZERO() = " + pp.isZERO()); 165 assertTrue("pp.isZERO() = ", pp.isZERO()); 166 167 // polynomials over (polynomials over (polynomials over integers)) 168 // non-commuting vars: uvw 169 WordFactory wf3 = new WordFactory("uvw"); 170 //System.out.println("wf3 = " + wf3); 171 GenWordPolynomialRing<GenWordPolynomial<GenWordPolynomial<BigInteger>>> 172 pppf = new GenWordPolynomialRing<GenWordPolynomial<GenWordPolynomial<BigInteger>>>(ppf, wf3); 173 //System.out.println("pppf = " + pppf); 174 175 GenWordPolynomial<GenWordPolynomial<GenWordPolynomial<BigInteger>>> ppp = pppf.getONE(); 176 //System.out.println("ppp = " + ppp); 177 assertTrue("ppp == 1", ppp.isONE()); 178 //ppp = pppf.random(2); 179 //System.out.println("ppp = " + ppp); 180 ppp = pppf.getZERO(); 181 //System.out.println("ppp = " + ppp); 182 assertTrue("ppp == 0", ppp.isZERO()); 183 184 List<GenWordPolynomial<GenWordPolynomial<GenWordPolynomial<BigInteger>>>> ppgens = pppf.generators(); 185 //System.out.println("ppgens = " + ppgens); 186 assertTrue("#ppgens == 7+3+3", ppgens.size() == 13); 187 188 RingElem<GenWordPolynomial<GenWordPolynomial<GenWordPolynomial<BigInteger>>>> 189 pppe = new GenWordPolynomial<GenWordPolynomial<GenWordPolynomial<BigInteger>>>(pppf); 190 //System.out.println("pppe = " + pppe); 191 // System.out.println("ppp.equals(pppe) = " + ppp.equals(pppe) ); 192 // System.out.println("ppp.equals(ppp) = " + ppp.equals(ppp) ); 193 assertTrue("ppp.equals(pppe) = ", ppp.equals(pppe)); 194 assertTrue("ppp.equals(ppp) = ", ppp.equals(ppp)); 195 196 pppe = pppe.sum(ppp); 197 //System.out.println("pppe = " + pppe); 198 assertTrue("pppe.isZERO() = ", pppe.isZERO()); 199 //ppp = pppf.random(2); 200 ppp = ppp.subtract(ppp); 201 //System.out.println("ppp = " + ppp); 202 //System.out.println("ppp.isZERO() = " + ppp.isZERO()); 203 assertTrue("ppp.isZERO() = ", ppp.isZERO()); 204 } 205 206 207 /** 208 * Test accessors. 209 */ 210 public void testAccessors() { 211 // integers 212 BigInteger rf = new BigInteger(); 213 // System.out.println("rf = " + rf); 214 215 // non-commuting vars: abcdef 216 WordFactory wf = new WordFactory("abcdef"); 217 //System.out.println("wf = " + wf); 218 219 // polynomials over integers 220 GenWordPolynomialRing<BigInteger> pf = new GenWordPolynomialRing<BigInteger>(rf, wf); 221 //System.out.println("pf = " + pf); 222 223 // test 1 224 GenWordPolynomial<BigInteger> p = pf.getONE(); 225 //System.out.println("p = " + p); 226 227 Word e = p.leadingWord(); 228 BigInteger c = p.leadingBaseCoefficient(); 229 230 GenWordPolynomial<BigInteger> f = new GenWordPolynomial<BigInteger>(pf, c, e); 231 assertEquals("1 == 1 ", p, f); 232 233 GenWordPolynomial<BigInteger> r = p.reductum(); 234 assertTrue("red(1) == 0 ", r.isZERO()); 235 236 // test 0 237 p = pf.getZERO(); 238 // System.out.println("p = " + p); 239 e = p.leadingWord(); 240 c = p.leadingBaseCoefficient(); 241 242 f = new GenWordPolynomial<BigInteger>(pf, c, e); 243 assertEquals("0 == 0 ", p, f); 244 245 r = p.reductum(); 246 assertTrue("red(0) == 0 ", r.isZERO()); 247 248 // test random 249 p = pf.random(kl, ll, el); 250 // System.out.println("p = " + p); 251 e = p.leadingWord(); 252 c = p.leadingBaseCoefficient(); 253 r = p.reductum(); 254 255 f = new GenWordPolynomial<BigInteger>(pf, c, e); 256 f = r.sum(f); 257 assertEquals("p == lm(f)+red(f) ", p, f); 258 259 // test iteration over random 260 GenWordPolynomial<BigInteger> g; 261 g = p; 262 f = pf.getZERO(); 263 while (!g.isZERO()) { 264 e = g.leadingWord(); 265 c = g.leadingBaseCoefficient(); 266 //System.out.println("c e = " + c + " " + e); 267 r = g.reductum(); 268 f = f.sum(c, e); 269 g = r; 270 } 271 assertEquals("p == lm(f)+lm(red(f))+... ", p, f); 272 } 273 274 275 /** 276 * Test addition. 277 */ 278 public void testAddition() { 279 // integers 280 BigInteger rf = new BigInteger(); 281 // System.out.println("rf = " + rf); 282 283 // non-commuting vars: abcdef 284 WordFactory wf = new WordFactory("abcdef"); 285 //System.out.println("wf = " + wf); 286 287 // polynomials over integers 288 GenWordPolynomialRing<BigInteger> fac = new GenWordPolynomialRing<BigInteger>(rf, wf); 289 //System.out.println("fac = " + fac); 290 291 GenWordPolynomial<BigInteger> a = fac.random(kl, ll, el); 292 GenWordPolynomial<BigInteger> b = fac.random(kl, ll, el); 293 294 GenWordPolynomial<BigInteger> c = a.sum(b); 295 GenWordPolynomial<BigInteger> d = c.subtract(b); 296 GenWordPolynomial<BigInteger> e; 297 assertEquals("a+b-b = a", a, d); 298 //System.out.println("a = " + a); 299 //System.out.println("b = " + b); 300 //System.out.println("c = " + c); 301 //System.out.println("d = " + d); 302 303 c = fac.random(kl, ll, el); 304 //System.out.println("\nc = " + c); 305 d = a.sum(b.sum(c)); 306 e = (a.sum(b)).sum(c); 307 308 //System.out.println("d = " + d); 309 //System.out.println("e = " + e); 310 //System.out.println("d-e = " + d.subtract(e) ); 311 assertEquals("a+(b+c) = (a+b)+c", d, e); 312 313 Word u = wf.random(rl); 314 BigInteger x = rf.random(kl); 315 316 b = new GenWordPolynomial<BigInteger>(fac, x, u); 317 c = a.sum(b); 318 d = a.sum(x, u); 319 assertEquals("a+p(x,u) = a+(x,u)", c, d); 320 //System.out.println("\nc = " + c); 321 //System.out.println("d = " + d); 322 323 c = a.subtract(b); 324 d = a.subtract(x, u); 325 assertEquals("a-p(x,u) = a-(x,u)", c, d); 326 //System.out.println("c = " + c); 327 //System.out.println("d = " + d); 328 329 //a = new GenWordPolynomial<BigInteger>(fac); 330 b = new GenWordPolynomial<BigInteger>(fac, x, u); 331 c = b.sum(a); 332 d = a.sum(x, u); 333 assertEquals("a+p(x,u) = a+(x,u)", c, d); 334 //System.out.println("a = " + a); 335 //System.out.println("b = " + b); 336 //System.out.println("c = " + c); 337 //System.out.println("d = " + d); 338 339 c = a.subtract(b); 340 d = a.subtract(x, u); 341 assertEquals("a-p(x,u) = a-(x,u)", c, d); 342 //System.out.println("c = " + c); 343 //System.out.println("d = " + d); 344 } 345 346 347 /** 348 * Test multiplication. 349 */ 350 public void testMultiplication() { 351 // integers 352 BigInteger rf = new BigInteger(); 353 // System.out.println("rf = " + rf); 354 355 // non-commuting vars: abcdef 356 WordFactory wf = new WordFactory("abcdef"); 357 //System.out.println("wf = " + wf); 358 359 // polynomials over integers 360 GenWordPolynomialRing<BigInteger> fac = new GenWordPolynomialRing<BigInteger>(rf, wf); 361 //System.out.println("fac = " + fac); 362 363 GenWordPolynomial<BigInteger> a = fac.random(kl, ll, el); 364 GenWordPolynomial<BigInteger> b = fac.random(kl, ll, el); 365 366 GenWordPolynomial<BigInteger> c = a.multiply(b); 367 GenWordPolynomial<BigInteger> d = b.multiply(a); 368 GenWordPolynomial<BigInteger> e; 369 assertFalse("a*b != b*a", c.equals(d)); 370 //System.out.println("a = " + a); 371 //System.out.println("b = " + b); 372 //System.out.println("c = " + c); 373 //System.out.println("d = " + d); 374 375 c = fac.random(kl, ll, el); 376 //System.out.println("c = " + c); 377 d = a.multiply(b.multiply(c)); 378 e = (a.multiply(b)).multiply(c); 379 380 //System.out.println("d = " + d); 381 //System.out.println("e = " + e); 382 //System.out.println("d-e = " + d.subtract(c) ); 383 assertEquals("a*(b*c) = (a*b)*c", d, e); 384 385 Word u = wf.random(rl); 386 BigInteger x = rf.random(kl); 387 388 b = new GenWordPolynomial<BigInteger>(fac, x, u); 389 c = a.multiply(b); 390 d = a.multiply(x, u); 391 assertEquals("a+p(x,u) = a+(x,u)", c, d); 392 //System.out.println("c = " + c); 393 //System.out.println("d = " + d); 394 395 //a = new GenWordPolynomial<BigInteger>(fac); 396 b = new GenWordPolynomial<BigInteger>(fac, x, u); 397 c = a.multiply(b); 398 d = a.multiply(x, u); 399 assertEquals("a+p(x,u) = a+(x,u)", c, d); 400 //System.out.println("a = " + a); 401 //System.out.println("b = " + b); 402 //System.out.println("c = " + c); 403 //System.out.println("d = " + d); 404 } 405 406 407 /** 408 * Test distributive law. 409 */ 410 public void testDistributive() { 411 // integers 412 BigInteger rf = new BigInteger(); 413 // System.out.println("rf = " + rf); 414 415 // non-commuting vars: abcdef 416 WordFactory wf = new WordFactory("abcdef"); 417 //System.out.println("wf = " + wf); 418 419 // polynomials over integers 420 GenWordPolynomialRing<BigInteger> fac = new GenWordPolynomialRing<BigInteger>(rf, wf); 421 //System.out.println("fac = " + fac); 422 423 GenWordPolynomial<BigInteger> a = fac.random(kl, ll, el); 424 GenWordPolynomial<BigInteger> b = fac.random(kl, ll, el); 425 GenWordPolynomial<BigInteger> c = fac.random(kl, ll, el); 426 GenWordPolynomial<BigInteger> d, e; 427 428 d = a.multiply(b.sum(c)); 429 e = a.multiply(b).sum(a.multiply(c)); 430 431 assertEquals("a(b+c) = ab+ac", d, e); 432 } 433 434 435 /** 436 * Test univariate division. 437 */ 438 public void testUnivDivision() { 439 // rational numbers 440 BigRational rf = new BigRational(); 441 //System.out.println("rf = " + rf); 442 443 // non-commuting vars: x 444 WordFactory wf = new WordFactory("x"); 445 //System.out.println("wf = " + wf); 446 447 // polynomials over rational numbers 448 GenWordPolynomialRing<BigRational> fac = new GenWordPolynomialRing<BigRational>(rf, wf); 449 //System.out.println("fac = " + fac); 450 451 GenWordPolynomial<BigRational> a = fac.random(7, ll, el).monic(); 452 GenWordPolynomial<BigRational> b = fac.random(7, ll, el).monic(); 453 454 GenWordPolynomial<BigRational> c = a.multiply(b); 455 GenWordPolynomial<BigRational> d = b.multiply(a); 456 GenWordPolynomial<BigRational> e, f; 457 assertTrue("a*b == b*a", c.equals(d)); // since univariate 458 //System.out.println("a = " + a); 459 //System.out.println("b = " + b); 460 //System.out.println("c = " + c); 461 //System.out.println("d = " + d); 462 463 e = c.divide(a); 464 //System.out.println("e = " + e); 465 assertTrue("a*b/a == b", b.equals(e)); 466 d = c.divide(b); 467 //System.out.println("d = " + d); 468 assertTrue("a*b/b == a", a.equals(d)); 469 470 d = c.gcd(a); 471 //System.out.println("d = " + d); 472 assertTrue("gcd(a*b,a) == a", a.equals(d)); 473 474 d = a.gcd(b); 475 //System.out.println("d = " + d); 476 if (d.isConstant()) { 477 assertTrue("gcd(b,a) == 1", d.isONE()); 478 } else { 479 return; 480 } 481 d = a.modInverse(b); 482 //System.out.println("d = " + d); 483 e = d.multiply(a); 484 //System.out.println("e = " + e); 485 f = e.remainder(b); 486 //System.out.println("f = " + f); 487 assertTrue("d * a == 1 mod b ", f.isONE()); 488 } 489 490 491 /** 492 * Test multivariate 2 division. 493 */ 494 public void testMulti2Division() { 495 // rational numbers 496 BigRational rf = new BigRational(); 497 // System.out.println("rf = " + rf); 498 499 // non-commuting vars: xy 500 WordFactory wf = new WordFactory("xy"); 501 //System.out.println("wf = " + wf); 502 503 // polynomials over rational numbers 504 GenWordPolynomialRing<BigRational> fac = new GenWordPolynomialRing<BigRational>(rf, wf); 505 //System.out.println("fac = " + fac); 506 507 GenWordPolynomial<BigRational> a = fac.random(7, ll, el).monic(); 508 GenWordPolynomial<BigRational> b = fac.random(7, ll, el).monic(); 509 510 GenWordPolynomial<BigRational> c = a.multiply(b); 511 GenWordPolynomial<BigRational> d = b.multiply(a); 512 GenWordPolynomial<BigRational> e, f; 513 assertFalse("a*b == b*a", c.equals(d)); 514 //System.out.println("a = " + a); 515 //System.out.println("b = " + b); 516 //System.out.println("c = " + c); 517 //System.out.println("d = " + d); 518 519 e = c.divide(a); 520 //System.out.println("e = " + e); 521 assertTrue("a*b/a == b", b.equals(e)); 522 f = d.divide(b); 523 //System.out.println("f = " + f); 524 assertTrue("a*b/b == a", a.equals(f)); 525 526 try { 527 f = a.divide(b); 528 //System.out.println("f = " + f); 529 } catch (RuntimeException re) { 530 System.out.println("a divide b fail: " + a + ", " + b); 531 return; 532 } 533 WordFactory.WordComparator cmp = fac.alphabet.getDescendComparator(); 534 f = a.remainder(b); 535 //System.out.println("a = " + a); 536 //System.out.println("f = " + f); 537 assertTrue("a rem2 b <= a", cmp.compare(a.leadingWord(), f.leadingWord()) <= 0); 538 } 539 540 541 /** 542 * Test multivariate 3 division. 543 */ 544 public void testMulti3Division() { 545 // rational numbers 546 BigRational rf = new BigRational(); 547 // System.out.println("rf = " + rf); 548 549 // non-commuting vars: xyz 550 WordFactory wf = new WordFactory("xyz"); 551 //System.out.println("wf = " + wf); 552 553 // polynomials over rational numbers 554 GenWordPolynomialRing<BigRational> fac = new GenWordPolynomialRing<BigRational>(rf, wf); 555 //System.out.println("fac = " + fac); 556 557 GenWordPolynomial<BigRational> a = fac.random(7, ll, el).monic(); 558 GenWordPolynomial<BigRational> b = fac.random(7, ll, el).monic(); 559 560 GenWordPolynomial<BigRational> c = a.multiply(b); 561 GenWordPolynomial<BigRational> d = b.multiply(a); 562 GenWordPolynomial<BigRational> e, f; 563 assertFalse("a*b == b*a", c.equals(d)); 564 //System.out.println("a = " + a); 565 //System.out.println("b = " + b); 566 //System.out.println("c = " + c); 567 //System.out.println("d = " + d); 568 569 e = c.divide(a); 570 //System.out.println("e = " + e); 571 assertTrue("a*b/a == b", b.equals(e)); 572 f = d.divide(b); 573 //System.out.println("f = " + f); 574 assertTrue("a*b/b == a", a.equals(f)); 575 576 try { 577 f = a.divide(b); 578 //System.out.println("f = " + f); 579 } catch (RuntimeException re) { 580 System.out.println("a divide b fail: " + a + ", " + b); 581 return; 582 } 583 WordFactory.WordComparator cmp = fac.alphabet.getDescendComparator(); 584 f = a.remainder(b); 585 //System.out.println("a = " + a); 586 //System.out.println("f = " + f); 587 assertTrue("a rem3 b <= a: " + a.leadingWord() + ", " + f.leadingWord(), 588 cmp.compare(a.leadingWord(), f.leadingWord()) <= 0); 589 } 590 591 592 /** 593 * Test polynomial and solvable coefficients. 594 */ 595 public void testCoefficients() { 596 // integers 597 BigComplex rf = new BigComplex(); 598 //System.out.println("rf = " + rf); 599 600 // commuting vars: uvw 601 String[] cvar = new String[] { "u", "v", "w" }; 602 GenPolynomialRing<BigComplex> cf = new GenPolynomialRing<BigComplex>(rf, cvar); 603 //System.out.println("cf = " + cf); 604 605 // solvable vars: x1 x2 y1 y2 606 String[] svar = new String[] { "x1", "x2", "y1", "y2" }; 607 GenSolvablePolynomialRing<GenPolynomial<BigComplex>> sf; 608 sf = new GenSolvablePolynomialRing<GenPolynomial<BigComplex>>(cf, svar); 609 //System.out.println("sf = " + sf); 610 RelationGenerator<GenPolynomial<BigComplex>> wr = new WeylRelations<GenPolynomial<BigComplex>>(); 611 wr.generate(sf); 612 //System.out.println("sf = " + sf); 613 614 // non-commuting vars: abcdef 615 WordFactory wf = new WordFactory("abcdef"); 616 //System.out.println("wf = " + wf); 617 // non-commuting polynomials over commuting and solvable coefficients 618 GenWordPolynomialRing<GenPolynomial<GenPolynomial<BigComplex>>> nf; 619 nf = new GenWordPolynomialRing<GenPolynomial<GenPolynomial<BigComplex>>>(sf, wf); 620 //want: GenWordPolynomialRing<GenSolvablePolynomial<GenPolynomial<BigComplex>>> nf; 621 //System.out.println("nf = " + nf.toScript()); 622 623 assertFalse("not commutative",nf.isCommutative()); 624 assertTrue("associative",nf.isAssociative()); 625 assertFalse("not field",nf.isField()); 626 627 GenWordPolynomial<GenPolynomial<GenPolynomial<BigComplex>>> p = nf.getONE(); 628 //System.out.println("p = " + p); 629 assertTrue("p == 1", p.isONE()); 630 p = nf.getZERO(); 631 //System.out.println("p = " + p); 632 assertTrue("p == 0", p.isZERO()); 633 p = nf.random(3); 634 //System.out.println("p = " + p); 635 //p = p.sum(p); 636 p = p.multiply(p); 637 //System.out.println("p = " + p); 638 p = p.subtract(p); 639 //System.out.println("p = " + p); 640 assertTrue("p == 0", p.isZERO()); 641 642 List<GenWordPolynomial<GenPolynomial<GenPolynomial<BigComplex>>>> gens = nf.generators(); 643 //System.out.println("gens = " + gens); 644 assertTrue("#gens == 2+3+4+6", gens.size() == 15); 645 } 646 647 648 /** 649 * Test contraction. 650 */ 651 public void testContraction() { 652 // integers 653 BigInteger rf = new BigInteger(); 654 //System.out.println("rf = " + rf); 655 656 // non-commuting vars: abcdef 657 WordFactory wf = new WordFactory("abcdef"); 658 //System.out.println("wf = " + wf); 659 WordFactory wfs = new WordFactory("abc"); 660 //System.out.println("wf = " + wf); 661 662 // polynomials over integers 663 GenWordPolynomialRing<BigInteger> pf = new GenWordPolynomialRing<BigInteger>(rf, wf); 664 //System.out.println("pf = " + pf); 665 GenWordPolynomialRing<BigInteger> pfs = new GenWordPolynomialRing<BigInteger>(rf, wfs); 666 //System.out.println("pfs = " + pfs); 667 668 List<GenWordPolynomial<BigInteger>> H = new ArrayList<GenWordPolynomial<BigInteger>>(); 669 670 GenWordPolynomial<BigInteger> a = pf.random(5).abs(); 671 //System.out.println("a = " + a); 672 GenWordPolynomial<BigInteger> as = pfs.random(5).abs(); 673 //System.out.println("as = " + as); 674 GenWordPolynomial<BigInteger> asf = pf.valueOf(as); 675 H.add(asf); 676 H.add(asf.multiply(pf.valueOf(pfs.random(5).abs()))); 677 H.add(pfs.random(5).abs()); 678 //System.out.println("asf = " + asf); 679 GenWordPolynomial<BigInteger> asfc = asf.contract(pfs); 680 //System.out.println("asfc = " + asfc); 681 assertEquals("as == contract(extend(as)): ", as, asfc); 682 683 // mostly not contractable 684 GenWordPolynomial<BigInteger> ac = a.contract(pfs); 685 H.add(a); 686 //System.out.println("ac = " + ac); 687 assertTrue("contract(a) == 0: " + ac, ac.isZERO() || pf.valueOf(ac).equals(a)); 688 689 // 1 always contractable 690 a = pf.getONE(); 691 H.add(a); 692 ac = a.contract(pfs); 693 //System.out.println("ac = " + ac); 694 assertTrue("contract(1) == 1: ", ac.isONE()); 695 696 // now contract lists of word polynomials 697 //System.out.println("H = " + H); 698 List<GenWordPolynomial<BigInteger>> M = PolyUtil.<BigInteger> intersect(pfs,H); 699 //System.out.println("M = " + M); 700 int i = 0; 701 for (GenWordPolynomial<BigInteger> h : H) { 702 if (!h.contract(pfs).isZERO()) { 703 assertEquals("extend(contract(h)) == h: " + h, h, pf.valueOf(M.get(i++)) ); 704 } 705 } 706 } 707 708 709 /** 710 * Test constructors and factory. 711 */ 712 @SuppressWarnings("unchecked") 713 public void testParser() { 714 BigInteger rf = new BigInteger(); 715 //System.out.println("rf = " + rf.toScriptFactory()); 716 717 // non-commuting vars: abcdef 718 String[] sa = new String[]{"a", "b", "c", "d", "e", "f"}; 719 WordFactory wf = new WordFactory(sa); 720 //System.out.println("wf = " + wf.toScript()); 721 722 // word polynomials over integers 723 GenWordPolynomialRing<BigInteger> pf = new GenWordPolynomialRing<BigInteger>(rf, wf); 724 //System.out.println("pf = " + pf.toScript()); 725 assertFalse("not commutative",pf.isCommutative()); 726 assertTrue("associative",pf.isAssociative()); 727 assertFalse("not field",pf.isField()); 728 729 List<GenWordPolynomial<BigInteger>> gens = pf.generators(); 730 //System.out.println("pf = " + gens); 731 GenWordPolynomial<BigInteger> ga, gb, crel; 732 ga = gens.get(1); 733 gb = gens.get(2); 734 //System.out.println("ga = " + ga); 735 //System.out.println("gb = " + gb); 736 crel = ga.multiply(gb).subtract(gb.multiply(ga)); 737 //System.out.println("crel = " + crel); 738 739 StringReader sr = new StringReader("a b - b a, b c - c b"); 740 GenPolynomialTokenizer tok = new GenPolynomialTokenizer(sr); 741 742 GenWordPolynomial<BigInteger> a; 743 // parse of tokenizer 744 try { 745 a = (GenWordPolynomial) tok.nextWordPolynomial(pf); 746 } catch (IOException e) { 747 a = null; 748 e.printStackTrace(); 749 } 750 //System.out.println("a = " + a); 751 assertEquals("parse() == ab - ba: ", a, crel); 752 753 // now parse of factory 754 a = pf.parse("a b - b a"); 755 //System.out.println("a = " + a); 756 assertEquals("parse() == ab - ba: ", a, crel); 757 758 // polynomials over integers 759 GenPolynomialRing<BigInteger> fac = new GenPolynomialRing<BigInteger>(rf, sa); 760 //System.out.println("fac = " + fac.toScript()); 761 assertTrue("commutative",fac.isCommutative()); 762 assertTrue("associative",fac.isAssociative()); 763 assertFalse("not field",fac.isField()); 764 765 sr = new StringReader("a b - b a, b c - c b"); 766 tok = new GenPolynomialTokenizer(fac,sr); 767 // parse of tokenizer 768 try { 769 a = (GenWordPolynomial) tok.nextWordPolynomial(); 770 } catch (IOException e) { 771 a = null; 772 e.printStackTrace(); 773 } 774 //System.out.println("a = " + a); 775 assertEquals("parse() == ab - ba: ", a, crel); 776 } 777 778}