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