001/* 002 * $Id: GCDPrimitiveTest.java 5267 2015-07-27 17:57:50Z kredel $ 003 */ 004 005package edu.jas.fd; 006 007 008import java.util.List; 009 010import junit.framework.Test; 011import junit.framework.TestCase; 012import junit.framework.TestSuite; 013 014import org.apache.log4j.BasicConfigurator; 015 016import edu.jas.arith.BigRational; 017import edu.jas.gbufd.QuotSolvablePolynomialRing; 018import edu.jas.gbufd.SolvableQuotient; 019import edu.jas.gbufd.SolvableQuotientRing; 020import edu.jas.poly.GenPolynomial; 021import edu.jas.poly.GenSolvablePolynomial; 022import edu.jas.poly.GenSolvablePolynomialRing; 023import edu.jas.poly.PolyUtil; 024import edu.jas.poly.PolynomialList; 025import edu.jas.poly.RecSolvablePolynomial; 026import edu.jas.poly.RecSolvablePolynomialRing; 027import edu.jas.poly.RelationGenerator; 028import edu.jas.poly.TermOrder; 029import edu.jas.poly.WeylRelationsIterated; 030 031 032/** 033 * GCD Primitive PRS algorithm tests with JUnit. <b>Note:</b> not in sync with 034 * implementation. 035 * @author Heinz Kredel. 036 */ 037 038public class GCDPrimitiveTest extends TestCase { 039 040 041 /** 042 * main. 043 */ 044 public static void main(String[] args) { 045 BasicConfigurator.configure(); 046 junit.textui.TestRunner.run(suite()); 047 } 048 049 050 /** 051 * Constructs a <CODE>GCDPrimitiveTest</CODE> object. 052 * @param name String. 053 */ 054 public GCDPrimitiveTest(String name) { 055 super(name); 056 } 057 058 059 /** 060 */ 061 public static Test suite() { 062 TestSuite suite = new TestSuite(GCDPrimitiveTest.class); 063 return suite; 064 } 065 066 067 GreatestCommonDivisorAbstract<BigRational> fd, fds; 068 069 070 TermOrder to = new TermOrder(TermOrder.INVLEX); 071 072 073 //TermOrder to = new TermOrder(TermOrder.IGRLEX); 074 075 076 GenSolvablePolynomialRing<BigRational> dfac; 077 078 079 //GenSolvablePolynomialRing<GenPolynomial<BigRational>> rfac; 080 RecSolvablePolynomialRing<BigRational> rfac; 081 082 083 GenSolvablePolynomial<BigRational> a, b, c, d, e, a1, b1; 084 085 086 GenSolvablePolynomial<GenPolynomial<BigRational>> ar, br, cr, dr, er, sr; 087 088 089 int rl = 4; 090 091 092 int kl = 2; 093 094 095 int ll = 2; 096 097 098 int el = 3; 099 100 101 float q = 0.25f; 102 103 104 @Override 105 protected void setUp() { 106 a = b = c = d = e = null; 107 ar = br = cr = dr = er = null; 108 String[] vars = new String[] { "a", "b", "c", "d" }; 109 BigRational cf = new BigRational(1); 110 fd = new GreatestCommonDivisorPrimitive<BigRational>(cf); 111 fds = new GreatestCommonDivisorSimple<BigRational>(cf); 112 dfac = new GenSolvablePolynomialRing<BigRational>(cf, rl, to, vars); 113 RelationGenerator<BigRational> wl = new WeylRelationsIterated<BigRational>(); 114 dfac.addRelations(wl); 115 rfac = (RecSolvablePolynomialRing<BigRational>) dfac.recursive(1); 116 } 117 118 119 @Override 120 protected void tearDown() { 121 a = b = c = d = e = null; 122 ar = br = cr = dr = er = null; 123 fd = null; 124 dfac = null; 125 rfac = null; 126 } 127 128 129 /** 130 * Test base gcd primitive. 131 */ 132 public void xtestBaseGcdPrimitive() { 133 String[] uvars = new String[] { "x" }; 134 dfac = new GenSolvablePolynomialRing<BigRational>(new BigRational(1), 1, to, uvars); 135 136 for (int i = 0; i < 5; i++) { 137 a = dfac.random(kl * (i + 2), ll + 2 * i, el + 2, q); 138 b = dfac.random(kl * (i + 2), ll + 2 * i, el + 2, q); 139 c = dfac.random(kl * (i + 2), ll + 2, el + 2, q); 140 c = c.multiply(dfac.univariate(0)); 141 if (c.isZERO()) { 142 // skip for this turn 143 continue; 144 } 145 //a = fd.basePrimitivePart(a); 146 //b = fd.basePrimitivePart(b); 147 c = (GenSolvablePolynomial<BigRational>) fd.leftBasePrimitivePart(c).abs(); 148 149 //System.out.println("a = " + a); 150 //System.out.println("b = " + b); 151 //System.out.println("c = " + c); 152 //assertTrue("length( c" + i + " ) <> 0", c.length() > 0); 153 154 a = a.multiply(c); 155 b = b.multiply(c); 156 157 d = fd.leftBaseGcd(a, b); 158 e = (GenSolvablePolynomial<BigRational>) PolyUtil.<BigRational> basePseudoRemainder(d, c); 159 //System.out.println("d = " + d); 160 //System.out.println("c = " + c); 161 assertTrue("c | gcd(ac,bc): " + e, e.isZERO()); 162 163 e = (GenSolvablePolynomial<BigRational>) PolyUtil.<BigRational> basePseudoRemainder(a, d); 164 //System.out.println("e = " + e); 165 assertTrue("gcd(a,b) | a: " + e, e.isZERO()); 166 167 e = (GenSolvablePolynomial<BigRational>) PolyUtil.<BigRational> basePseudoRemainder(b, d); 168 //System.out.println("e = " + e); 169 assertTrue("gcd(a,b) | b " + e, e.isZERO()); 170 } 171 } 172 173 174 /** 175 * Test univariate recursive gcd primitive. 176 */ 177 @SuppressWarnings("cast") 178 public void xtestRecursiveGCDPrimitive() { 179 //String[] vars = new String[] { "a", "b", "c", "d" }; 180 String[] vars = new String[] { "a", "b" }; 181 dfac = new GenSolvablePolynomialRing<BigRational>(new BigRational(1), to, vars); 182 RelationGenerator<BigRational> wl = new WeylRelationsIterated<BigRational>(); 183 dfac.addRelations(wl); 184 //System.out.println("dfac = " + dfac.toScript()); 185 rfac = (RecSolvablePolynomialRing<BigRational>) dfac.recursive(1); 186 //System.out.println("rfac = " + rfac.toScript()); 187 188 RecSolvablePolynomialRing<BigRational> rrfacTemp = rfac; 189 GenSolvablePolynomialRing<GenPolynomial<BigRational>> rrfac = rfac; 190 191 GenSolvablePolynomialRing<BigRational> rcfac = (GenSolvablePolynomialRing<BigRational>) rfac.coFac; 192 SolvableQuotientRing<BigRational> qfac = new SolvableQuotientRing<BigRational>(rcfac); 193 QuotSolvablePolynomialRing<BigRational> rqfac = new QuotSolvablePolynomialRing<BigRational>(qfac, 194 rrfac); 195 List<GenSolvablePolynomial<GenPolynomial<BigRational>>> rl = rrfacTemp.coeffTable.relationList(); 196 List<GenPolynomial<GenPolynomial<BigRational>>> rlc = PolynomialList 197 .<GenPolynomial<BigRational>> castToList(rl); 198 rqfac.polCoeff.coeffTable.addRelations(rlc); 199 //System.out.println("rrfac = " + rrfac.toScript()); 200 //System.out.println("rcfac = " + rcfac.toScript()); 201 //System.out.println("qfac = " + qfac.toScript()); 202 //System.out.println("rqfac = " + rqfac.toScript()); 203 204 //kl = 3; ll = 4; // 205 el = 2; 206 207 ar = rfac.random(kl, ll, el + 1, q); 208 br = rfac.random(kl, ll, el, q); 209 cr = rfac.random(kl, ll, el, q); 210 //cr = (RecSolvablePolynomial<BigRational>) cr.abs(); 211 cr = (RecSolvablePolynomial<BigRational>) PolyUtil.<BigRational> monic(cr); 212 //cr = (RecSolvablePolynomial<BigRational>) fd.recursivePrimitivePart(cr).abs(); 213 //cr = rfac.getONE(); 214 //cr = rfac.parse("a+b+c+d"); 215 216 //ar = rfac.parse("1/3 b^3 - 1/6"); 217 //ar = rfac.parse("1/3 b^2 - 1/6"); 218 //br = rfac.parse("( -1/2 ) b + 3 a"); 219 //nok: cr = rfac.parse("b * a - 5 b"); 220 //cr = rfac.parse("a - 5"); 221 222 //System.out.println("ar = " + ar); 223 //System.out.println("br = " + br); 224 //System.out.println("cr = " + cr); 225 226 if (br.isZERO() || cr.isZERO()) { 227 br = rfac.parse("( -1/2 ) b + 3 a"); 228 cr = rfac.parse("a * b - 5 b"); 229 } 230 231 //ar = cr.multiply(ar); 232 //br = cr.multiply(br); 233 ar = ar.multiply(cr); 234 br = br.multiply(cr); 235 //System.out.println("ar = " + ar); 236 //System.out.println("br = " + br); 237 //if (true) return; 238 239 long ts = System.currentTimeMillis(); 240 //sr = rfac.getONE(); 241 sr = fds.leftRecursiveUnivariateGcd(ar, br); 242 ts = System.currentTimeMillis() - ts; 243 //System.out.println("cr = " + cr); 244 245 long tp = System.currentTimeMillis(); 246 dr = fd.leftRecursiveUnivariateGcd(ar, br); 247 tp = System.currentTimeMillis() - tp; 248 //System.out.println("cr = " + cr); 249 //System.out.println("dr = " + dr); 250 //System.out.println("sr = " + sr); 251 if (ts < tp) { 252 System.out.println("time: ts = " + ts + ", tp = " + tp); 253 } 254 255 er = (RecSolvablePolynomial<BigRational>) FDUtil.<BigRational> recursiveSparsePseudoRemainder(dr, cr); 256 //System.out.println("er = " + er); 257 assertTrue("c | gcd(ac,bc): " + er, er.isZERO()); 258 259 er = (RecSolvablePolynomial<BigRational>) FDUtil.<BigRational> recursiveSparsePseudoRemainder(ar, dr); 260 //System.out.println("er = " + er); 261 assertTrue("gcd(a,b) | a: " + er, er.isZERO()); 262 263 er = (RecSolvablePolynomial<BigRational>) FDUtil.<BigRational> recursiveSparsePseudoRemainder(br, dr); 264 //System.out.println("er = " + er); 265 assertTrue("gcd(a,b) | b: " + er, er.isZERO()); 266 267 GenSolvablePolynomial<SolvableQuotient<BigRational>> ap, bp, cp, dp, gp, ep, apm, bpm, cpm, dpm, gpm; 268 ap = FDUtil.<BigRational> quotientFromIntegralCoefficients(rqfac, ar); 269 bp = FDUtil.<BigRational> quotientFromIntegralCoefficients(rqfac, br); 270 cp = FDUtil.<BigRational> quotientFromIntegralCoefficients(rqfac, cr); 271 dp = FDUtil.<BigRational> quotientFromIntegralCoefficients(rqfac, dr); 272 apm = ap.monic(); 273 bpm = bp.monic(); 274 cpm = cp.monic(); 275 dpm = dp.monic(); 276 //System.out.println("ap = " + ap); 277 //System.out.println("apm = " + apm); 278 //System.out.println("bp = " + bp); 279 //System.out.println("bpm = " + bpm); 280 //System.out.println("cp = " + cp); 281 //System.out.println("cpm = " + cpm); 282 //System.out.println("dp = " + dp); 283 //System.out.println("dpm = " + dpm); 284 285 GreatestCommonDivisorAbstract<SolvableQuotient<BigRational>> fdq = new GreatestCommonDivisorPrimitive<SolvableQuotient<BigRational>>( 286 qfac); 287 gp = fdq.leftBaseGcd(ap, bp); 288 gpm = gp.monic(); 289 //System.out.println("gp = " + gp); 290 //System.out.println("gpm = " + gpm); 291 292 ep = FDUtil.<SolvableQuotient<BigRational>> leftBaseSparsePseudoRemainder(gp, dp); 293 //System.out.println("ep = " + ep); 294 assertTrue("c | gcd(ac,bc): " + ep, ep.isZERO()); 295 296 ep = FDUtil.<SolvableQuotient<BigRational>> leftBaseSparsePseudoRemainder(ap, gp); 297 //System.out.println("ep = " + ep); 298 assertTrue("gcd(ac,bc)| ac): " + ep, ep.isZERO()); 299 300 ep = FDUtil.<SolvableQuotient<BigRational>> leftBaseSparsePseudoRemainder(bp, gp); 301 //System.out.println("ep = " + ep); 302 assertTrue("gcd(ac,bc)| bc): " + ep, ep.isZERO()); 303 304 assertEquals("nonsense", apm, ap.monic()); 305 assertEquals("nonsense", bpm, bp.monic()); 306 assertEquals("nonsense", cpm, cp.monic()); 307 assertEquals("nonsense", dpm, dp.monic()); 308 assertEquals("nonsense", gpm, gp.monic()); 309 } 310 311 312 /** 313 * Test arbitrary recursive gcd primitive. 314 */ 315 @SuppressWarnings("cast") 316 public void xtestArbitraryRecursiveGCDPrimitive() { 317 String[] cvars = new String[] { "a", "b" }; 318 String[] vars = new String[] { "c" }; 319 dfac = new GenSolvablePolynomialRing<BigRational>(new BigRational(1), to, cvars); 320 RelationGenerator<BigRational> wl = new WeylRelationsIterated<BigRational>(); 321 dfac.addRelations(wl); 322 System.out.println("dfac = " + dfac.toScript()); 323 rfac = new RecSolvablePolynomialRing<BigRational>(dfac, to, vars); 324 //rfac = (RecSolvablePolynomialRing<BigRational>) dfac.recursive(1); 325 System.out.println("rfac = " + rfac.toScript()); 326 327 //kl = 3; ll = 2; 328 el = 2; 329 330 ar = rfac.random(kl, ll, el + 1, q); 331 br = rfac.random(kl, ll, el, q); 332 cr = rfac.random(kl, ll, el, q); 333 334 //ar = rfac.parse("a + b c^2 "); 335 //br = rfac.parse("( a^2 - 1/3 ) c - 1/4"); 336 //cr = rfac.parse("(b - 1/2 a^2) c"); 337 338 //cr = (RecSolvablePolynomial<BigRational>) fd.recursivePrimitivePart(cr).abs(); 339 cr = (RecSolvablePolynomial<BigRational>) cr.monic(); 340 if (cr.isZERO()) { 341 cr = rfac.getONE(); 342 } 343 344 System.out.println("ar = " + ar); 345 System.out.println("br = " + br); 346 System.out.println("cr = " + cr); 347 348 ar = ar.multiply(cr); 349 br = br.multiply(cr); 350 System.out.println("ar = " + ar); 351 System.out.println("br = " + br); 352 353 dr = fd.leftRecursiveGcd(ar, br); 354 System.out.println("cr = " + cr); 355 System.out.println("dr = " + dr); 356 357 er = (RecSolvablePolynomial<BigRational>) FDUtil.<BigRational> recursiveSparsePseudoRemainder(dr, cr); 358 //System.out.println("er = " + er); 359 assertTrue("c | gcd(ac,bc): " + er, er.isZERO()); 360 361 er = (RecSolvablePolynomial<BigRational>) FDUtil.<BigRational> recursiveSparsePseudoRemainder(ar, dr); 362 //System.out.println("er = " + er); 363 assertTrue("gcd(a,b) | a: " + er, er.isZERO()); 364 365 er = (RecSolvablePolynomial<BigRational>) FDUtil.<BigRational> recursiveSparsePseudoRemainder(br, dr); 366 //System.out.println("er = " + er); 367 assertTrue("gcd(a,b) | b: " + er, er.isZERO()); 368 369 // compare with field coefficients: 370 RecSolvablePolynomialRing<BigRational> rrfacTemp = rfac; 371 GenSolvablePolynomialRing<GenPolynomial<BigRational>> rrfac = rfac; 372 373 GenSolvablePolynomialRing<BigRational> rcfac = (GenSolvablePolynomialRing<BigRational>) rfac.coFac; 374 SolvableQuotientRing<BigRational> qfac = new SolvableQuotientRing<BigRational>(rcfac); 375 QuotSolvablePolynomialRing<BigRational> rqfac = new QuotSolvablePolynomialRing<BigRational>(qfac, 376 rrfac); 377 List<GenSolvablePolynomial<GenPolynomial<BigRational>>> rl = rrfacTemp.coeffTable.relationList(); 378 List<GenPolynomial<GenPolynomial<BigRational>>> rlc = PolynomialList 379 .<GenPolynomial<BigRational>> castToList(rl); 380 rqfac.polCoeff.coeffTable.addRelations(rlc); 381 System.out.println("rrfac = " + rrfac.toScript()); 382 System.out.println("rcfac = " + rcfac.toScript()); 383 System.out.println("qfac = " + qfac.toScript()); 384 System.out.println("rqfac = " + rqfac.toScript()); 385 386 GenSolvablePolynomial<SolvableQuotient<BigRational>> ap, bp, cp, dp, gp, ep, apm, bpm, cpm, dpm, gpm; 387 ap = FDUtil.<BigRational> quotientFromIntegralCoefficients(rqfac, ar); 388 bp = FDUtil.<BigRational> quotientFromIntegralCoefficients(rqfac, br); 389 cp = FDUtil.<BigRational> quotientFromIntegralCoefficients(rqfac, cr); 390 dp = FDUtil.<BigRational> quotientFromIntegralCoefficients(rqfac, dr); 391 apm = ap.monic(); 392 bpm = bp.monic(); 393 cpm = cp.monic(); 394 dpm = dp.monic(); 395 System.out.println("ap = " + ap); 396 System.out.println("apm = " + apm); 397 System.out.println("bp = " + bp); 398 System.out.println("bpm = " + bpm); 399 System.out.println("cp = " + cp); 400 System.out.println("cpm = " + cpm); 401 System.out.println("dp = " + dp); 402 System.out.println("dpm = " + dpm); 403 404 GreatestCommonDivisorAbstract<SolvableQuotient<BigRational>> fdq = new GreatestCommonDivisorPrimitive<SolvableQuotient<BigRational>>( 405 qfac); 406 gp = fdq.leftBaseGcd(ap, bp); 407 gpm = gp.monic(); 408 System.out.println("gp = " + gp); 409 System.out.println("gpm = " + gpm); 410 411 ep = FDUtil.<SolvableQuotient<BigRational>> leftBaseSparsePseudoRemainder(gp, dp); 412 //System.out.println("ep = " + ep); 413 assertTrue("c | gcd(ac,bc): " + ep, ep.isZERO()); 414 415 ep = FDUtil.<SolvableQuotient<BigRational>> leftBaseSparsePseudoRemainder(ap, gp); 416 //System.out.println("ep = " + ep); 417 assertTrue("gcd(ac,bc)| ac): " + ep, ep.isZERO()); 418 419 ep = FDUtil.<SolvableQuotient<BigRational>> leftBaseSparsePseudoRemainder(bp, gp); 420 //System.out.println("ep = " + ep); 421 assertTrue("gcd(ac,bc)| bc): " + ep, ep.isZERO()); 422 } 423 424 425 /** 426 * Test full gcd primitive. 427 */ 428 public void testGCDPrimitive() { 429 String[] vars = new String[] { "a", "b", "c", "d" }; 430 //String[] vars = new String[] { "a", "b" }; 431 dfac = new GenSolvablePolynomialRing<BigRational>(new BigRational(1), to, vars); 432 RelationGenerator<BigRational> wl = new WeylRelationsIterated<BigRational>(); 433 dfac.addRelations(wl); 434 //System.out.println("dfac = " + dfac.toScript()); 435 436 //kl = 3; 437 ll = 4; 438 el = 4; 439 440 //a = dfac.random(kl, ll, el, q); 441 //b = dfac.random(kl, ll, el, q); 442 //c = dfac.random(kl, ll, el, q); 443 //c = c.multiply(dfac.univariate(0)); 444 445 a = dfac.parse("1/3 b^3 - 1/6 + d"); 446 b = dfac.parse("( -1/2 ) b + 3 a^2 + d"); 447 ////b = dfac.parse("( -1/2 ) b + 3 a^2 + c"); 448 ////c = dfac.parse("(a - 5 b) + c + d"); 449 ////ok: c = dfac.parse("(a - b) c"); 450 ////c = dfac.parse("c (a - b)"); 451 //c = dfac.parse("(a - b) + c + d "); 452 c = dfac.parse("(a - b) + c"); 453 //c = dfac.parse("(a - b) + b^3"); 454 //c = dfac.parse("(a - b) + d"); 455 456 //a = dfac.parse("2 b^3 * d^2 + 2/3 a + 3/2"); 457 //b = dfac.parse("2/3 d + 1/2 a^3 + 3/4"); 458 //c = dfac.parse("c^2 * d - 1/2 a^3 * d + 5/4 d"); 459 460 //c = (GenSolvablePolynomial<BigRational>) fd.primitivePart(c).abs(); 461 c = c.monic(); 462 if (c.isZERO()) { 463 c = dfac.getONE(); 464 } 465 //System.out.println("a = " + a); 466 //System.out.println("b = " + b); 467 //System.out.println("c = " + c); 468 469 a = a.multiply(c); 470 b = b.multiply(c); 471 //System.out.println("a = " + a); 472 //System.out.println("b = " + b); 473 //System.out.println("c = " + c); 474 475 d = fd.leftGcd(a, b); 476 //System.out.println("c = " + c); 477 //System.out.println("d = " + d); 478 479 e = FDUtil.<BigRational> leftBaseSparsePseudoRemainder(d, c); 480 //System.out.println("e = " + e); 481 assertTrue("c | gcd(ac,bc) " + e, e.isZERO()); 482 483 e = FDUtil.<BigRational> leftBaseSparsePseudoRemainder(a, c); 484 //System.out.println("e = " + e); 485 assertTrue("c | ac " + e, e.isZERO()); 486 e = FDUtil.<BigRational> leftBaseSparsePseudoRemainder(a, d); 487 //System.out.println("e = " + e); 488 assertTrue("gcd(a,b) | a " + e, e.isZERO()); 489 490 e = FDUtil.<BigRational> leftBaseSparsePseudoRemainder(b, c); 491 //System.out.println("e = " + e); 492 assertTrue("c | bc " + e, e.isZERO()); 493 e = FDUtil.<BigRational> leftBaseSparsePseudoRemainder(b, d); 494 //System.out.println("e = " + e); 495 assertTrue("gcd(a,b) | b " + e, e.isZERO()); 496 } 497 498}