001/* 002 * $Id$ 003 */ 004 005package edu.jas.poly; 006 007 008import java.util.HashSet; 009import java.util.List; 010import java.util.Set; 011 012import edu.jas.arith.BigRational; 013import edu.jas.arith.BigInteger; 014import edu.jas.poly.PolyUtil; 015 016import junit.framework.Test; 017import junit.framework.TestCase; 018import junit.framework.TestSuite; 019 020 021/** 022 * BigRational coefficients GenPolynomial tests with JUnit. 023 * @author Heinz Kredel 024 */ 025 026public class RatGenPolynomialTest extends TestCase { 027 028 029 /** 030 * main. 031 */ 032 public static void main(String[] args) { 033 junit.textui.TestRunner.run(suite()); 034 } 035 036 037 /** 038 * Constructs a <CODE>RatGenPolynomialTest</CODE> object. 039 * @param name String. 040 */ 041 public RatGenPolynomialTest(String name) { 042 super(name); 043 } 044 045 046 /** 047 */ 048 public static Test suite() { 049 TestSuite suite = new TestSuite(RatGenPolynomialTest.class); 050 return suite; 051 } 052 053 GenPolynomialRing<BigRational> fac; 054 055 056 GenPolynomial<BigRational> a, b, c, d, e; 057 058 059 int rl = 7; 060 061 062 int kl = 10; 063 064 065 int ll = 10; 066 067 068 int el = 5; 069 070 071 float q = 0.5f; 072 073 @Override 074 protected void setUp() { 075 a = b = c = d = e = null; 076 String[] vars = new String[] { "a", "b", "c", "d", "e", "f", "g" }; 077 fac = new GenPolynomialRing<BigRational>(new BigRational(1), vars); 078 } 079 080 081 @Override 082 protected void tearDown() { 083 a = b = c = d = e = null; 084 fac = null; 085 } 086 087 088 /** 089 * Test generate. 090 */ 091 public void testGenerate() { 092 assertEquals("rl == #vars: ", rl, fac.nvar); 093 String s = fac.toScript(); 094 //System.out.println("fac.toScript: " + s + ", " + s.length()); 095 assertTrue("#s == 50: " + s.length(), s.length() <= 50); 096 097 List<GenPolynomial<BigRational>> gens = fac.generators(); 098 assertFalse("#gens != () ", gens.isEmpty()); 099 //System.out.println("generators: " + gens); 100 101 // test equals 102 Set<GenPolynomial<BigRational>> set = new HashSet<GenPolynomial<BigRational>>(gens); 103 //System.out.println("gen set: " + set); 104 assertEquals("#gens == #set: ", gens.size(), set.size()); 105 106 // test for elements 0, 1 107 a = fac.getZERO(); 108 b = fac.getONE(); 109 assertFalse("0 not in #set: ", set.contains(a)); 110 assertTrue("1 in #set: ", set.contains(b)); 111 112 // specific tests 113 assertEquals("#gens == rl+1 ", rl + 1, gens.size()); 114 Set<Integer> iset = new HashSet<Integer>(set.size()); 115 for (GenPolynomial<BigRational> p : gens) { 116 //System.out.println("p = " + p.toScript() + ", # = " + p.hashCode() + ", red = " + p.reductum()); 117 assertTrue("red(p) == 0 ", p.reductum().isZERO()); 118 iset.add(p.hashCode()); 119 } 120 assertEquals("#gens == #iset: ", gens.size(), iset.size()); 121 } 122 123 124 /** 125 * Test constructor and toString. 126 */ 127 public void testConstruction() { 128 c = fac.getONE(); 129 assertTrue("length( c ) = 1", c.length() == 1); 130 assertTrue("isZERO( c )", !c.isZERO()); 131 assertTrue("isONE( c )", c.isONE()); 132 133 d = fac.getZERO(); 134 assertTrue("length( d ) = 0", d.length() == 0); 135 assertTrue("isZERO( d )", d.isZERO()); 136 assertTrue("isONE( d )", !d.isONE()); 137 } 138 139 140 /** 141 * Test random polynomial. 142 */ 143 public void testRandom() { 144 for (int i = 0; i < 7; i++) { 145 //a = fac.random(ll); 146 a = fac.random(kl * (i + 1), ll + 2 * i, el + i, q); 147 //System.out.println("a = " + a); 148 149 assertTrue("length( a" + i + " ) <> 0", a.length() >= 0); 150 assertTrue(" not isZERO( a" + i + " )", !a.isZERO()); 151 assertTrue(" not isONE( a" + i + " )", !a.isONE()); 152 } 153 } 154 155 156 /** 157 * Test addition. 158 */ 159 public void testAddition() { 160 a = fac.random(ll); 161 b = fac.random(ll); 162 163 c = a.sum(b); 164 d = c.subtract(b); 165 assertEquals("a+b-b = a", a, d); 166 167 c = fac.random(ll); 168 169 ExpVector u = ExpVector.random(rl, el, q); 170 BigRational x = BigRational.RNRAND(kl); 171 172 b = new GenPolynomial<BigRational>(fac, x, u); 173 c = a.sum(b); 174 d = a.sum(x, u); 175 assertEquals("a+p(x,u) = a+(x,u)", c, d); 176 177 c = a.subtract(b); 178 d = a.subtract(x, u); 179 assertEquals("a-p(x,u) = a-(x,u)", c, d); 180 181 a = new GenPolynomial<BigRational>(fac); 182 b = new GenPolynomial<BigRational>(fac, x, u); 183 c = b.sum(a); 184 d = a.sum(x, u); 185 assertEquals("a+p(x,u) = a+(x,u)", c, d); 186 187 c = a.subtract(b); 188 d = a.subtract(x, u); 189 assertEquals("a-p(x,u) = a-(x,u)", c, d); 190 } 191 192 193 /** 194 * Test object multiplication. 195 */ 196 public void testMultiplication() { 197 a = fac.random(ll); 198 assertTrue("not isZERO( a )", !a.isZERO()); 199 200 b = fac.random(ll); 201 assertTrue("not isZERO( b )", !b.isZERO()); 202 203 c = b.multiply(a); 204 d = a.multiply(b); 205 assertTrue("not isZERO( c )", !c.isZERO()); 206 assertTrue("not isZERO( d )", !d.isZERO()); 207 208 //System.out.println("a = " + a); 209 //System.out.println("b = " + b); 210 e = d.subtract(c); 211 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO()); 212 213 assertTrue("a*b = b*a", c.equals(d)); 214 assertEquals("a*b = b*a", c, d); 215 216 c = fac.random(ll); 217 //System.out.println("c = " + c); 218 d = a.multiply(b.multiply(c)); 219 e = (a.multiply(b)).multiply(c); 220 221 //System.out.println("d = " + d); 222 //System.out.println("e = " + e); 223 224 //System.out.println("d-e = " + d.subtract(c) ); 225 226 assertEquals("a(bc) = (ab)c", d, e); 227 assertTrue("a(bc) = (ab)c", d.equals(e)); 228 229 BigRational x = a.leadingBaseCoefficient().inverse(); 230 c = a.monic(); 231 d = a.multiply(x); 232 assertEquals("a.monic() = a(1/ldcf(a))", c, d); 233 234 BigRational y = b.leadingBaseCoefficient().inverse(); 235 c = b.monic(); 236 d = b.multiply(y); 237 assertEquals("b.monic() = b(1/ldcf(b))", c, d); 238 239 e = new GenPolynomial<BigRational>(fac, y); 240 d = b.multiply(e); 241 assertEquals("b.monic() = b(1/ldcf(b))", c, d); 242 243 d = e.multiply(b); 244 assertEquals("b.monic() = (1/ldcf(b) (0))*b", c, d); 245 } 246 247 248 /** 249 * Test BLAS level 1. 250 */ 251 public void testBLAS1() { 252 a = fac.random(kl, ll, el, q); 253 b = fac.random(kl, ll, el, q); 254 c = fac.random(kl, 3, el * el, q); 255 ExpVector ev = ExpVector.random(rl, el, q); 256 BigRational lc = BigRational.RNRAND(kl); 257 258 d = a.subtractMultiple(lc, b); 259 e = a.subtract(b.multiply(lc)); 260 assertEquals("a - (lc) b == a - ((lc) b)", d, e); 261 262 d = a.subtractMultiple(lc, ev, b); 263 e = a.subtract(b.multiply(lc, ev)); 264 assertEquals("a - (lc ev) b == a - ((lc ev) b)", d, e); 265 266 ExpVector fv = ExpVector.random(rl, el, q); 267 BigRational tc = BigRational.RNRAND(kl); 268 269 d = a.scaleSubtractMultiple(tc, lc, ev, b); 270 e = a.multiply(tc).subtract(b.multiply(lc, ev)); 271 assertEquals("(tc) a - (lc ev) b == ((tc) a - ((lc ev) b))", d, e); 272 273 d = a.scaleSubtractMultiple(tc, fv, lc, ev, b); 274 e = a.multiply(tc, fv).subtract(b.multiply(lc, ev)); 275 assertEquals("(tc fv) a - (lc ev) b == ((tc fv) a - ((lc ev) b))", d, e); 276 } 277 278 279 /** 280 * Test distributive law. 281 */ 282 public void testDistributive() { 283 a = fac.random(kl, ll, el, q); 284 b = fac.random(kl, ll, el, q); 285 c = fac.random(kl, ll, el, q); 286 287 d = a.multiply(b.sum(c)); 288 e = a.multiply(b).sum(a.multiply(c)); 289 290 assertEquals("a(b+c) == ab+ac", d, e); 291 } 292 293 294 /** 295 * Test object quotient and remainder. 296 */ 297 public void testQuotRem() { 298 fac = new GenPolynomialRing<BigRational>(new BigRational(1), 1); 299 300 a = fac.random(ll).monic(); 301 assertTrue("not isZERO( a )", !a.isZERO()); 302 303 b = fac.random(ll).monic(); 304 assertTrue("not isZERO( b )", !b.isZERO()); 305 306 GenPolynomial<BigRational> h = a; 307 GenPolynomial<BigRational> g = fac.random(ll).monic(); 308 assertTrue("not isZERO( g )", !g.isZERO()); 309 a = a.multiply(g); 310 b = b.multiply(g); 311 //System.out.println("a = " + a); 312 //System.out.println("b = " + b); 313 //System.out.println("g = " + g); 314 315 GenPolynomial<BigRational>[] qr; 316 qr = b.quotientRemainder(a); 317 c = qr[0]; 318 d = qr[1]; 319 //System.out.println("q = " + c); 320 //System.out.println("r = " + d); 321 e = c.multiply(a).sum(d); 322 assertEquals("b = q a + r", b, e); 323 324 qr = a.quotientRemainder(b); 325 c = qr[0]; 326 d = qr[1]; 327 //System.out.println("q = " + c); 328 //System.out.println("r = " + d); 329 e = c.multiply(b).sum(d); 330 assertEquals("a = q b + r", a, e); 331 332 333 // gcd tests ------------------------------- 334 c = a.gcd(b); 335 //System.out.println("gcd = " + c); 336 assertTrue("a mod gcd(a,b) = 0", a.remainder(c).isZERO()); 337 assertTrue("b mod gcd(a,b) = 0", b.remainder(c).isZERO()); 338 assertEquals("g = gcd(a,b)", c, g); 339 340 341 GenPolynomial<BigRational>[] gst; 342 gst = a.egcd(b); 343 //System.out.println("egcd = " + gst[0]); 344 //System.out.println(", s = " + gst[1] + ", t = " + gst[2]); 345 c = gst[0]; 346 d = gst[1]; 347 e = gst[2]; 348 assertEquals("g = gcd(a,b)", c, g); 349 350 GenPolynomial<BigRational> x; 351 x = a.multiply(d).sum(b.multiply(e)).monic(); 352 //System.out.println("x = " + x); 353 assertEquals("gcd(a,b) = a s + b t", c, x); 354 355 356 gst = a.hegcd(b); 357 //System.out.println("hegcd = " + gst[0]); 358 //System.out.println("s = " + gst[1]); 359 c = gst[0]; 360 d = gst[1]; 361 assertEquals("g = gcd(a,b)", c, g); 362 363 x = a.multiply(d).remainder(b).monic(); 364 //System.out.println("x = " + x); 365 assertEquals("gcd(a,b) = a s mod b", c, x); 366 367 //System.out.println("g = " + g); 368 //System.out.println("h = " + h); 369 c = h.modInverse(g); 370 //System.out.println("c = " + c); 371 x = c.multiply(h).remainder(g).monic(); 372 //System.out.println("x = " + x); 373 assertTrue("h invertible mod g", x.isONE()); 374 } 375 376 377 /** 378 * Test addition speed. 379 */ 380 public void testAdditionSpeed() { 381 int ll = 100; 382 long t = 1000; 383 boolean print = false; 384 int jit = 1; 385 for (int j = 1; j < 5; j++) { 386 for (int i = 1; i < 5; i++) { 387 a = fac.random(kl, i * ll, el, q); 388 b = fac.random(kl, ll, el, q); 389 for (int k = 0; k < jit; k++) { 390 long t1 = System.nanoTime(); 391 c = a.sum(b); 392 t1 = System.nanoTime() - t1; 393 assertTrue("c != 0", !c.isZERO()); 394 395 long t2 = System.nanoTime(); 396 d = b.sum(a); 397 t2 = System.nanoTime() - t2; 398 assertTrue("d != 0", !d.isZERO()); 399 if (print) { 400 System.out.print("#a = " + a.length() + ", #b = " + b.length()); 401 System.out.println(",\t t1 = " + (t1 / t) + ", t2 = " + (t2 / t)); 402 } 403 //assertTrue("t2 <= t1", ((t1/t) >= (t2/t)) ); 404 } 405 if (print) 406 System.out.println(); 407 assertEquals("c == d", c, d); 408 } 409 ll = 3 * ll; 410 } 411 } 412 413 414 /** 415 * Test absolute norm. 416 */ 417 public void testAbsNorm() { 418 BigRational r; 419 a = fac.getONE().negate(); 420 //System.out.println("a = " + a); 421 422 r = PolyUtil.<BigRational> absNorm(a); 423 //System.out.println("r = " + r); 424 assertTrue("isONE( absNorm(-1) )", r.isONE()); 425 426 a = fac.random(kl * 2, ll + 2, el, q); 427 //System.out.println("a = " + a); 428 429 r = PolyUtil.<BigRational> absNorm(a); 430 //System.out.println("r = " + r); 431 assertTrue(" not isZERO( absNorm(a) )", !r.isZERO() || a.isZERO()); 432 } 433 434 435 /** 436 * Test max norm. 437 */ 438 public void testMaxNorm() { 439 BigRational r, s; 440 a = fac.getZERO(); 441 //System.out.println("a = " + a); 442 443 r = a.maxNorm(); 444 //System.out.println("r = " + r); 445 assertTrue("isONE( maxNorm(0) )", r.isZERO()); 446 447 r = a.sumNorm(); 448 //System.out.println("r = " + r); 449 assertTrue("isONE( sumNorm(0) )", r.isZERO()); 450 451 a = fac.getONE().negate(); 452 //System.out.println("a = " + a); 453 454 r = a.maxNorm(); 455 //System.out.println("r = " + r); 456 assertTrue("isONE( maxNorm(-1) )", r.isONE()); 457 458 r = a.sumNorm(); 459 //System.out.println("r = " + r); 460 assertTrue("isONE( sumNorm(-1) )", r.isONE()); 461 462 a = fac.random(kl * 2, ll + 2, el, q); 463 //System.out.println("a = " + a); 464 465 r = a.maxNorm(); 466 //System.out.println("r = " + r); 467 assertTrue("not isZERO( maxNorm(a) )", !r.isZERO() || a.isZERO()); 468 469 //s = a.multiply(a).maxNorm(); 470 //System.out.println("s = " + s + ", r*r = " + r.multiply(r)); 471 //assertEquals("s*s == maxNorm(a*a) )", r.multiply(r), s ); 472 473 r = a.sumNorm(); 474 //System.out.println("r = " + r); 475 assertTrue("not isZERO( maxNorm(a) )", !r.isZERO() || a.isZERO()); 476 477 //s = a.multiply(a).sumNorm(); 478 //System.out.println("s = " + s + ", r*r = " + r.multiply(r)); 479 //assertEquals("s*s == sumNorm(a*a) )", r.multiply(r), s ); 480 } 481 482 483 /** 484 * Test monic and coefficient primitive part. 485 */ 486 public void testMonicCPP() { 487 BigInteger bfac = new BigInteger(1); 488 GenPolynomialRing<BigInteger> ifac = new GenPolynomialRing<BigInteger>(bfac, fac); 489 490 GenPolynomial<BigInteger> ai = ifac.random(kl * 2, ll + 2, el, q); 491 ai = ai.multiply(bfac.random(kl)); 492 //System.out.println("ai = " + ai); 493 GenPolynomial<BigInteger> bi = ai.coeffPrimitivePart(); 494 //System.out.println("bi = " + bi); 495 496 a = PolyUtil.<BigRational> fromIntegerCoefficients(fac, ai).monic(); 497 //System.out.println("a = " + a); 498 b = PolyUtil.<BigRational> fromIntegerCoefficients(fac, bi).monic(); 499 //System.out.println("b = " + b); 500 assertEquals("a == b: " + a + " != " + b, a, b); 501 } 502 503}