001/* 002 * $Id$ 003 */ 004 005package edu.jas.application; 006 007 008import java.util.ArrayList; 009import java.util.List; 010 011import edu.jas.arith.BigRational; 012import edu.jas.gb.WordGroebnerBaseSeq; 013// import edu.jas.kern.ComputerThreads; 014import edu.jas.poly.GenWordPolynomial; 015import edu.jas.poly.GenWordPolynomialRing; 016import edu.jas.poly.PolynomialList; 017import edu.jas.poly.TermOrder; 018 019import junit.framework.Test; 020import junit.framework.TestCase; 021import junit.framework.TestSuite; 022 023 024/** 025 * WordIdeal tests with JUnit. 026 * @author Heinz Kredel 027 */ 028public class WordIdealTest extends TestCase { 029 030 031 /** 032 * main 033 */ 034 public static void main(String[] args) { 035 junit.textui.TestRunner.run(suite()); 036 } 037 038 039 /** 040 * Constructs a <CODE>WordIdealTest</CODE> object. 041 * @param name String. 042 */ 043 public WordIdealTest(String name) { 044 super(name); 045 //ComputerThreads.terminate(); 046 } 047 048 049 /** 050 * suite. 051 */ 052 public static Test suite() { 053 TestSuite suite = new TestSuite(WordIdealTest.class); 054 return suite; 055 } 056 057 058 TermOrder to; 059 060 061 GenWordPolynomialRing<BigRational> fac; 062 063 064 List<GenWordPolynomial<BigRational>> L, M; 065 066 067 PolynomialList<BigRational> F; 068 069 070 List<GenWordPolynomial<BigRational>> G; 071 072 073 WordGroebnerBaseSeq<BigRational> bb; 074 075 076 GenWordPolynomial<BigRational> a, b, c, d, e; 077 078 079 int kl = 3; //10 080 081 082 int ll = 5; //7 083 084 085 int el = 2; 086 087 088 @Override 089 protected void setUp() { 090 BigRational coeff = new BigRational(17, 1); 091 to = new TermOrder( /*TermOrder.INVLEX*/); 092 String[] vars = new String[] { "x", "y", "z" }; 093 //WordFactory wf = new WordFactory(vars); 094 fac = new GenWordPolynomialRing<BigRational>(coeff, vars); 095 bb = new WordGroebnerBaseSeq<BigRational>(); 096 //bb = GBFactory.getImplementation(coeff); 097 //bb.timestatus.setNotActive(); // allow infintite computation 098 a = b = c = d = e = null; 099 } 100 101 102 @Override 103 protected void tearDown() { 104 a = b = c = d = e = null; 105 fac = null; 106 bb = null; 107 } 108 109 110 /** 111 * Test Ideal sum. 112 */ 113 public void testIdealSum() { 114 WordIdeal<BigRational> I, J, K; 115 L = new ArrayList<GenWordPolynomial<BigRational>>(); 116 117 a = fac.random(kl, ll, el); 118 b = fac.random(kl, ll, el); 119 c = fac.random(kl, ll, el); 120 d = fac.random(kl, ll, el); 121 e = d; //fac.random(kl, ll, el); 122 123 //System.out.println("a = " + a); 124 //System.out.println("b = " + b); 125 //System.out.println("c = " + c); 126 //System.out.println("d = " + d); 127 128 L.add(a); 129 //System.out.println("L = " + L.size() ); 130 131 I = new WordIdeal<BigRational>(fac, L, true, bb); 132 assertTrue("isGB( I )", I.isGB()); 133 134 I = new WordIdeal<BigRational>(fac, L, false, bb); 135 assertTrue("isGB( I )", I.isGB()); 136 137 L = bb.GB(L); 138 assertTrue("isGB( { a } )", bb.isGB(L)); 139 140 I = new WordIdeal<BigRational>(fac, L, true, bb); 141 assertTrue("isGB( I )", I.isGB()); 142 143 I = new WordIdeal<BigRational>(fac, L, false, bb); 144 assertTrue("isGB( I )", I.isGB()); 145 146 String s = I.toScript() + "\n" + I.toString(); 147 //System.out.println("#s = " + s.length() + ": " + s); 148 assertTrue("#s >= 46: " + s + ", #s = " + s.length(), s.length() >= 46); 149 150 K = I.getZERO(); 151 assertTrue("K == 0: " + K, K.isZERO()); 152 K = I.getONE(); 153 assertTrue("K == 1: " + K, K.isONE()); 154 155 //assertTrue("not isZERO( b )", !b.isZERO()); 156 L.add(b); 157 //System.out.println("L = " + L.size() ); 158 159 I = new WordIdeal<BigRational>(fac, L, false, bb); 160 assertTrue("not isZERO( I )", !I.isZERO()); 161 //assertTrue("not isONE( I )", !I.isONE() ); 162 //assertTrue("not isGB( I )", !I.isGB() ); 163 164 L = bb.GB(L); 165 assertTrue("isGB( { a, b } )", bb.isGB(L)); 166 167 I = new WordIdeal<BigRational>(fac, L, true, bb); 168 assertTrue("not isZERO( I )", !I.isZERO()); 169 // assertTrue("not isONE( I )", !I.isONE() ); 170 assertTrue("isGB( I )", I.isGB()); 171 172 J = I; 173 K = J.sum(I); 174 //assertTrue("not isZERO( K )", !K.isZERO()); 175 assertTrue("isGB( K )", K.isGB()); 176 assertTrue("equals( K, I )", K.equals(I)); 177 assertEquals("compareTo( K, I )", K.compareTo(I), 0); 178 179 K = J.sum(I.getList()); 180 assertTrue("isGB( K )", K.isGB()); 181 assertTrue("equals( K, I )", K.equals(I)); 182 assertEquals("compareTo( K, I )", K.compareTo(I), 0); 183 184 K = J.sum(I.getList().get(0)); 185 assertTrue("isGB( K )", K.isGB()); 186 assertTrue("equals( K, I )", K.equals(I)); 187 assertEquals("compareTo( K, I )", K.compareTo(I), 0); 188 189 L = new ArrayList<GenWordPolynomial<BigRational>>(); 190 191 L.add(c); 192 assertTrue("isGB( { c } )", bb.isGB(L)); 193 194 J = new WordIdeal<BigRational>(fac, L, true, bb); 195 K = J.sum(I); 196 assertTrue("isGB( K )", K.isGB()); 197 assertTrue("K contains(I)", K.contains(I)); 198 assertTrue("K contains(J)", K.contains(J)); 199 200 L = new ArrayList<GenWordPolynomial<BigRational>>(); 201 L.add(d); 202 203 assertTrue("isGB( { d } )", bb.isGB(L)); 204 J = new WordIdeal<BigRational>(fac, L, true, bb); 205 I = K; 206 K = J.sum(I); 207 assertTrue("isGB( K )", K.isGB()); 208 assertTrue("K contains(I)", K.contains(I)); 209 assertTrue("K contains(J)", K.contains(J)); 210 211 L = new ArrayList<GenWordPolynomial<BigRational>>(); 212 L.add(e); 213 214 assertTrue("isGB( { e } )", bb.isGB(L)); 215 J = new WordIdeal<BigRational>(fac, L, true, bb); 216 I = K; 217 K = J.sum(I); 218 assertTrue("isGB( K )", K.isGB()); 219 assertTrue("equals( K, I )", K.equals(I)); 220 assertTrue("K contains(J)", K.contains(I)); 221 assertTrue("I contains(K)", I.contains(K)); 222 assertEquals("compareTo( K, I )", K.compareTo(I), 0); 223 224 L.clear(); 225 e = fac.parse("x x"); 226 L.add(e); 227 I = new WordIdeal<BigRational>(fac, L, true, bb); 228 I.doGB(); 229 J = I.power(3); 230 J = J.power(2); 231 K = I.power(6); 232 //System.out.println("I = " + I); 233 //System.out.println("J = " + J); 234 //System.out.println("K = " + K); 235 assertEquals("equals( (I**3)**2, I**6 )", K, J); 236 } 237 238 239 /** 240 * Test WordIdeal product. Sometimes non-terminating. 241 */ 242 public void testWordIdealProduct() { 243 WordIdeal<BigRational> I, J, K, H, G; 244 a = fac.random(kl, ll, el); 245 b = fac.random(kl, ll, el); 246 c = fac.random(kl, ll, el); 247 d = c; //fac.random(kl, ll, el); 248 e = d; //fac.random(kl, ll, el); 249 250 //System.out.println("a = " + a); 251 //System.out.println("b = " + b); 252 //System.out.println("c = " + c); 253 //System.out.println("d = " + d); 254 255 L = new ArrayList<GenWordPolynomial<BigRational>>(); 256 L.add(a); 257 258 I = new WordIdeal<BigRational>(fac, L, false, bb); 259 assertTrue("not isONE( I )", !I.isONE() || a.isConstant()); 260 assertTrue("isGB( I )", I.isGB()); 261 262 L = new ArrayList<GenWordPolynomial<BigRational>>(); 263 L.add(b); 264 265 J = new WordIdeal<BigRational>(fac, L, false, bb); 266 assertTrue("not isONE( J )", !J.isONE() || a.isConstant() || b.isConstant()); 267 assertTrue("isGB( J )", J.isGB()); 268 269 K = I.product(J); 270 //System.out.println("I = " + I); 271 //System.out.println("J = " + J); 272 //System.out.println("K = " + K); 273 H = J.product(I); 274 //System.out.println("H = " + H); 275 G = K.sum(H); 276 //System.out.println("G = " + G); 277 assertTrue("isGB( K )", K.isGB()); 278 assertTrue("isGB( H )", H.isGB()); 279 assertTrue("isGB( G )", G.isGB()); 280 //non-com 281 assertTrue("I contains(K)", I.contains(K)); 282 assertTrue("J contains(H)", J.contains(H)); 283 284 K = I.product(J.getList().get(0)); 285 //System.out.println("I = " + I); 286 //System.out.println("J = " + J); 287 //System.out.println("K = " + K); 288 assertTrue("isGB( K )", K.isGB()); 289 assertTrue("I contains(K)", I.contains(K)); 290 291 292 L = new ArrayList<GenWordPolynomial<BigRational>>(); 293 L.add(a); 294 //L.add(c); 295 L = bb.GB(L); // may be infinite with c 296 297 I = new WordIdeal<BigRational>(fac, L, true, bb); 298 //System.out.println("I = " + I); 299 assertTrue("isGB( I )", I.isGB()); 300 301 //System.out.println("J = " + J); 302 K = I.product(J); 303 //System.out.println("K = " + K); 304 assertTrue("isGB( K )", K.isGB()); 305 assertTrue("I contains(K)", I.contains(K)); 306 assertTrue("J contains(K)", J.contains(K)); 307 308 M = I.normalform(K.getList()); 309 H = new WordIdeal<BigRational>(fac, M, false, bb); 310 //System.out.println("I = " + I); 311 //System.out.println("K = " + K); 312 //System.out.println("H = " + H); 313 assertTrue("isGB( H )", H.isGB()); 314 assertTrue("isZERO( H )", H.isZERO()); 315 } 316 317 318 /** 319 * Test WordIdeal common zeros. 320 */ 321 public void testWordIdealCommonZeros() { 322 WordIdeal<BigRational> I, J; 323 L = new ArrayList<GenWordPolynomial<BigRational>>(); 324 325 I = new WordIdeal<BigRational>(fac, L, true, bb); 326 assertEquals("commonZeroTest( I )", I.commonZeroTest(), 1); 327 328 a = fac.getZERO(); 329 L.add(a); 330 I = new WordIdeal<BigRational>(fac, L, true, bb); 331 assertEquals("commonZeroTest( I )", I.commonZeroTest(), 1); 332 333 b = fac.getONE(); 334 L.add(b); 335 I = new WordIdeal<BigRational>(fac, L, true, bb); 336 assertEquals("commonZeroTest( I )", I.commonZeroTest(), -1); 337 338 L = new ArrayList<GenWordPolynomial<BigRational>>(); 339 a = fac.random(kl, ll, el); 340 if (!a.isZERO() && !a.isConstant()) { 341 L.add(a); 342 I = new WordIdeal<BigRational>(fac, L, true, bb); 343 assertEquals("commonZeroTest( I )", I.commonZeroTest(), 1); 344 } 345 346 L = (List<GenWordPolynomial<BigRational>>) fac.univariateList(); 347 //System.out.println("L = " + L); 348 I = new WordIdeal<BigRational>(fac, L, true, bb); 349 assertEquals("commonZeroTest( I )", I.commonZeroTest(), 0); 350 351 J = I.product(I); 352 //System.out.println("J = " + J); 353 assertEquals("commonZeroTest( J )", J.commonZeroTest(), 0); 354 355 L.remove(0); 356 I = new WordIdeal<BigRational>(fac, L, true, bb); 357 assertEquals("commonZeroTest( I )", I.commonZeroTest(), 1); 358 } 359 360 361 /** 362 * Test WordIdeal contraction. 363 */ 364 public void testContraction() { 365 BigRational coeff = new BigRational(17, 1); 366 String[] vs = new String[] { "beta", "x", "y", "z" }; 367 GenWordPolynomialRing<BigRational> fac2 = new GenWordPolynomialRing<BigRational>(coeff, vs); 368 369 WordIdeal<BigRational> I, J, K; 370 L = new ArrayList<GenWordPolynomial<BigRational>>(); 371 a = fac2.getZERO(); 372 L.add(a); 373 //b = fac2.getONE(); 374 //L.add(b); 375 376 b = fac2.random(3).monic(); 377 b = fac2.valueOf(b); 378 L.add(b); 379 380 c = fac.random(4).monic(); 381 c = fac2.valueOf(c); 382 L.add(c); 383 384 I = new WordIdeal<BigRational>(fac2, L, false, bb); 385 //System.out.println("I = " + I); 386 I.doGB(); 387 //System.out.println("I = " + I); 388 389 // now intersect with word polynomial ring 390 //System.out.println("fac = " + fac.toScript()); 391 J = I.intersect(fac); 392 //System.out.println("J = " + J); 393 394 List<GenWordPolynomial<BigRational>> ex = new ArrayList<GenWordPolynomial<BigRational>>(); 395 for (GenWordPolynomial<BigRational> p : J.getList()) { 396 GenWordPolynomial<BigRational> pe = fac2.valueOf(p); 397 ex.add(pe); 398 } 399 K = new WordIdeal<BigRational>(fac2, ex, false, bb); 400 //System.out.println("K = " + K); 401 402 assertTrue("intersect ", I.contains(K)); 403 } 404 405 406 /** 407 * Test WordIdeal intersection. 408 */ 409 public void testIntersection() { 410 WordIdeal<BigRational> I, J, K; 411 412 // first ideal 413 L = new ArrayList<GenWordPolynomial<BigRational>>(); 414 b = fac.random(3).monic(); 415 L.add(b); 416 c = fac.random(4).monic(); 417 L.add(c); 418 419 I = new WordIdeal<BigRational>(fac, L, false, bb); 420 //System.out.println("I = " + I); 421 422 // second ideal 423 L.clear(); 424 a = fac.random(3).monic(); 425 L.add(a); 426 427 J = new WordIdeal<BigRational>(fac, L, false, bb); 428 //System.out.println("J = " + J); 429 430 // now intersect with word ideal 431 K = I.intersect(J); 432 //System.out.println("I cap J = K = " + K); 433 assertTrue("intersect ", I.contains(K)); 434 assertTrue("intersect ", J.contains(K)); 435 436 // now intersect with list of word ideals 437 List<WordIdeal<BigRational>> Bl = new ArrayList<WordIdeal<BigRational>>(); 438 Bl.add(J); 439 K = I.intersect(Bl); 440 //System.out.println("I cap J = K = " + K); 441 assertTrue("intersect ", I.contains(K)); 442 assertTrue("intersect ", J.contains(K)); 443 } 444 445}