001/* 002 * $Id$ 003 */ 004 005package edu.jas.ufd; 006 007 008import java.util.ArrayList; 009import java.util.List; 010 011import edu.jas.arith.ModInteger; 012import edu.jas.arith.ModIntegerRing; 013import edu.jas.arith.PrimeList; 014import edu.jas.poly.ExpVector; 015import edu.jas.poly.GenPolynomial; 016import edu.jas.poly.GenPolynomialRing; 017import edu.jas.poly.PolyUtil; 018import edu.jas.poly.TermOrder; 019 020import junit.framework.Test; 021import junit.framework.TestCase; 022import junit.framework.TestSuite; 023 024 025/** 026 * GCD Modular Evaluation algorithm tests with JUnit. 027 * @author Heinz Kredel 028 */ 029 030public class GCDModEvalTest extends TestCase { 031 032 033 /** 034 * main. 035 */ 036 public static void main(String[] args) { 037 junit.textui.TestRunner.run(suite()); 038 } 039 040 041 /** 042 * Constructs a <CODE>GCDModEvalTest</CODE> object. 043 * @param name String. 044 */ 045 public GCDModEvalTest(String name) { 046 super(name); 047 } 048 049 050 /** 051 */ 052 public static Test suite() { 053 TestSuite suite = new TestSuite(GCDModEvalTest.class); 054 return suite; 055 } 056 057 058 GreatestCommonDivisorAbstract<ModInteger> ufd; 059 060 061 TermOrder to = new TermOrder(TermOrder.INVLEX); 062 063 064 GenPolynomialRing<ModInteger> dfac; 065 066 067 GenPolynomialRing<ModInteger> cfac; 068 069 070 GenPolynomialRing<GenPolynomial<ModInteger>> rfac; 071 072 073 PrimeList primes = new PrimeList(); 074 075 076 ModIntegerRing mi; 077 078 079 ModInteger ai, bi, ci, di, ei; 080 081 082 GenPolynomial<ModInteger> a, b, c, d, e; 083 084 085 GenPolynomial<GenPolynomial<ModInteger>> ar, br, cr, dr, er; 086 087 088 int rl = 3; 089 090 091 int kl = 4; 092 093 094 int ll = 5; 095 096 097 int el = 3; 098 099 100 float q = 0.3f; 101 102 103 @Override 104 protected void setUp() { 105 a = b = c = d = e = null; 106 //ai = bi = ci = di = ei = null; 107 ar = br = cr = dr = er = null; 108 //mi = new ModIntegerRing(primes.get(0),true); 109 mi = new ModIntegerRing(19, true); 110 //mi = new ModIntegerRing(19*17,true); // failing tests 111 //mi = new ModIntegerRing(primes.get(0).multiply(primes.get(1)),false); // failing tests 112 //ufd = new GreatestCommonDivisorPrimitive<ModInteger>(); 113 ufd = new GreatestCommonDivisorModEval<ModInteger>(); 114 String[] vars = ExpVector.STDVARS(rl); 115 String[] cvars = ExpVector.STDVARS(rl - 1); 116 String[] rvars = new String[] { vars[rl - 1] }; 117 dfac = new GenPolynomialRing<ModInteger>(mi, rl, to, vars); 118 cfac = new GenPolynomialRing<ModInteger>(mi, rl - 1, to, cvars); 119 rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to, rvars); 120 //System.out.println("mi = " + mi); 121 } 122 123 124 @Override 125 protected void tearDown() { 126 a = b = c = d = e = null; 127 //ai = bi = ci = di = ei = null; 128 ar = br = cr = dr = er = null; 129 mi = null; 130 ufd = null; 131 dfac = null; 132 cfac = null; 133 rfac = null; 134 } 135 136 137 /** 138 * Test modular evaluation gcd. 139 */ 140 public void testModEvalGcd() { 141 //GreatestCommonDivisorAbstract<ModInteger> ufd_me 142 // = new GreatestCommonDivisorModEval(); 143 144 for (int i = 0; i < 1; i++) { 145 a = dfac.random(kl * (i + 2), ll + 2 * i, el + 0 * i, q); 146 b = dfac.random(kl * (i + 2), ll + 2 * i, el + 0 * i, q); 147 c = dfac.random(kl * (i + 2), ll + 2 * i, el + 0 * i, q); 148 c = c.multiply(dfac.univariate(0)); 149 //a = ufd.basePrimitivePart(a); 150 //b = ufd.basePrimitivePart(b); 151 152 if (a.isZERO() || b.isZERO() || c.isZERO()) { 153 // skip for this turn 154 continue; 155 } 156 assertTrue("length( c" + i + " ) <> 0", c.length() > 0); 157 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 158 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 159 160 a = a.multiply(c); 161 b = b.multiply(c); 162 //System.out.println("a = " + a); 163 //System.out.println("b = " + b); 164 165 d = ufd.gcd(a, b); 166 167 c = ufd.basePrimitivePart(c).abs(); 168 e = PolyUtil.<ModInteger> baseSparsePseudoRemainder(d, c); 169 //System.out.println("c = " + c); 170 //System.out.println("d = " + d); 171 assertTrue("c | gcd(ac,bc) " + e, e.isZERO()); 172 173 e = PolyUtil.<ModInteger> baseSparsePseudoRemainder(a, d); 174 //System.out.println("e = " + e); 175 assertTrue("gcd(a,b) | a" + e, e.isZERO()); 176 177 e = PolyUtil.<ModInteger> baseSparsePseudoRemainder(b, d); 178 //System.out.println("e = " + e); 179 assertTrue("gcd(a,b) | b" + e, e.isZERO()); 180 } 181 } 182 183 184 /** 185 * Test base quotioent and remainder. 186 */ 187 public void testBaseQR() { 188 dfac = new GenPolynomialRing<ModInteger>(mi, 1, to); 189 190 for (int i = 0; i < 5; i++) { 191 a = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 192 c = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 193 //a = ufd.basePrimitivePart(a).abs(); 194 //c = ufd.basePrimitivePart(c); 195 do { 196 ci = mi.random(kl * (i + 2)); 197 ci = ci.sum(mi.getONE()); 198 } while (ci.isZERO()); 199 200 //System.out.println("a = " + a); 201 //System.out.println("c = " + c); 202 //System.out.println("ci = " + ci); 203 204 if (a.isZERO() || c.isZERO()) { 205 // skip for this turn 206 continue; 207 } 208 assertTrue("length( c" + i + " ) <> 0", c.length() > 0); 209 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 210 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 211 212 b = a.multiply(c); 213 //System.out.println("b = " + b); 214 d = PolyUtil.<ModInteger> baseSparsePseudoRemainder(b, c); 215 //System.out.println("d = " + d); 216 217 assertTrue("rem(ac,c) == 0", d.isZERO()); 218 219 b = a.multiply(ci); 220 //System.out.println("b = " + b); 221 d = b.divide(ci); 222 //System.out.println("d = " + d); 223 224 assertEquals("a == ac/c", a, d); 225 226 b = a.multiply(c); 227 //System.out.println("b = " + b); 228 d = PolyUtil.<ModInteger> basePseudoDivide(b, c); 229 //System.out.println("d = " + d); 230 231 assertEquals("a == ac/c", a, d); 232 } 233 } 234 235 236 /** 237 * Test base content and primitive part. 238 */ 239 public void testBaseContentPP() { 240 for (int i = 0; i < 13; i++) { 241 c = dfac.random(kl * (i + 2), ll + 2 * i, el + i, q); 242 c = c.multiply(mi.random(kl * (i + 2))); 243 244 if (c.isZERO()) { 245 // skip for this turn 246 continue; 247 } 248 assertTrue("length( c" + i + " ) <> 0", c.length() > 0); 249 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 250 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 251 252 ci = ufd.baseContent(c); 253 d = ufd.basePrimitivePart(c); 254 //System.out.println("c = " + c); 255 //System.out.println("ci = " + ci); 256 //System.out.println("d = " + d); 257 258 a = d.multiply(ci); 259 assertEquals("c == cont(c)pp(c)", c, a); 260 } 261 } 262 263 264 /** 265 * Test base gcd. 266 */ 267 public void testBaseGcd() { 268 dfac = new GenPolynomialRing<ModInteger>(mi, 1, to); 269 270 for (int i = 0; i < 5; i++) { 271 a = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 272 b = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 273 c = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 274 //a = ufd.basePrimitivePart(a); 275 //b = ufd.basePrimitivePart(b); 276 //c = ufd.basePrimitivePart(c).abs(); 277 278 //System.out.println("a = " + a); 279 //System.out.println("b = " + b); 280 //System.out.println("c = " + c); 281 282 if (a.isZERO() || b.isZERO() || c.isZERO()) { 283 // skip for this turn 284 continue; 285 } 286 assertTrue("length( c" + i + " ) <> 0", c.length() > 0); 287 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 288 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 289 290 a = a.multiply(c); 291 b = b.multiply(c); 292 293 d = ufd.baseGcd(a, b); 294 e = PolyUtil.<ModInteger> baseSparsePseudoRemainder(d, c); 295 //System.out.println("d = " + d); 296 297 assertTrue("c | gcd(ac,bc) " + e, e.isZERO()); 298 } 299 } 300 301 302 /** 303 * Test recursive quotioent and remainder. 304 */ 305 public void testRecursiveQR() { 306 dfac = new GenPolynomialRing<ModInteger>(mi, 2, to); 307 cfac = new GenPolynomialRing<ModInteger>(mi, 2 - 1, to); 308 rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to); 309 310 for (int i = 0; i < 5; i++) { 311 a = dfac.random(kl * (i + 1), ll + i, el + i, q); 312 a = ufd.basePrimitivePart(a).abs(); 313 314 c = dfac.random(kl * (i + 1), ll + i, el + i, q); 315 c = ufd.basePrimitivePart(a).abs(); 316 cr = PolyUtil.<ModInteger> recursive(rfac, c); 317 318 c = cfac.random(kl * (i + 1), ll + 2 * i, el + 2 * i, q); 319 c = ufd.basePrimitivePart(c).abs(); 320 321 ar = PolyUtil.<ModInteger> recursive(rfac, a); 322 //System.out.println("ar = " + ar); 323 //System.out.println("a = " + a); 324 //System.out.println("c = " + c); 325 //System.out.println("cr = " + cr); 326 327 if (cr.isZERO() || c.isZERO()) { 328 // skip for this turn 329 continue; 330 } 331 assertTrue("length( cr" + i + " ) <> 0", cr.length() > 0); 332 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 333 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 334 335 br = ar.multiply(cr); 336 //System.out.println("br = " + br); 337 dr = PolyUtil.<ModInteger> recursiveSparsePseudoRemainder(br, cr); 338 //System.out.println("dr = " + dr); 339 d = PolyUtil.<ModInteger> distribute(dfac, dr); 340 //System.out.println("d = " + d); 341 342 assertTrue("rem(ac,c) == 0", d.isZERO()); 343 344 br = ar.multiply(c); 345 //System.out.println("br = " + br); 346 dr = PolyUtil.<ModInteger> recursiveDivide(br, c); 347 //System.out.println("dr = " + dr); 348 d = PolyUtil.<ModInteger> distribute(dfac, dr); 349 //System.out.println("d = " + d); 350 351 assertEquals("a == ac/c", a, d); 352 } 353 } 354 355 356 /** 357 * Test recursive content and primitive part. 358 */ 359 public void testRecursiveContentPP() { 360 dfac = new GenPolynomialRing<ModInteger>(mi, 2, to); 361 cfac = new GenPolynomialRing<ModInteger>(mi, 2 - 1, to); 362 rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to); 363 364 for (int i = 0; i < 3; i++) { 365 cr = rfac.random(kl * (i + 2), ll + 2 * i, el + i, q); 366 //System.out.println("cr = " + cr); 367 368 assertTrue("length( cr" + i + " ) <> 0", cr.length() > 0); 369 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 370 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 371 372 c = ufd.recursiveContent(cr); 373 dr = ufd.recursivePrimitivePart(cr); 374 //System.out.println("c = " + c); 375 //System.out.println("dr = " + dr); 376 377 ar = dr.multiply(c); 378 assertEquals("c == cont(c)pp(c)", cr, ar); 379 } 380 } 381 382 383 /** 384 * Test recursive gcd. 385 */ 386 public void testRecursiveGCD() { 387 dfac = new GenPolynomialRing<ModInteger>(mi, 2, to); 388 cfac = new GenPolynomialRing<ModInteger>(mi, 2 - 1, to); 389 rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to); 390 391 for (int i = 0; i < 2; i++) { 392 ar = rfac.random(kl, ll, el + i, q); 393 br = rfac.random(kl, ll, el, q); 394 cr = rfac.random(kl, ll, el, q); 395 //System.out.println("ar = " + ar); 396 //System.out.println("br = " + br); 397 //System.out.println("cr = " + cr); 398 399 if (ar.isZERO() || br.isZERO() || cr.isZERO()) { 400 // skip for this turn 401 continue; 402 } 403 assertTrue("length( cr" + i + " ) <> 0", cr.length() > 0); 404 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 405 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 406 407 ar = ar.multiply(cr); 408 br = br.multiply(cr); 409 //System.out.println("ar = " + ar); 410 //System.out.println("br = " + br); 411 412 dr = ufd.recursiveUnivariateGcd(ar, br); 413 //System.out.println("dr = " + dr); 414 415 er = PolyUtil.<ModInteger> recursiveSparsePseudoRemainder(dr, cr); 416 //System.out.println("er = " + er); 417 418 assertTrue("c | gcd(ac,bc) " + er, er.isZERO()); 419 } 420 } 421 422 423 /** 424 * Test arbitrary recursive gcd. 425 */ 426 public void testArbitraryRecursiveGCD() { 427 dfac = new GenPolynomialRing<ModInteger>(mi, 2, to); 428 cfac = new GenPolynomialRing<ModInteger>(mi, 2 - 1, to); 429 rfac = new GenPolynomialRing<GenPolynomial<ModInteger>>(cfac, 1, to); 430 431 for (int i = 0; i < 2; i++) { 432 ar = rfac.random(kl, ll, el + i, q); 433 br = rfac.random(kl, ll, el, q); 434 cr = rfac.random(kl, ll, el, q); 435 //System.out.println("ar = " + ar); 436 //System.out.println("br = " + br); 437 //System.out.println("cr = " + cr); 438 439 if (ar.isZERO() || br.isZERO() || cr.isZERO()) { 440 // skip for this turn 441 continue; 442 } 443 assertTrue("length( cr" + i + " ) <> 0", cr.length() > 0); 444 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 445 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 446 447 ar = ar.multiply(cr); 448 br = br.multiply(cr); 449 //System.out.println("ar = " + ar); 450 //System.out.println("br = " + br); 451 452 dr = ufd.recursiveGcd(ar, br); 453 //System.out.println("dr = " + dr); 454 455 er = PolyUtil.<ModInteger> recursiveSparsePseudoRemainder(dr, cr); 456 //System.out.println("er = " + er); 457 458 assertTrue("c | gcd(ac,bc), gcd, c " + er + ", " + dr + ", " + cr, er.isZERO()); 459 } 460 } 461 462 463 /** 464 * Test content and primitive part. 465 */ 466 public void testContentPP() { 467 dfac = new GenPolynomialRing<ModInteger>(mi, 3, to); 468 469 for (int i = 0; i < 3; i++) { 470 c = dfac.random(kl * (i + 2), ll + 2 * i, el + i, q); 471 //System.out.println("cr = " + cr); 472 if (c.isZERO()) { 473 continue; 474 } 475 476 assertTrue("length( c" + i + " ) <> 0", c.length() > 0); 477 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 478 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 479 480 a = ufd.content(c); 481 e = a.extend(dfac, 0, 0L); 482 b = ufd.primitivePart(c); 483 //System.out.println("c = " + c); 484 //System.out.println("a = " + a); 485 //System.out.println("e = " + e); 486 //System.out.println("b = " + b); 487 488 d = e.multiply(b); 489 assertEquals("c == cont(c)pp(c)", d, c); 490 } 491 } 492 493 494 /** 495 * Test gcd 3 variables. 496 */ 497 public void testGCD3() { 498 dfac = new GenPolynomialRing<ModInteger>(mi, 3, to); 499 500 for (int i = 0; i < 4; i++) { 501 a = dfac.random(kl, ll, el + i, q); 502 b = dfac.random(kl, ll, el, q); 503 c = dfac.random(kl, ll, el, q); 504 //System.out.println("a = " + a); 505 //System.out.println("b = " + b); 506 //System.out.println("c = " + c); 507 508 if (a.isZERO() || b.isZERO() || c.isZERO()) { 509 // skip for this turn 510 continue; 511 } 512 assertTrue("length( c" + i + " ) <> 0", c.length() > 0); 513 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 514 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 515 516 a = a.multiply(c); 517 b = b.multiply(c); 518 //System.out.println("a = " + a); 519 //System.out.println("b = " + b); 520 521 d = ufd.gcd(a, b); 522 //System.out.println("d = " + d); 523 524 e = PolyUtil.<ModInteger> baseSparsePseudoRemainder(d, c); 525 //System.out.println("e = " + e); 526 527 assertTrue("c | gcd(ac,bc), gcd, c " + e + ", " + d + ", " + c, e.isZERO()); 528 } 529 } 530 531 532 /** 533 * Test gcd. 534 */ 535 public void testGCD() { 536 // dfac = new GenPolynomialRing<ModInteger>(mi,3,to); 537 538 for (int i = 0; i < 1; i++) { 539 a = dfac.random(kl, ll, el, q); 540 b = dfac.random(kl, ll, el, q); 541 c = dfac.random(kl, ll, el, q); 542 //System.out.println("a = " + a); 543 //System.out.println("b = " + b); 544 //System.out.println("c = " + c); 545 546 if (a.isZERO() || b.isZERO() || c.isZERO()) { 547 // skip for this turn 548 continue; 549 } 550 assertTrue("length( c" + i + " ) <> 0", c.length() > 0); 551 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 552 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 553 554 a = a.multiply(c); 555 b = b.multiply(c); 556 //System.out.println("a = " + a); 557 //System.out.println("b = " + b); 558 559 d = ufd.gcd(a, b); 560 //System.out.println("d = " + d); 561 562 e = PolyUtil.<ModInteger> baseSparsePseudoRemainder(d, c); 563 //System.out.println("e = " + e); 564 assertTrue("c | gcd(ac,bc) " + e, e.isZERO()); 565 566 e = PolyUtil.<ModInteger> baseSparsePseudoRemainder(a, d); 567 //System.out.println("e = " + e); 568 assertTrue("gcd(a,b) | a " + e, e.isZERO()); 569 570 e = PolyUtil.<ModInteger> baseSparsePseudoRemainder(b, d); 571 //System.out.println("e = " + e); 572 assertTrue("gcd(a,b) | b " + e, e.isZERO()); 573 } 574 } 575 576 577 /** 578 * Test lcm. 579 */ 580 public void testLCM() { 581 dfac = new GenPolynomialRing<ModInteger>(mi, 3, to); 582 583 for (int i = 0; i < 1; i++) { 584 a = dfac.random(kl, ll, el, q); 585 b = dfac.random(kl, ll, el, q); 586 c = dfac.random(kl, 3, 2, q); 587 //System.out.println("a = " + a); 588 //System.out.println("b = " + b); 589 //System.out.println("c = " + c); 590 591 if (a.isZERO() || b.isZERO() || c.isZERO()) { 592 // skip for this turn 593 continue; 594 } 595 assertTrue("length( a" + i + " ) <> 0", a.length() > 0); 596 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 597 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 598 599 a = a.multiply(c); 600 b = b.multiply(c); 601 602 c = ufd.gcd(a, b); 603 //System.out.println("c = " + c); 604 605 d = ufd.lcm(a, b); 606 //System.out.println("d = " + d); 607 608 e = c.multiply(d); 609 //System.out.println("e = " + e); 610 c = a.multiply(b); 611 //System.out.println("c = " + c); 612 613 assertEquals("ab == gcd(a,b)lcm(ab)", c, e); 614 } 615 } 616 617 618 /** 619 * Test co-prime factors. 620 */ 621 public void testCoPrime() { 622 dfac = new GenPolynomialRing<ModInteger>(mi, 3, to); 623 624 a = dfac.random(kl, 3, 2, q); 625 b = dfac.random(kl, 3, 2, q); 626 c = dfac.random(kl, 3, 2, q); 627 //System.out.println("a = " + a); 628 //System.out.println("b = " + b); 629 //System.out.println("c = " + c); 630 631 if (a.isZERO() || b.isZERO() || c.isZERO()) { 632 // skip for this turn 633 return; 634 } 635 assertTrue("length( a ) <> 0", a.length() > 0); 636 637 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 638 e = a.multiply(b).multiply(c); 639 //System.out.println("d = " + d); 640 //System.out.println("c = " + c); 641 642 List<GenPolynomial<ModInteger>> F = new ArrayList<GenPolynomial<ModInteger>>(5); 643 F.add(d); 644 F.add(a); 645 F.add(b); 646 F.add(c); 647 F.add(e); 648 //System.out.println("F = " + F); 649 List<GenPolynomial<ModInteger>> P = ufd.coPrime(F); 650 //System.out.println("P = " + P); 651 652 assertTrue("is co-prime ", ufd.isCoPrime(P)); 653 assertTrue("is co-prime of ", ufd.isCoPrime(P, F)); 654 655 //P = ufd.coPrimeSquarefree(F); 656 //System.out.println("F = " + F); 657 //System.out.println("P = " + P); 658 //assertTrue("is co-prime ", ufd.isCoPrime(P) ); 659 //assertTrue("is co-prime of ", ufd.isCoPrime(P,F) ); 660 661 P = ufd.coPrimeRec(F); 662 //System.out.println("F = " + F); 663 //System.out.println("P = " + P); 664 665 assertTrue("is co-prime ", ufd.isCoPrime(P)); 666 assertTrue("is co-prime of ", ufd.isCoPrime(P, F)); 667 } 668 669 670 /** 671 * Test resultant. 672 */ 673 public void testResultant() { 674 mi = new ModIntegerRing(163, true); 675 dfac = new GenPolynomialRing<ModInteger>(mi, 3, to); 676 //System.out.println("dfac = " + dfac); 677 678 GreatestCommonDivisorAbstract<ModInteger> ufdm = new GreatestCommonDivisorModEval<ModInteger>(); 679 GreatestCommonDivisorSubres<ModInteger> ufds = new GreatestCommonDivisorSubres<ModInteger>(); 680 681 for (int i = 0; i < 1; i++) { 682 a = dfac.random(kl, ll, el, q); 683 b = dfac.random(kl, ll, el, q); 684 c = dfac.random(kl, ll, el, q); 685 //System.out.println("a = " + a); 686 //System.out.println("b = " + b); 687 688 if (a.isZERO() || b.isZERO() || c.isZERO()) { 689 // skip for this turn 690 continue; 691 } 692 if (c.isConstant()) { 693 c = dfac.univariate(0, 1); 694 } 695 assertTrue("length( c" + i + " ) <> 0", c.length() > 0); 696 697 d = ufdm.resultant(a, b); 698 //System.out.println("d = " + d); 699 e = ufds.resultant(a, b); 700 //System.out.println("e = " + e); 701 assertEquals("d == e: " + d.subtract(e), d.abs().signum(), e.abs().signum()); 702 //assertEquals("d == e: " + d.subtract(e), d, e); 703 704 //System.out.println("c = " + c); 705 GenPolynomial<ModInteger> ac = a.multiply(c); 706 GenPolynomial<ModInteger> bc = b.multiply(c); 707 //System.out.println("ac = " + ac); 708 //System.out.println("bc = " + bc); 709 710 d = ufdm.resultant(ac, bc); 711 //System.out.println("d = " + d); 712 //assertTrue("d == 0: " + d, d.isZERO()); 713 714 e = ufds.resultant(ac, bc); 715 //System.out.println("e = " + e); 716 //assertTrue("e == 0: " + e, e.isZERO()); 717 718 assertEquals("d == e: " + d.subtract(e), d.abs().signum(), e.abs().signum()); 719 } 720 } 721 722}