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