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