001 /* 002 * $Id: SquarefreeModLongTest.java 2934 2009-12-29 14:34:30Z kredel $ 003 */ 004 005 package edu.jas.ufd; 006 007 008 import java.util.SortedMap; 009 010 import junit.framework.Test; 011 import junit.framework.TestCase; 012 import junit.framework.TestSuite; 013 014 import edu.jas.arith.ModLong; 015 import edu.jas.arith.ModLongRing; 016 import edu.jas.kern.ComputerThreads; 017 import edu.jas.poly.ExpVector; 018 import edu.jas.poly.GenPolynomial; 019 import edu.jas.poly.GenPolynomialRing; 020 import edu.jas.poly.PolyUtil; 021 import edu.jas.poly.TermOrder; 022 import edu.jas.structure.Power; 023 024 025 /** 026 * Squarefree factorization tests with JUnit. 027 * @author Heinz Kredel. 028 */ 029 030 public class SquarefreeModLongTest extends TestCase { 031 032 033 /** 034 * main. 035 */ 036 public static void main(String[] args) { 037 //BasicConfigurator.configure(); 038 junit.textui.TestRunner.run(suite()); 039 ComputerThreads.terminate(); 040 } 041 042 043 /** 044 * Constructs a <CODE>SquarefreeModLongTest</CODE> object. 045 * @param name String. 046 */ 047 public SquarefreeModLongTest(String name) { 048 super(name); 049 } 050 051 052 /** 053 */ 054 public static Test suite() { 055 TestSuite suite = new TestSuite(SquarefreeModLongTest.class); 056 return suite; 057 } 058 059 060 TermOrder to = new TermOrder(TermOrder.INVLEX); 061 062 063 int rl = 3; 064 065 066 int kl = 3; 067 068 069 int ll = 4; 070 071 072 int el = 3; 073 074 075 float q = 0.25f; 076 077 078 String[] vars; 079 080 081 String[] cvars; 082 083 084 String[] c1vars; 085 086 087 String[] rvars; 088 089 090 ModLongRing fac; 091 092 093 GreatestCommonDivisorAbstract<ModLong> ufd; 094 095 096 SquarefreeFiniteFieldCharP<ModLong> sqf; 097 098 099 GenPolynomialRing<ModLong> dfac; 100 101 102 GenPolynomial<ModLong> a; 103 104 105 GenPolynomial<ModLong> b; 106 107 108 GenPolynomial<ModLong> c; 109 110 111 GenPolynomial<ModLong> d; 112 113 114 GenPolynomial<ModLong> e; 115 116 117 GenPolynomialRing<ModLong> cfac; 118 119 120 GenPolynomialRing<GenPolynomial<ModLong>> rfac; 121 122 123 GenPolynomial<GenPolynomial<ModLong>> ar; 124 125 126 GenPolynomial<GenPolynomial<ModLong>> br; 127 128 129 GenPolynomial<GenPolynomial<ModLong>> cr; 130 131 132 GenPolynomial<GenPolynomial<ModLong>> dr; 133 134 135 GenPolynomial<GenPolynomial<ModLong>> er; 136 137 138 @Override 139 protected void setUp() { 140 vars = ExpVector.STDVARS(rl); 141 cvars = ExpVector.STDVARS(rl - 1); 142 c1vars = new String[] { cvars[0] }; 143 rvars = new String[] { vars[rl - 1] }; 144 145 fac = new ModLongRing(11); 146 //ufd = new GreatestCommonDivisorSubres<ModLong>(); 147 //ufd = GCDFactory.<ModLong> getImplementation(fac); 148 ufd = GCDFactory.getProxy(fac); 149 sqf = new SquarefreeFiniteFieldCharP<ModLong>(fac); 150 151 SquarefreeAbstract<ModLong> sqff = SquarefreeFactory.getImplementation(fac); 152 //System.out.println("sqf = " + sqf); 153 //System.out.println("sqff = " + sqff); 154 assertEquals("sqf == sqff ", sqf.getClass(), sqff.getClass()); 155 156 a = b = c = d = e = null; 157 ar = br = cr = dr = er = null; 158 } 159 160 161 @Override 162 protected void tearDown() { 163 a = b = c = d = e = null; 164 ar = br = cr = dr = er = null; 165 //ComputerThreads.terminate(); 166 } 167 168 169 /** 170 * Test base squarefree. 171 * 172 */ 173 public void testBaseSquarefree() { 174 //System.out.println("\nbase:"); 175 176 dfac = new GenPolynomialRing<ModLong>(fac, 1, to, rvars); 177 178 a = dfac.random(kl, ll, el + 2, q); 179 b = dfac.random(kl, ll, el + 2, q); 180 c = dfac.random(kl, ll, el, q); 181 //System.out.println("a = " + a); 182 //System.out.println("b = " + b); 183 //System.out.println("c = " + c); 184 185 if (a.isZERO() || b.isZERO() || c.isZERO()) { 186 // skip for this turn 187 return; 188 } 189 190 // a a b b b c 191 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 192 c = a.multiply(b).multiply(c); 193 //System.out.println("c = " + c); 194 //System.out.println("d = " + d); 195 196 c = sqf.baseSquarefreePart(c); 197 d = sqf.baseSquarefreePart(d); 198 //System.out.println("c = " + c); 199 //System.out.println("d = " + d); 200 assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c)); 201 assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d)); 202 203 e = PolyUtil.<ModLong> basePseudoRemainder(d, c); 204 //System.out.println("e = " + e); 205 assertTrue("squarefree(abc) | squarefree(aabbbc) " + e, e.isZERO()); 206 } 207 208 209 /** 210 * Test base squarefree factors. 211 * 212 */ 213 public void testBaseSquarefreeFactors() { 214 215 dfac = new GenPolynomialRing<ModLong>(fac, 1, to, rvars); 216 217 a = dfac.random(kl, ll, el + 3, q); 218 b = dfac.random(kl, ll, el + 3, q); 219 c = dfac.random(kl, ll, el + 2, q); 220 //System.out.println("a = " + a); 221 //System.out.println("b = " + b); 222 //System.out.println("c = " + c); 223 224 if (a.isZERO() || b.isZERO() || c.isZERO()) { 225 // skip for this turn 226 return; 227 } 228 229 // a a b b b c 230 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 231 //System.out.println("d = " + d); 232 233 SortedMap<GenPolynomial<ModLong>, Long> sfactors; 234 sfactors = sqf.baseSquarefreeFactors(d); 235 //System.out.println("sfactors = " + sfactors); 236 assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors)); 237 } 238 239 240 /** 241 * Test recursive squarefree. 242 * 243 */ 244 public void testRecursiveSquarefree() { 245 //System.out.println("\nrecursive:"); 246 247 cfac = new GenPolynomialRing<ModLong>(fac, 2 - 1, to, c1vars); 248 rfac = new GenPolynomialRing<GenPolynomial<ModLong>>(cfac, 1, to, rvars); 249 250 ar = rfac.random(kl, ll, el, q); 251 br = rfac.random(kl, ll, el, q); 252 cr = rfac.random(kl, ll, el, q); 253 //System.out.println("ar = " + ar); 254 //System.out.println("br = " + br); 255 //System.out.println("cr = " + cr); 256 257 if (ar.isZERO() || br.isZERO() || cr.isZERO()) { 258 // skip for this turn 259 return; 260 } 261 262 dr = ar.multiply(ar).multiply(br).multiply(br); 263 cr = ar.multiply(br); 264 //System.out.println("cr = " + cr); 265 //System.out.println("dr = " + dr); 266 267 cr = sqf.recursiveUnivariateSquarefreePart(cr); 268 dr = sqf.recursiveUnivariateSquarefreePart(dr); 269 //System.out.println("cr = " + cr); 270 //System.out.println("dr = " + dr); 271 assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr)); 272 assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr)); 273 274 er = PolyUtil.<ModLong> recursivePseudoRemainder(dr, cr); 275 //System.out.println("er = " + er); 276 assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO()); 277 } 278 279 280 /** 281 * Test recursive squarefree factors. 282 * 283 */ 284 public void testRecursiveSquarefreeFactors() { 285 286 cfac = new GenPolynomialRing<ModLong>(fac, 2 - 1, to, c1vars); 287 rfac = new GenPolynomialRing<GenPolynomial<ModLong>>(cfac, 1, to, rvars); 288 289 ar = rfac.random(kl, 3, 2, q); 290 br = rfac.random(kl, 3, 2, q); 291 cr = rfac.random(kl, 3, 2, q); 292 //System.out.println("ar = " + ar); 293 //System.out.println("br = " + br); 294 //System.out.println("cr = " + cr); 295 296 if (ar.isZERO() || br.isZERO() || cr.isZERO()) { 297 // skip for this turn 298 return; 299 } 300 301 dr = ar.multiply(cr).multiply(br).multiply(br); 302 //System.out.println("dr = " + dr); 303 304 SortedMap<GenPolynomial<GenPolynomial<ModLong>>, Long> sfactors; 305 sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr); 306 //System.out.println("sfactors = " + sfactors); 307 assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors)); 308 } 309 310 311 /** 312 * Test squarefree. 313 * 314 */ 315 public void testSquarefree() { 316 //System.out.println("\nfull:"); 317 318 dfac = new GenPolynomialRing<ModLong>(fac, rl, to, vars); 319 320 a = dfac.random(kl, ll, 2, q); 321 b = dfac.random(kl, ll, 2, q); 322 c = dfac.random(kl, ll, 2, q); 323 //System.out.println("a = " + a); 324 //System.out.println("b = " + b); 325 //System.out.println("c = " + c); 326 327 if (a.isZERO() || b.isZERO() || c.isZERO()) { 328 // skip for this turn 329 return; 330 } 331 332 d = a.multiply(a).multiply(b).multiply(b).multiply(c); 333 c = a.multiply(b).multiply(c); 334 //System.out.println("c = " + c); 335 //System.out.println("d = " + d); 336 337 c = sqf.squarefreePart(c); 338 d = sqf.squarefreePart(d); 339 //System.out.println("c = " + c); 340 //System.out.println("d = " + d); 341 assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d)); 342 assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c)); 343 344 e = PolyUtil.<ModLong> basePseudoRemainder(d, c); 345 //System.out.println("e = " + e); 346 assertTrue("squarefree(abc) | squarefree(aabbc) " + e, e.isZERO()); 347 } 348 349 350 /** 351 * Test squarefree factors. 352 * 353 */ 354 public void testSquarefreeFactors() { 355 356 dfac = new GenPolynomialRing<ModLong>(fac, rl, to, vars); 357 358 a = dfac.random(kl, 3, 2, q); 359 b = dfac.random(kl, 3, 2, q); 360 c = dfac.random(kl, 3, 2, q); 361 //System.out.println("a = " + a); 362 //System.out.println("b = " + b); 363 //System.out.println("c = " + c); 364 365 if (a.isZERO() || b.isZERO() || c.isZERO()) { 366 // skip for this turn 367 return; 368 } 369 370 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 371 //System.out.println("d = " + d); 372 373 SortedMap<GenPolynomial<ModLong>, Long> sfactors; 374 sfactors = sqf.squarefreeFactors(d); 375 //System.out.println("sfactors = " + sfactors); 376 assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors)); 377 } 378 379 380 /* ------------char-th root ------------------------- */ 381 382 /** 383 * Test base squarefree with char-th root. 384 * 385 */ 386 public void testBaseSquarefreeCharRoot() { 387 //System.out.println("\nbase CharRoot:"); 388 389 long p = fac.characteristic().longValue(); 390 391 dfac = new GenPolynomialRing<ModLong>(fac, 1, to, rvars); 392 393 a = dfac.random(kl, ll + 2, el + 2, q); 394 b = dfac.random(kl, ll + 2, el + 2, q); 395 c = dfac.random(kl, ll, el, q); 396 397 if (a.isZERO() || b.isZERO() || c.isZERO() || a.isConstant() || b.isConstant()) { 398 // skip for this turn 399 return; 400 } 401 //System.out.println("a = " + a); 402 //System.out.println("b = " + b); 403 //System.out.println("c = " + c); 404 405 // a a b^p c 406 d = a.multiply(a).multiply(Power.<GenPolynomial<ModLong>> positivePower(b, p)).multiply(c); 407 c = a.multiply(b).multiply(c); 408 //System.out.println("c = " + c); 409 //System.out.println("d = " + d); 410 411 c = sqf.baseSquarefreePart(c); 412 d = sqf.baseSquarefreePart(d); 413 //System.out.println("c = " + c); 414 //System.out.println("d = " + d); 415 assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c)); 416 assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d)); 417 418 e = PolyUtil.<ModLong> basePseudoRemainder(d, c); 419 //System.out.println("e = " + e); 420 assertTrue("squarefree(abc) | squarefree(aab^pc) " + e, e.isZERO()); 421 } 422 423 424 /** 425 * Test base squarefree factors with char-th root. 426 * 427 */ 428 public void testBaseSquarefreeFactorsCharRoot() { 429 430 long p = fac.characteristic().longValue(); 431 432 dfac = new GenPolynomialRing<ModLong>(fac, 1, to, rvars); 433 434 a = dfac.random(kl, ll + 2, el + 3, q); 435 b = dfac.random(kl, ll + 2, el + 3, q); 436 c = dfac.random(kl, ll, el + 2, q); 437 438 if (a.isZERO() || b.isZERO() || c.isZERO() || a.isConstant() || b.isConstant()) { 439 // skip for this turn 440 return; 441 } 442 //System.out.println("a = " + a); 443 //System.out.println("b = " + b); 444 //System.out.println("c = " + c); 445 446 // a a b^p c 447 d = a.multiply(a).multiply(Power.<GenPolynomial<ModLong>> positivePower(b, p)).multiply(c); 448 //System.out.println("d = " + d); 449 450 SortedMap<GenPolynomial<ModLong>, Long> sfactors; 451 sfactors = sqf.baseSquarefreeFactors(d); 452 //System.out.println("sfactors = " + sfactors); 453 assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors)); 454 } 455 456 457 /** 458 * Test recursive squarefree with char-th root. 459 * 460 */ 461 public void testRecursiveSquarefreeCharRoot() { 462 //System.out.println("\nrecursive CharRoot:"); 463 464 long p = fac.characteristic().longValue(); 465 466 cfac = new GenPolynomialRing<ModLong>(fac, 2 - 1, to, c1vars); 467 rfac = new GenPolynomialRing<GenPolynomial<ModLong>>(cfac, 1, to, rvars); 468 469 ar = rfac.random(kl, ll, el + 1, q).monic(); 470 br = rfac.random(kl, ll, el + 1, q).monic(); 471 cr = rfac.random(kl, ll, el, q).monic(); 472 473 if (ar.isZERO() || br.isZERO() || cr.isZERO()) { 474 // skip for this turn 475 return; 476 } 477 //System.out.println("ar = " + ar); 478 //System.out.println("br = " + br); 479 //System.out.println("cr = " + cr); 480 481 // a a b^p 482 dr = ar.multiply(ar).multiply(Power.<GenPolynomial<GenPolynomial<ModLong>>> positivePower(br, p)); 483 cr = ar.multiply(ar).multiply(br); 484 //System.out.println("cr = " + cr); 485 //System.out.println("dr = " + dr); 486 487 cr = sqf.recursiveUnivariateSquarefreePart(cr); 488 dr = sqf.recursiveUnivariateSquarefreePart(dr); 489 //System.out.println("cr = " + cr); 490 //System.out.println("dr = " + dr); 491 assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr)); 492 assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr)); 493 494 er = PolyUtil.<ModLong> recursivePseudoRemainder(dr, cr); 495 //System.out.println("er = " + er); 496 assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO()); 497 } 498 499 500 /** 501 * Test recursive squarefree factors with char-th root. 502 * 503 */ 504 public void testRecursiveSquarefreeFactorsCharRoot() { 505 506 long p = fac.characteristic().longValue(); 507 508 cfac = new GenPolynomialRing<ModLong>(fac, 2 - 1, to, c1vars); 509 rfac = new GenPolynomialRing<GenPolynomial<ModLong>>(cfac, 1, to, rvars); 510 511 ar = rfac.random(kl, 3, 2 + 1, q).monic(); 512 br = rfac.random(kl, 3, 2 + 1, q).monic(); 513 cr = rfac.random(kl, 3, 2, q).monic(); 514 515 if (ar.isZERO() || br.isZERO() || cr.isZERO()) { 516 // skip for this turn 517 return; 518 } 519 //System.out.println("ar = " + ar); 520 //System.out.println("br = " + br); 521 //System.out.println("cr = " + cr); 522 523 // a a b^p c 524 dr = ar.multiply(ar).multiply(Power.<GenPolynomial<GenPolynomial<ModLong>>> positivePower(br, p)) 525 .multiply(cr); 526 //System.out.println("dr = " + dr); 527 528 SortedMap<GenPolynomial<GenPolynomial<ModLong>>, Long> sfactors; 529 sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr); 530 //System.out.println("sfactors = " + sfactors); 531 assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors)); 532 } 533 534 535 /** 536 * Test squarefree with char-th root. 537 * 538 */ 539 public void testSquarefreeCharRoot() { 540 //System.out.println("\nfull CharRoot:"); 541 542 long p = fac.characteristic().longValue(); 543 544 dfac = new GenPolynomialRing<ModLong>(fac, rl, to, vars); 545 546 a = dfac.random(kl, ll, 3, q).monic(); 547 b = dfac.random(kl, ll, 3, q).monic(); 548 c = dfac.random(kl, ll, 3, q).monic(); 549 550 if (a.isZERO() || b.isZERO() || c.isZERO()) { 551 // skip for this turn 552 return; 553 } 554 //System.out.println("a = " + a); 555 //System.out.println("b = " + b); 556 //System.out.println("c = " + c); 557 558 // a a b^p c 559 d = a.multiply(a).multiply(Power.<GenPolynomial<ModLong>> positivePower(b, p)).multiply(c); 560 c = a.multiply(b).multiply(c); 561 //System.out.println("c = " + c); 562 //System.out.println("d = " + d); 563 564 c = sqf.squarefreePart(c); 565 d = sqf.squarefreePart(d); 566 //System.out.println("c = " + c); 567 //System.out.println("d = " + d); 568 assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d)); 569 assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c)); 570 571 e = PolyUtil.<ModLong> basePseudoRemainder(d, c); 572 //System.out.println("e = " + e); 573 assertTrue("squarefree(abc) | squarefree(aab^pc) " + e, e.isZERO()); 574 } 575 576 577 /** 578 * Test squarefree factors with char-th root. 579 * 580 */ 581 public void testSquarefreeFactorsCharRoot() { 582 583 long p = fac.characteristic().longValue(); 584 585 dfac = new GenPolynomialRing<ModLong>(fac, rl, to, vars); 586 587 a = dfac.random(kl, ll, 3, q).monic(); 588 b = dfac.random(kl, ll, 3, q).monic(); 589 c = dfac.random(kl, ll, 3, q).monic(); 590 591 if (a.isZERO() || b.isZERO() || c.isZERO()) { 592 // skip for this turn 593 return; 594 } 595 //System.out.println("a = " + a); 596 //System.out.println("b = " + b); 597 //System.out.println("c = " + c); 598 599 // a a b^p c 600 d = a.multiply(a).multiply(Power.<GenPolynomial<ModLong>> positivePower(b, p)).multiply(c); 601 //System.out.println("d = " + d); 602 603 SortedMap<GenPolynomial<ModLong>, Long> sfactors; 604 sfactors = sqf.squarefreeFactors(d); 605 //System.out.println("sfactors = " + sfactors); 606 assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors)); 607 } 608 609 }