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