001/* 002 * $Id: GCDLeftRightTest.java 5731 2017-02-11 11:38:15Z kredel $ 003 */ 004 005package edu.jas.fd; 006 007 008import org.apache.log4j.BasicConfigurator; 009 010import edu.jas.arith.BigQuaternion; 011import edu.jas.arith.BigQuaternionRing; 012import edu.jas.gbufd.SolvableSyzygyAbstract; 013import edu.jas.gbufd.SolvableSyzygySeq; 014import edu.jas.kern.ComputerThreads; 015import edu.jas.poly.GenPolynomial; 016import edu.jas.poly.GenSolvablePolynomial; 017import edu.jas.poly.GenSolvablePolynomialRing; 018import edu.jas.poly.RecSolvablePolynomialRing; 019import edu.jas.poly.RelationGenerator; 020import edu.jas.poly.TermOrder; 021import edu.jas.poly.TermOrderByName; 022import edu.jas.poly.WeylRelationsIterated; 023import edu.jas.structure.GcdRingElem; 024 025import junit.framework.Test; 026import junit.framework.TestCase; 027import junit.framework.TestSuite; 028 029 030/** 031 * GCD LeftRight PRS algorithm tests with JUnit. <b>Note:</b> not in sync with 032 * implementation. 033 * @author Heinz Kredel 034 */ 035 036public class GCDLeftRightTest extends TestCase { 037 038 039 /** 040 * main. 041 */ 042 public static void main(String[] args) { 043 BasicConfigurator.configure(); 044 junit.textui.TestRunner.run(suite()); 045 ComputerThreads.terminate(); 046 } 047 048 049 /** 050 * Constructs a <CODE>GCDLeftRightTest</CODE> object. 051 * @param name String. 052 */ 053 public GCDLeftRightTest(String name) { 054 super(name); 055 } 056 057 058 /** 059 */ 060 public static Test suite() { 061 TestSuite suite = new TestSuite(GCDLeftRightTest.class); 062 return suite; 063 } 064 065 066 //GreatestCommonDivisorAbstract<BigQuaternion> fd; 067 GreatestCommonDivisorLR<BigQuaternion> fd; 068 069 070 TermOrder to = TermOrderByName.INVLEX; 071 072 073 BigQuaternionRing cfac; 074 075 076 GenSolvablePolynomialRing<BigQuaternion> dfac; 077 078 079 //GenSolvablePolynomialRing<GenPolynomial<BigQuaternion>> rfac; 080 RecSolvablePolynomialRing<BigQuaternion> rfac; 081 082 083 GenSolvablePolynomial<BigQuaternion> a, b, c, d, e, f, g, h, r, s; 084 085 086 GenSolvablePolynomial<GenPolynomial<BigQuaternion>> ar, br, cr, dr, er; 087 088 089 SolvableSyzygyAbstract<BigQuaternion> syz; 090 091 092 int rl = 4; 093 094 095 int kl = 2; 096 097 098 int ll = 4; 099 100 101 int el = 3; 102 103 104 float q = 0.35f; 105 106 107 @Override 108 protected void setUp() { 109 a = b = c = d = e = null; 110 ar = br = cr = dr = er = null; 111 String[] vars = new String[] { "a", "b", "c", "d" }; 112 cfac = new BigQuaternionRing(); 113 syz = new SolvableSyzygySeq<BigQuaternion>(cfac); 114 //System.out.println("syz = " + syz); 115 fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz); 116 //fd = new GreatestCommonDivisorFake<BigQuaternion>(cfac); 117 dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, rl, to, vars); 118 RelationGenerator<BigQuaternion> wl = new WeylRelationsIterated<BigQuaternion>(); 119 dfac.addRelations(wl); 120 rfac = (RecSolvablePolynomialRing<BigQuaternion>) dfac.recursive(1); 121 //System.out.println("dfac = " + dfac); 122 } 123 124 125 @Override 126 protected void tearDown() { 127 a = b = c = d = e = null; 128 ar = br = cr = dr = er = null; 129 fd = null; 130 cfac = null; 131 dfac = null; 132 rfac = null; 133 syz = null; 134 } 135 136 137 /** 138 * Test base field gcd left - right. 139 */ 140 public void testBaseGcdLeftRight() { 141 String[] uvars = new String[] { "x" }; 142 dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars); 143 BigQuaternion cc; 144 for (int i = 0; i < 1; i++) { 145 a = dfac.random(kl * (i + 2), ll + i, el + 1, q); 146 b = dfac.random(kl * (i + 1), ll + i, el + 1, q); 147 c = dfac.random(kl * (i + 1), ll + 1, el + 0, q); 148 //c = dfac.getONE(); 149 c = c.multiply(dfac.univariate(0)); 150 cc = cfac.random(kl); 151 //c = c.multiplyLeft(cc); 152 if (c.isZERO() || cc.isZERO()) { 153 // skip for this turn 154 continue; 155 } 156 //a = fd.basePrimitivePart(a); 157 //b = fd.basePrimitivePart(b); 158 //c = (GenSolvablePolynomial<BigQuaternion>) fd.basePrimitivePart(c).abs(); 159 //System.out.println("a = " + a); 160 //System.out.println("b = " + b); 161 //System.out.println("cc = " + cc); 162 //System.out.println("c = " + c); 163 164 a = a.multiply(c).multiplyLeft(cc); 165 b = b.multiply(c).multiplyLeft(cc); 166 //System.out.println("a = " + a); 167 //System.out.println("b = " + b); 168 169 GCDcoFactors<BigQuaternion> cont = fd.leftRightBaseGcd(a, b); 170 //d = (GenSolvablePolynomial<BigQuaternion>) cont.left; 171 //System.out.println("cont = " + cont); 172 //System.out.println("cont.isGCD() = " + cont.isGCD()); 173 assertTrue("cont.isGCD() ", cont.isGCD()); 174 } 175 } 176 177 178 /** 179 * Test base field gcd right - left. 180 */ 181 public void testBaseGcdRightLeft() { 182 String[] uvars = new String[] { "x" }; 183 dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars); 184 BigQuaternion cc; 185 for (int i = 0; i < 1; i++) { 186 a = dfac.random(kl * (i + 2), ll + i, el + 1, q); 187 b = dfac.random(kl * (i + 1), ll + i, el + 1, q); 188 c = dfac.random(kl * (i + 1), ll + 1, el + 0, q); 189 //c = dfac.getONE(); 190 c = c.multiply(dfac.univariate(0)); 191 cc = cfac.random(kl); 192 //c = c.multiplyLeft(cc); 193 if (c.isZERO() || cc.isZERO()) { 194 // skip for this turn 195 continue; 196 } 197 //a = fd.basePrimitivePart(a); 198 //b = fd.basePrimitivePart(b); 199 //c = (GenSolvablePolynomial<BigQuaternion>) fd.basePrimitivePart(c).abs(); 200 //System.out.println("a = " + a); 201 //System.out.println("b = " + b); 202 //System.out.println("cc = " + cc); 203 //System.out.println("c = " + c); 204 205 a = c.multiply(cc).multiply(a); 206 b = c.multiply(cc).multiply(b); 207 //System.out.println("a = " + a); 208 //System.out.println("b = " + b); 209 210 GCDcoFactors<BigQuaternion> cont = fd.rightLeftBaseGcd(a, b); 211 //d = (GenSolvablePolynomial<BigQuaternion>) cont.left; 212 //System.out.println("cont = " + cont); 213 //System.out.println("cont.isGCD() = " + cont.isGCD()); 214 assertTrue("cont.isGCD() ", cont.isGCD()); 215 } 216 } 217 218 219 /** 220 * Test base field left gcd. 221 */ 222 public void testBaseLeftGcd() { 223 String[] uvars = new String[] { "x" }; 224 dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars); 225 BigQuaternion cc; 226 for (int i = 0; i < 1; i++) { 227 a = dfac.random(kl * (i + 2), ll + i, el + 1, q); 228 b = dfac.random(kl * (i + 1), ll + i, el + 1, q); 229 c = dfac.random(kl * (i + 1), ll + 1, el + 0, q); 230 //c = dfac.getONE(); 231 c = c.multiply(dfac.univariate(0)); 232 cc = cfac.random(kl); 233 c = c.multiplyLeft(cc); 234 if (c.isZERO() || cc.isZERO()) { 235 // skip for this turn 236 continue; 237 } 238 //a = fd.basePrimitivePart(a); 239 //b = fd.basePrimitivePart(b); 240 //c = (GenSolvablePolynomial<BigQuaternion>) fd.basePrimitivePart(c).abs(); 241 //System.out.println("a = " + a); 242 //System.out.println("b = " + b); 243 ////System.out.println("cc = " + cc); 244 //System.out.println("c = " + c); 245 246 a = c.multiply(a); 247 b = c.multiply(b); 248 //System.out.println("a = " + a); 249 //System.out.println("b = " + b); 250 251 d = fd.leftBaseGcd(a, b); 252 //System.out.println("c = " + c); 253 //System.out.println("d = " + d); 254 //assertTrue("cont.isGCD() ", cont.isGCD()); 255 256 e = FDUtil.<BigQuaternion> rightBaseSparsePseudoRemainder(a, d); 257 //System.out.println("e = " + e); 258 assertTrue("e == 0 ", e.isZERO()); 259 f = FDUtil.<BigQuaternion> rightBaseSparsePseudoRemainder(b, d); 260 //System.out.println("f = " + f); 261 assertTrue("f == 0 ", f.isZERO()); 262 } 263 } 264 265 266 /** 267 * Test base field right gcd. 268 */ 269 public void testBaseRightGcd() { 270 String[] uvars = new String[] { "x" }; 271 dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars); 272 BigQuaternion cc; 273 for (int i = 0; i < 1; i++) { 274 a = dfac.random(kl * (i + 2), ll + i, el + 1, q); 275 b = dfac.random(kl * (i + 1), ll + i, el + 1, q); 276 c = dfac.random(kl * (i + 1), ll + 1, el + 0, q); 277 //c = dfac.getONE(); 278 c = c.multiply(dfac.univariate(0)); 279 cc = cfac.random(kl); 280 c = c.multiply(cc); 281 if (c.isZERO() || cc.isZERO()) { 282 // skip for this turn 283 continue; 284 } 285 //a = fd.basePrimitivePart(a); 286 //b = fd.basePrimitivePart(b); 287 //c = (GenSolvablePolynomial<BigQuaternion>) fd.basePrimitivePart(c).abs(); 288 //System.out.println("a = " + a); 289 //System.out.println("b = " + b); 290 ////System.out.println("cc = " + cc); 291 //System.out.println("c = " + c); 292 293 a = a.multiply(c); 294 b = b.multiply(c); 295 //System.out.println("a = " + a); 296 //System.out.println("b = " + b); 297 298 d = fd.rightBaseGcd(a, b); 299 //System.out.println("c = " + c); 300 //System.out.println("d = " + d); 301 //assertTrue("cont.isGCD() ", cont.isGCD()); 302 303 e = FDUtil.<BigQuaternion> leftBaseSparsePseudoRemainder(a, d); 304 //System.out.println("e = " + e); 305 assertTrue("e == 0 ", e.isZERO()); 306 f = FDUtil.<BigQuaternion> leftBaseSparsePseudoRemainder(b, d); 307 //System.out.println("f = " + f); 308 assertTrue("f == 0 ", f.isZERO()); 309 } 310 } 311 312 313 /** 314 * Test base integer gcd left - right. 315 */ 316 public void testBaseIntegerGcdLeftRight() { 317 String[] uvars = new String[] { "x" }; 318 cfac = new BigQuaternionRing(true); 319 syz = new SolvableSyzygySeq<BigQuaternion>(cfac); 320 //System.out.println("syz = " + syz); 321 dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars); 322 fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz); 323 BigQuaternion cc; 324 for (int i = 0; i < 1; i++) { 325 a = dfac.random(kl * (i + 2), ll + 1, el + 2, q); 326 b = dfac.random(kl * (i + 1), ll + 1, el + 2, q); 327 c = dfac.random(kl * (i + 1), ll + 1, el + 1, q); 328 //c = dfac.getONE(); 329 c = c.multiply(dfac.univariate(0)); 330 c = (GenSolvablePolynomial<BigQuaternion>) c.abs(); 331 cc = cfac.random(kl); 332 //cc = cfac.getONE(); 333 //c = c.multiplyLeft(cc); 334 if (c.isZERO() || cc.isZERO()) { 335 // skip for this turn 336 continue; 337 } 338 //a = fd.basePrimitivePart(a); 339 //b = fd.basePrimitivePart(b); 340 //c = (GenSolvablePolynomial<BigQuaternion>) fd.basePrimitivePart(c).abs(); 341 // replace - by ~ in coefficents for polynomial tokenizer 342 //a = dfac.parse("( 3/2i1/2j1/2k~1/2 ) x^3 - ( 1i~1j0k~2 ) x + ( 11/2i15/2j1/2k~1/2 )"); 343 //b = dfac.parse("( ~1i2j3k1 ) x^4 + ( 0i1j~2k0 ) x^2 + ( 1/2i~3/2j1/2k3/2 )"); 344 //c = dfac.parse("( 1/2i1/2j~1/2k1/2 ) x^4 + ( 1i~1j0k0 ) x^3 + 1i1j0k1 x"); 345 346 //System.out.println("a = " + a); 347 //System.out.println("b = " + b); 348 //System.out.println("cc = " + cc); 349 //System.out.println("c = " + c); 350 351 a = a.multiply(c).multiplyLeft(cc); 352 b = b.multiply(c).multiplyLeft(cc); 353 //System.out.println("a = " + a); 354 //System.out.println("b = " + b); 355 356 GCDcoFactors<BigQuaternion> cont = fd.leftRightBaseGcd(a, b); 357 //d = (GenSolvablePolynomial<BigQuaternion>) cont.left; 358 //System.out.println("cont = " + cont); 359 //System.out.println("cont.isGCD() = " + cont.isGCD()); 360 //System.out.println("r = " + cont.right + ", l=" + cont.left); 361 //System.out.println("c = " + c + ", cc = " + cc); 362 assertTrue("cont.isGCD() ", cont.isGCD()); 363 } 364 } 365 366 367 /** 368 * Test base integer gcd right - left. 369 */ 370 public void testBaseIntegerGcdRightLeft() { 371 String[] uvars = new String[] { "x" }; 372 cfac = new BigQuaternionRing(true); 373 syz = new SolvableSyzygySeq<BigQuaternion>(cfac); 374 //System.out.println("syz = " + syz); 375 dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars); 376 fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz); 377 BigQuaternion cc; 378 for (int i = 0; i < 1; i++) { 379 a = dfac.random(kl * (i + 2), ll + 1, el + 2, q); 380 b = dfac.random(kl * (i + 1), ll + 1, el + 2, q); 381 c = dfac.random(kl * (i + 1), ll + 1, el + 1, q); 382 //c = dfac.getONE(); 383 c = c.multiply(dfac.univariate(0)); 384 c = (GenSolvablePolynomial<BigQuaternion>) c.abs(); 385 cc = cfac.random(kl); 386 //cc = cfac.getONE(); 387 //c = c.multiplyLeft(cc); 388 if (c.isZERO() || cc.isZERO()) { 389 // skip for this turn 390 continue; 391 } 392 //System.out.println("a = " + a); 393 //System.out.println("b = " + b); 394 //System.out.println("cc = " + cc); 395 //System.out.println("c = " + c); 396 397 a = a.multiply(c).multiplyLeft(cc); 398 b = b.multiply(c).multiplyLeft(cc); 399 //System.out.println("a = " + a); 400 //System.out.println("b = " + b); 401 402 GCDcoFactors<BigQuaternion> cont = fd.rightLeftBaseGcd(a, b); 403 //d = (GenSolvablePolynomial<BigQuaternion>) cont.left; 404 //System.out.println("cont = " + cont); 405 //System.out.println("cont.isGCD() = " + cont.isGCD()); 406 //System.out.println("r = " + cont.right + ", l=" + cont.left); 407 //System.out.println("c = " + c + ", cc = " + cc); 408 assertTrue("cont.isGCD() ", cont.isGCD()); 409 } 410 } 411 412 413 /** 414 * Test base integral left gcd. 415 */ 416 public void testBaseIntegralLeftGcd() { 417 String[] uvars = new String[] { "x" }; 418 cfac = new BigQuaternionRing(true); 419 syz = new SolvableSyzygySeq<BigQuaternion>(cfac); 420 //System.out.println("syz = " + syz); 421 dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars); 422 fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz); 423 BigQuaternion cc; 424 for (int i = 0; i < 1; i++) { 425 a = dfac.random(kl * (i + 2), ll + i, el + 1, q); 426 b = dfac.random(kl * (i + 1), ll + i, el + 1, q); 427 c = dfac.random(kl * (i + 1), ll + 1, el + 0, q); 428 //c = dfac.getONE(); 429 c = c.multiply(dfac.univariate(0)); 430 cc = cfac.random(kl); 431 c = c.multiplyLeft(cc); 432 if (c.isZERO() || cc.isZERO()) { 433 // skip for this turn 434 continue; 435 } 436 // replace - by ~ in coefficents for polynomial tokenizer 437 //a = dfac.parse("( 1i0j~1k0 ) x^2 - ( 9/2i5/2j~1/2k~1/2 ) x + 5/2i5/2j9/2k3/2"); 438 //b = dfac.parse("1i1j1k1 x^3 + ( 1i~1j1k1 )"); 439 ////c = dfac.parse("( ~3i11j~3k~1 ) x^2 - ( 5i~10j~5k0 ) x"); 440 //c = dfac.parse("( ~3i11j~3k~1 ) x - ( 5i~10j~5k0 ) "); 441 442 //System.out.println("a = " + a); 443 //System.out.println("b = " + b); 444 ////System.out.println("cc = " + cc); 445 //System.out.println("c = " + c); 446 447 a = c.multiply(a); 448 b = c.multiply(b); 449 //System.out.println("a = " + a); 450 //System.out.println("b = " + b); 451 452 d = fd.leftBaseGcd(a, b); 453 //System.out.println("c = " + c); 454 //System.out.println("d = " + d); 455 456 e = FDUtil.<BigQuaternion> rightBaseSparsePseudoRemainder(a, d); 457 //System.out.println("e = " + e); 458 assertTrue("e == 0 ", e.isZERO()); 459 f = FDUtil.<BigQuaternion> rightBaseSparsePseudoRemainder(b, d); 460 //System.out.println("f = " + f); 461 assertTrue("f == 0 ", f.isZERO()); 462 } 463 } 464 465 466 /** 467 * Test base integral right gcd. 468 */ 469 public void testBaseIntegralRightGcd() { 470 String[] uvars = new String[] { "x" }; 471 cfac = new BigQuaternionRing(true); 472 syz = new SolvableSyzygySeq<BigQuaternion>(cfac); 473 //System.out.println("syz = " + syz); 474 dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars); 475 fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz); 476 BigQuaternion cc; 477 for (int i = 0; i < 1; i++) { 478 a = dfac.random(kl * (i + 2), ll + i, el + 1, q); 479 b = dfac.random(kl * (i + 1), ll + i, el + 1, q); 480 c = dfac.random(kl * (i + 1), ll + 1, el + 0, q); 481 //c = dfac.getONE(); 482 c = c.multiply(dfac.univariate(0)); 483 cc = cfac.random(kl); 484 c = c.multiply(cc); 485 if (c.isZERO() || cc.isZERO()) { 486 // skip for this turn 487 continue; 488 } 489 // replace - by ~ in coefficents for polynomial tokenizer 490 //a = dfac.parse("( 5/2i~1/2j~3/2k~3/2 ) x^2 - ( 1i0j0k~1 )"); 491 //b = dfac.parse("( 1i~1j1k0 ) x^2 - 1i2j0k0 x + ( 1/2i1/2j~1/2k3/2 )"); 492 //c = dfac.parse("( 0i~1j~2k~14 ) x"); 493 494 //System.out.println("a = " + a); 495 //System.out.println("b = " + b); 496 ////System.out.println("cc = " + cc); 497 //System.out.println("c = " + c); 498 499 a = a.multiply(c); 500 b = a.multiply(c); 501 //System.out.println("a = " + a); 502 //System.out.println("b = " + b); 503 504 d = fd.rightBaseGcd(a, b); 505 //System.out.println("c = " + c); 506 //System.out.println("d = " + d); 507 //d = fd.leftBasePrimitivePart(fd.rightBasePrimitivePart(d)); 508 //System.out.println("d = " + d); 509 510 e = FDUtil.<BigQuaternion> leftBaseSparsePseudoRemainder(a, d); 511 //System.out.println("e = " + e); 512 assertTrue("e == 0 ", e.isZERO()); 513 f = FDUtil.<BigQuaternion> leftBaseSparsePseudoRemainder(b, d); 514 //System.out.println("f = " + f); 515 assertTrue("f == 0 ", f.isZERO()); 516 } 517 } 518 519 520 /** 521 * Test base integer quotient remainder. 522 */ 523 public void testBaseQR() { 524 String[] uvars = new String[] { "x" }; 525 cfac = new BigQuaternionRing(true); 526 syz = new SolvableSyzygySeq<BigQuaternion>(cfac); 527 //System.out.println("syz = " + syz); 528 dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars); 529 fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz); 530 GreatestCommonDivisorAbstract<BigQuaternion> fds = new GreatestCommonDivisorSimple<BigQuaternion>( 531 cfac); 532 //BigQuaternion cc; 533 for (int i = 0; i < 1; i++) { 534 a = dfac.random(kl * (i + 2), ll + 1, el + 2, q); 535 b = dfac.random(kl * (i + 1), ll + 1, el + 2, q); 536 c = dfac.random(kl * (i + 1), ll + 1, el + 1, q); 537 //c = dfac.getONE(); 538 c = c.multiply(dfac.univariate(0)); 539 c = (GenSolvablePolynomial<BigQuaternion>) c.abs(); 540 if (c.isZERO()) { 541 // skip for this turn 542 continue; 543 } 544 //System.out.println("a = " + a); 545 //System.out.println("b = " + b); 546 //System.out.println("c = " + c); 547 548 a = a.multiply(c); 549 b = b.multiply(c); 550 //System.out.println("a = " + a); 551 //System.out.println("b = " + b); 552 553 GenSolvablePolynomial<BigQuaternion>[] aqr, bqr; 554 555 aqr = FDUtil.<BigQuaternion> leftBasePseudoQuotientRemainder(a, c); 556 bqr = FDUtil.<BigQuaternion> leftBasePseudoQuotientRemainder(b, c); 557 d = aqr[0]; 558 e = bqr[0]; 559 560 //System.out.println("d = " + d + ", rem = " + aqr[1]); 561 //System.out.println("e = " + e + ", rem = " + bqr[1]); 562 assertTrue("a rem == 0: ", aqr[1].isZERO()); 563 assertTrue("b rem == 0: ", bqr[1].isZERO()); 564 565 boolean t; 566 f = d.multiply(c); 567 //System.out.println("f = " + f); 568 //System.out.println("a = " + a); 569 t = f.equals(a); 570 //System.out.println("d*c == a: " + t); 571 572 BigQuaternion qa, qb, oa, ob; 573 qa = a.leadingBaseCoefficient(); 574 qb = f.leadingBaseCoefficient(); 575 GcdRingElem<BigQuaternion>[] oc = fd.leftOreCond(qa, qb); 576 oa = (BigQuaternion) oc[0]; 577 ob = (BigQuaternion) oc[1]; 578 579 a = a.multiplyLeft(oa); 580 f = f.multiplyLeft(ob); 581 //System.out.println("f = " + f); 582 //System.out.println("a = " + a); 583 t = f.equals(a); 584 //System.out.println("d*c == a: " + t); 585 assertTrue("d*c == a: ", t); 586 587 588 g = e.multiply(c); 589 //System.out.println("g = " + g); 590 //System.out.println("b = " + b); 591 t = g.equals(b); 592 //System.out.println("e*c == b: " + t); 593 assertTrue("e*c == b: ", t || true); 594 595 r = (GenSolvablePolynomial<BigQuaternion>) fds.leftBasePrimitivePart(b).abs(); 596 s = (GenSolvablePolynomial<BigQuaternion>) fds.leftBasePrimitivePart(g).abs(); 597 //System.out.println("pp(b) = " + r); 598 //System.out.println("pp(g) = " + s); 599 assertEquals("pp(b) == pp(g): ", r, s); 600 601 qa = b.leadingBaseCoefficient(); 602 qb = g.leadingBaseCoefficient(); 603 oc = fd.leftOreCond(qa, qb); 604 oa = (BigQuaternion) oc[0]; 605 ob = (BigQuaternion) oc[1]; 606 607 b = b.multiplyLeft(oa); 608 g = g.multiplyLeft(ob); 609 //System.out.println("g = " + g); 610 //System.out.println("b = " + b); 611 t = g.equals(b); 612 //System.out.println("e*c == b: " + t); 613 assertTrue("e*c == b: ", t); 614 } 615 } 616 617 618 /** 619 * Test base integral left / right pseudo division. 620 */ 621 public void testBaseIntegralDivision() { 622 String[] uvars = new String[] { "x" }; 623 cfac = new BigQuaternionRing(true); 624 syz = new SolvableSyzygySeq<BigQuaternion>(cfac); 625 //System.out.println("syz = " + syz); 626 dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars); 627 fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz); 628 BigQuaternion cc; 629 for (int i = 0; i < 1; i++) { 630 a = dfac.random(kl * (i + 2), ll + i, el + 1, q); 631 b = dfac.random(kl * (i + 1), ll + i, el + 1, q); 632 c = dfac.random(kl * (i + 1), ll + 1, el + 0, q); 633 //c = dfac.getONE(); 634 c = c.multiply(dfac.univariate(0)); 635 cc = cfac.random(kl); 636 c = c.multiplyLeft(cc); 637 if (c.isZERO() || cc.isZERO()) { 638 // skip for this turn 639 continue; 640 } 641 // replace - by ~ in coefficents for polynomial tokenizer 642 //a = dfac.parse("( 1i~3j~3k~3 ) x^3 - ( 9i7j~12k~8 ) x^2 + 20i17j14k10 x + ( 19/2i27/2j~31/2k~7/2 ) "); 643 //b = dfac.parse("( 3i2j~1k0 ) x^4 + ( 2i1j~3k~1 ) x^3 + ( 3i0j2k~1 ) x + ( 5/2i3/2j1/2k~5/2 ) "); 644 //c = dfac.parse("0i0j4k0 x - ( 1/2i~1/2j~5/2k~5/2 ) "); 645 646 //System.out.println("a = " + a); 647 //System.out.println("b = " + b); 648 ////System.out.println("cc = " + cc); 649 //System.out.println("c = " + c); 650 651 //System.out.println("ppl(a) = " + fd.leftPrimitivePart(a)); 652 //System.out.println("ppl(b) = " + fd.leftPrimitivePart(b)); 653 //System.out.println("ppr(a) = " + fd.rightPrimitivePart(a)); 654 //System.out.println("ppr(b) = " + fd.rightPrimitivePart(b)); 655 //b = fd.rightPrimitivePart(b); 656 657 s = b; 658 r = a; 659 while (!r.isZERO()) { 660 GenSolvablePolynomial<BigQuaternion>[] qr; 661 GenSolvablePolynomial<BigQuaternion> x, y, z; 662 qr = FDUtil.<BigQuaternion> rightBasePseudoQuotientRemainder(s, r); 663 y = qr[0]; 664 x = qr[1]; 665 z = (GenSolvablePolynomial<BigQuaternion>) r.multiply(y).sum(x); 666 //System.out.println("z = " + z + ", s = " + s); 667 BigQuaternion lz, ls; 668 lz = z.leadingBaseCoefficient(); 669 ls = s.leadingBaseCoefficient(); 670 GcdRingElem[] oc = fd.rightOreCond(lz, ls); 671 z = z.multiply((BigQuaternion) oc[0]); 672 s = s.multiply((BigQuaternion) oc[1]); 673 //System.out.println("z * oa = " + z); 674 //System.out.println("s * os = " + s); 675 //System.out.println("z * oz == s * os: " + z.equals(s)); 676 assertEquals("z * oz == s * os: ", z, s); 677 s = r; 678 r = x; 679 //System.out.println("r = " + r); 680 } 681 //System.out.println("s = " + s); 682 //s = fd.rightPrimitivePart(s); 683 //s = fd.leftPrimitivePart(s); 684 //System.out.println("s = " + s); 685 //System.out.println("c = " + c + ", s==c: " + s.equals(c)); 686 g = s; 687 688 GenSolvablePolynomial<BigQuaternion>[] qr; 689 qr = FDUtil.<BigQuaternion> rightBasePseudoQuotientRemainder(a, g); 690 d = qr[0]; 691 h = (GenSolvablePolynomial<BigQuaternion>) g.multiply(d).sum(qr[1]); 692 //System.out.println("h = " + h); 693 //System.out.println("a = " + a); 694 695 BigQuaternion lh, la, lb; 696 lh = h.leadingBaseCoefficient(); 697 la = a.leadingBaseCoefficient(); 698 GcdRingElem[] oc = fd.rightOreCond(lh, la); 699 h = h.multiply((BigQuaternion) oc[0]); 700 s = a.multiply((BigQuaternion) oc[1]); 701 assertEquals("h * oh == a * oa: ", h, s); 702 703 //assertTrue("r==0: ", qr[1].isZERO()); 704 705 qr = FDUtil.<BigQuaternion> rightBasePseudoQuotientRemainder(b, g); 706 e = qr[0]; 707 h = (GenSolvablePolynomial<BigQuaternion>) g.multiply(e).sum(qr[1]); 708 //System.out.println("h = " + h); 709 //System.out.println("b = " + b); 710 711 lh = h.leadingBaseCoefficient(); 712 lb = b.leadingBaseCoefficient(); 713 oc = fd.rightOreCond(lh, lb); 714 h = h.multiply((BigQuaternion) oc[0]); 715 s = b.multiply((BigQuaternion) oc[1]); 716 assertEquals("h * oh == a * oa: ", h, s); 717 718 719 //System.out.println("d = " + d + ", rem = " + qr[1]); 720 //System.out.println("e = " + e + ", rem = " + qr[1]); 721 f = g.multiply(d); 722 g = g.multiply(e); 723 //System.out.println("f = " + f + ", a==f? " + a.equals(f)); 724 //System.out.println("g = " + g + ", b==g? " + b.equals(g)); 725 726 BigQuaternion lf, lg; 727 la = a.leadingBaseCoefficient(); 728 lb = b.leadingBaseCoefficient(); 729 lf = f.leadingBaseCoefficient(); 730 lg = g.leadingBaseCoefficient(); 731 732 oc = fd.rightOreCond(la, lf); 733 r = a.multiply((BigQuaternion) oc[0]); 734 s = f.multiply((BigQuaternion) oc[1]); 735 //System.out.println("a * oa = " + r); 736 //System.out.println("f * of = " + s); 737 //System.out.println("a * oa == f * of: " + r.equals(s)); 738 assertEquals("a * oa == f * of: ", r, s); 739 740 oc = fd.rightOreCond(lb, lg); 741 r = b.multiply((BigQuaternion) oc[0]); 742 s = g.multiply((BigQuaternion) oc[1]); 743 //System.out.println("b * ob = " + r); 744 //System.out.println("g * og = " + s); 745 //System.out.println("b * ob == g * og: " + r.equals(s)); 746 assertEquals("b * ob == g * og: ", r, s); 747 748 } 749 } 750}