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