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