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 junit.framework.Test; 013import junit.framework.TestCase; 014import junit.framework.TestSuite; 015 016 017 018import edu.jas.arith.BigRational; 019import edu.jas.poly.ExpVector; 020import edu.jas.poly.GenPolynomial; 021import edu.jas.poly.GenPolynomialRing; 022import edu.jas.poly.GenSolvablePolynomial; 023import edu.jas.poly.GenWordPolynomial; 024import edu.jas.poly.GenWordPolynomialRing; 025import edu.jas.poly.RecSolvableWordPolynomial; 026import edu.jas.poly.RelationGenerator; 027import edu.jas.poly.TermOrder; 028import edu.jas.poly.WeylRelations; 029 030 031/** 032 * BigRational coefficients ResidueSolvableWordPolynomial tests with JUnit. 033 * @author Heinz Kredel 034 */ 035 036public class ResidueSolvableWordPolynomialTest extends TestCase { 037 038 039 /** 040 * main. 041 */ 042 public static void main(String[] args) { 043 044 junit.textui.TestRunner.run(suite()); 045 } 046 047 048 /** 049 * Constructs a <CODE>ResidueSolvableWordPolynomialTest</CODE> object. 050 * @param name String. 051 */ 052 public ResidueSolvableWordPolynomialTest(String name) { 053 super(name); 054 } 055 056 057 /** 058 */ 059 public static Test suite() { 060 TestSuite suite = new TestSuite(ResidueSolvableWordPolynomialTest.class); 061 return suite; 062 } 063 064 065 ResidueSolvableWordPolynomial<BigRational> a, b, c, d, e, f, x1, x2; 066 067 068 int rl = 4; 069 070 071 int kl = 2; 072 073 074 int ll = 3; 075 076 077 int el = 2; 078 079 080 float q = 0.3f; 081 082 083 String[] cvars = new String[] { "a", "b" }; 084 085 086 String[] vars = new String[] { "w", "x", "y", "z" }; 087 088 089 WordResidueRing<BigRational> rring; 090 091 092 WordIdeal<BigRational> wideal; 093 094 095 ResidueSolvableWordPolynomialRing<BigRational> ring; 096 097 098 BigRational cfac; 099 100 101 GenWordPolynomialRing<BigRational> wring; 102 103 104 GenPolynomialRing<BigRational> cring; 105 106 107 TermOrder tord = new TermOrder(TermOrder.INVLEX); 108 109 110 @Override 111 protected void setUp() { 112 cfac = new BigRational(1); 113 wring = new GenWordPolynomialRing<BigRational>(cfac, cvars); 114 //RelationGenerator<BigRational> wc = new WeylRelations<BigRational>(); 115 //not possible: wring.addRelations(wc); 116 List<GenWordPolynomial<BigRational>> il = new ArrayList<GenWordPolynomial<BigRational>>(); 117 //GenWordPolynomial<BigRational> p1 = wring.parse("b - a^2"); // not associative 118 //GenWordPolynomial<BigRational> p1 = wring.parse("b - a^3"); // not associative 119 //GenWordPolynomial<BigRational> p1 = wring.parse("b a - 1"); // Weyl relation, result not assoc 120 //GenWordPolynomial<BigRational> p1 = wring.parse("a b - 1"); // isAssoc? 121 GenWordPolynomial<BigRational> p1 = wring.parse("b a - a b"); // commutative, okay 122 il.add(p1); 123 //p1 = wring.parse("a - b^5"); 124 //il.add(p1); 125 //System.out.println("il = " + il); 126 wideal = new WordIdeal<BigRational>(wring, il); 127 //System.out.println("wideal = " + wideal.toScript()); 128 wideal = wideal.GB(); 129 //System.out.println("twosided wideal = " + wideal.toScript()); 130 if (wideal.isONE()) { 131 System.out.println("twosided wideal = " + wideal.toScript()); 132 throw new IllegalArgumentException("ideal is one"); 133 } 134 rring = new WordResidueRing<BigRational>(wideal); 135 //System.out.println("rring = " + rring.toScript()); 136 ring = new ResidueSolvableWordPolynomialRing<BigRational>(rring, tord, vars); 137 RelationGenerator<WordResidue<BigRational>> wl = new WeylRelations<WordResidue<BigRational>>(); 138 wl.generate(ring); 139 List<GenSolvablePolynomial<WordResidue<BigRational>>> qrel = ring.table.relationList(); 140 //System.out.println("qrel = " + qrel); 141 List<GenSolvablePolynomial<GenWordPolynomial<BigRational>>> prel = new ArrayList<GenSolvablePolynomial<GenWordPolynomial<BigRational>>>(); 142 for (GenSolvablePolynomial<WordResidue<BigRational>> q : qrel) { 143 GenSolvablePolynomial<GenWordPolynomial<BigRational>> p = ring.toPolyCoefficients(q); 144 prel.add(p); 145 } 146 //System.out.println("prel = " + prel); 147 ring.polCoeff.table.addSolvRelations(prel); 148 //System.out.println("ring = " + ring.toScript()); 149 a = b = c = d = e = null; 150 } 151 152 153 @Override 154 protected void tearDown() { 155 ring = null; 156 a = b = c = d = e = null; 157 } 158 159 160 /** 161 * Test constructor, generators and properties. 162 */ 163 public void testConstructor() { 164 assertFalse("not commutative", ring.isCommutative()); 165 assertTrue("associative", ring.isAssociative()); 166 167 a = new ResidueSolvableWordPolynomial<BigRational>(ring); 168 assertTrue("length( a ) = 0", a.length() == 0); 169 assertTrue("isZERO( a )", a.isZERO()); 170 assertTrue("isONE( a )", !a.isONE()); 171 172 c = ring.getONE(); 173 assertTrue("length( c ) = 1", c.length() == 1); 174 assertTrue("isZERO( c )", !c.isZERO()); 175 assertTrue("isONE( c )", c.isONE()); 176 177 d = ring.getZERO(); 178 assertTrue("length( d ) = 0", d.length() == 0); 179 assertTrue("isZERO( d )", d.isZERO()); 180 assertTrue("isONE( d )", !d.isONE()); 181 //System.out.println("d = " + d); 182 183 //System.out.println(""); 184 for (GenPolynomial<WordResidue<BigRational>> g : ring.generators()) { 185 //System.out.print("g = " + g + ", "); 186 assertFalse("not isZERO( g )", g.isZERO()); 187 } 188 //System.out.println(""); 189 } 190 191 192 /** 193 * Test random polynomial and conversion. 194 */ 195 public void testRandom() { 196 for (int i = 0; i < 3; i++) { 197 // a = ring.random(ll+2*i); 198 a = ring.random(kl * (i + 1), ll + 2 * i, el + i, q); 199 //System.out.println("a = " + a); 200 assertTrue("length( a" + i + " ) <> 0", a.length() >= 0); 201 assertTrue(" not isZERO( a" + i + " )", !a.isZERO()); 202 assertTrue(" not isONE( a" + i + " )", !a.isONE()); 203 204 RecSolvableWordPolynomial<BigRational> b = ring.toPolyCoefficients(a); 205 c = ring.fromPolyCoefficients(b); 206 assertEquals("res(poly(a)) == a", a, c); 207 } 208 } 209 210 211 /** 212 * Test addition. 213 */ 214 public void testAddition() { 215 a = ring.random(kl, ll, el, q); 216 c = (ResidueSolvableWordPolynomial<BigRational>) a.subtract(a); 217 assertTrue("a-a = 0", c.isZERO()); 218 219 b = (ResidueSolvableWordPolynomial<BigRational>) a.sum(a); 220 c = (ResidueSolvableWordPolynomial<BigRational>) b.subtract(a); 221 assertEquals("a+a-a = a", c, a); 222 223 b = ring.random(kl, ll, el, q); 224 c = (ResidueSolvableWordPolynomial<BigRational>) b.sum(a); 225 d = (ResidueSolvableWordPolynomial<BigRational>) a.sum(b); 226 assertEquals("a+b = b+a", c, d); 227 228 c = ring.random(kl, ll, el, q); 229 d = (ResidueSolvableWordPolynomial<BigRational>) a.sum(b.sum(c)); 230 e = (ResidueSolvableWordPolynomial<BigRational>) a.sum(b).sum(c); 231 assertEquals("a+(b+c) = (a+b)+c", d, e); 232 //System.out.println("a = " + a); 233 //System.out.println("b = " + b); 234 //System.out.println("c = " + c); 235 //System.out.println("d = " + d); 236 //System.out.println("e = " + e); 237 238 ExpVector u = ExpVector.random(rl, el, q); 239 WordResidue<BigRational> x = rring.random(kl); 240 //System.out.println("x = " + x); 241 //System.out.println("u = " + u); 242 243 b = ring.getONE().multiply(x, u); 244 c = (ResidueSolvableWordPolynomial<BigRational>) a.sum(b); 245 d = (ResidueSolvableWordPolynomial<BigRational>) a.sum(x, u); 246 //System.out.println("a = " + a); 247 //System.out.println("b = " + b); 248 //System.out.println("c = " + c); 249 //System.out.println("d = " + d); 250 assertEquals("a+p(x,u) = a+(x,u)", c, d); 251 252 c = (ResidueSolvableWordPolynomial<BigRational>) a.subtract(b); 253 d = (ResidueSolvableWordPolynomial<BigRational>) a.subtract(x, u); 254 assertEquals("a-p(x,u) = a-(x,u)", c, d); 255 256 a = ring.getZERO(); 257 b = ring.getONE().multiply(x, u); 258 c = (ResidueSolvableWordPolynomial<BigRational>) b.sum(a); 259 d = (ResidueSolvableWordPolynomial<BigRational>) a.sum(x, u); 260 assertEquals("a+p(x,u) = a+(x,u)", c, d); 261 262 c = (ResidueSolvableWordPolynomial<BigRational>) a.subtract(b); 263 d = (ResidueSolvableWordPolynomial<BigRational>) a.subtract(x, u); 264 assertEquals("a-p(x,u) = a-(x,u)", c, d); 265 } 266 267 268 /** 269 * Test multiplication. 270 */ 271 public void testMultiplication() { 272 //System.out.println("ring = " + ring); 273 a = ring.random(kl, ll, el, q); 274 //a = ring.parse(" b y z + a w z "); 275 b = ring.random(kl, ll, el, q); 276 //b = ring.parse(" w x - b x "); 277 278 c = b.multiply(a); 279 d = a.multiply(b); 280 //System.out.println("a = " + a); 281 //System.out.println("b = " + b); 282 //System.out.println("c = " + c); 283 //System.out.println("d = " + d); 284 assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector())); 285 286 c = ring.random(kl, ll, el, q); 287 //a = ring.parse("( ( a + 11/5 ) )"); 288 //b = ring.parse("( ( a + 35/6 ) )"); 289 //c = ring.parse("( ( b a + 11/24 a ) )"); 290 //System.out.println("a = " + a); 291 //System.out.println("b = " + b); 292 //System.out.println("c = " + c); 293 294 d = a.multiply(b.multiply(c)); 295 e = a.multiply(b).multiply(c); 296 //System.out.println("d = " + d); 297 //System.out.println("e = " + e); 298 //System.out.println("d-e = " + d.subtract(e)); 299 assertEquals("a(bc) = (ab)c", d, e); 300 301 d = (ResidueSolvableWordPolynomial<BigRational>) a.monic(); 302 //System.out.println("d = " + d); 303 assertTrue("a.monic(): " + d, d.leadingBaseCoefficient().isONE() 304 || d.leadingBaseCoefficient().abs().equals(a.leadingBaseCoefficient().abs())); 305 } 306 307 308 /** 309 * Test distributive law. 310 */ 311 public void testDistributive() { 312 a = ring.random(kl, ll, el, q); 313 b = ring.random(kl, ll, el, q); 314 c = ring.random(kl, ll, el, q); 315 316 d = a.multiply((ResidueSolvableWordPolynomial<BigRational>) b.sum(c)); 317 e = (ResidueSolvableWordPolynomial<BigRational>) a.multiply(b).sum(a.multiply(c)); 318 assertEquals("a(b+c) = ab+ac", d, e); 319 } 320 321 322 /** 323 * Test word coefficient ring. 324 */ 325 public void testWordCoeffsRelations() { 326 assertTrue("# relations == 2", ring.table.size() == 2); 327 assertFalse("isCommutative()", ring.isCommutative()); 328 assertTrue("isAssociative()", ring.isAssociative()); 329 //System.out.println("ring = " + ring.toScript()); 330 331 ResidueSolvableWordPolynomial<BigRational> r1 = ring.parse("x"); 332 GenWordPolynomial<BigRational> r2 = wring.parse("a"); 333 ResidueSolvableWordPolynomial<BigRational> rp = ring.parse("a x + b"); 334 GenSolvablePolynomial<GenWordPolynomial<BigRational>> pp = ring.toPolyCoefficients(rp); 335 //System.out.println("r1 = " + r1); 336 //System.out.println("r2 = " + r2); 337 //System.out.println("rp = " + rp); 338 //System.out.println("pp = " + pp); 339 ring.polCoeff.coeffTable.update(r1.leadingExpVector(), r2.leadingWord().leadingExpVector(), pp); 340 341 //System.out.println("ring = " + ring.toScript()); 342 343 assertFalse("isCommutative()", ring.isCommutative()); 344 assertTrue("isAssociative()", ring.isAssociative()); 345 346 List<GenPolynomial<WordResidue<BigRational>>> gens = ring.generators(); 347 for (GenPolynomial<WordResidue<BigRational>> x : gens) { 348 GenSolvablePolynomial<WordResidue<BigRational>> xx = (GenSolvablePolynomial<WordResidue<BigRational>>) x; 349 a = new ResidueSolvableWordPolynomial<BigRational>(ring, xx); 350 for (GenPolynomial<WordResidue<BigRational>> y : gens) { 351 GenSolvablePolynomial<WordResidue<BigRational>> yy = (GenSolvablePolynomial<WordResidue<BigRational>>) y; 352 b = new ResidueSolvableWordPolynomial<BigRational>(ring, yy); 353 c = a.multiply(b); 354 //System.out.println("gens:" + a + " * " + b + " = " + c); 355 ExpVector ev = a.leadingExpVector().sum(b.leadingExpVector()); 356 // not always true 357 assertTrue("LT(a)*LT(b) == LT(c)", c.leadingExpVector().equals(ev)); 358 // not true 359 //ev = a.leadingBaseCoefficient().val.leadingWord().leadingExpVector() 360 // .sum(b.leadingBaseCoefficient().val.leadingWord().leadingExpVector()); 361 //assertTrue("LT(lc(a))*LT(lc(b)) == LT(lc(c))", c.leadingBaseCoefficient().val.leadingWord() 362 // .leadingExpVector().equals(ev)); 363 } 364 } 365 //System.out.println("ring = " + ring.toScript()); 366 367 a = ring.random(kl, ll, el, q); 368 //a = ring.getONE(); 369 //System.out.println("a = " + a); 370 b = ring.random(kl, ll, el, q); 371 //b = ring.getONE(); 372 //System.out.println("b = " + b); 373 374 // non-commutative 375 c = b.multiply(a); 376 d = a.multiply(b); 377 //System.out.println("c = " + c); 378 //System.out.println("d = " + d); 379 assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector())); 380 } 381 382 383 /** 384 * Test extension and contraction for Weyl relations. 385 */ 386 public void testExtendContractWeyl() { 387 ResidueSolvableWordPolynomial<BigRational> r1 = ring.parse("x"); 388 GenWordPolynomial<BigRational> r2 = wring.parse("a"); 389 ResidueSolvableWordPolynomial<BigRational> rp = ring.parse("a x + b"); 390 ring.polCoeff.coeffTable.update(r1.leadingExpVector(), r2.leadingWord().leadingExpVector(), 391 ring.toPolyCoefficients(rp)); 392 393 int k = rl; 394 ResidueSolvableWordPolynomialRing<BigRational> pfe = ring.extend(k); 395 //System.out.println("pfe = " + pfe); 396 ResidueSolvableWordPolynomialRing<BigRational> pfec = pfe.contract(k); 397 //System.out.println("pfec = " + pfec); 398 assertEquals("ring == pfec", ring, pfec); 399 400 ResidueSolvableWordPolynomial<BigRational> a = ring.random(kl, ll, el, q); 401 //System.out.println("a = " + a); 402 403 ResidueSolvableWordPolynomial<BigRational> ae = (ResidueSolvableWordPolynomial<BigRational>) a 404 .extend(pfe, 0, 0); 405 //System.out.println("ae = " + ae); 406 407 Map<ExpVector, GenPolynomial<WordResidue<BigRational>>> m = ae.contract(pfec); 408 List<GenPolynomial<WordResidue<BigRational>>> ml = new ArrayList<GenPolynomial<WordResidue<BigRational>>>( 409 m.values()); 410 GenPolynomial<WordResidue<BigRational>> aec = ml.get(0); 411 //System.out.println("ae = " + ae); 412 //System.out.println("aec = " + aec); 413 assertEquals("a == aec", a, aec); 414 } 415 416 417 /** 418 * Test reversion for Weyl relations. 419 */ 420 public void testReverseWeyl() { 421 ResidueSolvableWordPolynomial<BigRational> r1 = ring.parse("x"); 422 GenWordPolynomial<BigRational> r2 = wring.parse("a"); 423 ResidueSolvableWordPolynomial<BigRational> rp = ring.parse("a x + b"); 424 ring.polCoeff.coeffTable.update(r1.leadingExpVector(), r2.leadingWord().leadingExpVector(), 425 ring.toPolyCoefficients(rp)); 426 427 ResidueSolvableWordPolynomialRing<BigRational> pfr = ring.reverse(); 428 ResidueSolvableWordPolynomialRing<BigRational> pfrr = pfr.reverse(); 429 assertEquals("pf == pfrr", ring, pfrr); 430 //System.out.println("ring = " + ring); 431 //System.out.println("pfr = " + pfr); 432 433 ResidueSolvableWordPolynomial<BigRational> a = ring.random(kl, ll, el, q); 434 //System.out.println("a = " + a); 435 436 ResidueSolvableWordPolynomial<BigRational> ar = (ResidueSolvableWordPolynomial<BigRational>) a 437 .reverse(pfr); 438 ResidueSolvableWordPolynomial<BigRational> arr = (ResidueSolvableWordPolynomial<BigRational>) ar 439 .reverse(pfrr); 440 assertEquals("a == arr", a, arr); 441 //System.out.println("ar = " + ar); 442 //System.out.println("arr = " + arr); 443 } 444 445}