001/* 002 * $Id$ 003 */ 004 005package edu.jas.fd; 006 007 008import edu.jas.arith.BigQuaternion; 009import edu.jas.arith.BigQuaternionRing; 010import edu.jas.kern.ComputerThreads; 011import edu.jas.poly.GenPolynomial; 012import edu.jas.poly.GenSolvablePolynomial; 013import edu.jas.poly.GenSolvablePolynomialRing; 014import edu.jas.poly.PolyUtil; 015import edu.jas.poly.RecSolvablePolynomial; 016import edu.jas.poly.RecSolvablePolynomialRing; 017import edu.jas.poly.RelationGenerator; 018import edu.jas.poly.TermOrder; 019import edu.jas.poly.TermOrderByName; 020import edu.jas.poly.WeylRelationsIterated; 021 022import junit.framework.Test; 023import junit.framework.TestCase; 024import junit.framework.TestSuite; 025 026 027/** 028 * GCD Simple PRS algorithm tests with JUnit. <b>Note:</b> eventually not in 029 * sync with implementation. 030 * @author Heinz Kredel 031 */ 032 033public class GCDSimpleQuatTest 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>GCDSimpleQuatTest</CODE> object. 047 * @param name String. 048 */ 049 public GCDSimpleQuatTest(String name) { 050 super(name); 051 } 052 053 054 /** 055 */ 056 public static Test suite() { 057 TestSuite suite = new TestSuite(GCDSimpleQuatTest.class); 058 return suite; 059 } 060 061 062 GreatestCommonDivisorAbstract<BigQuaternion> fd; 063 064 065 TermOrder to = TermOrderByName.INVLEX; 066 067 068 GenSolvablePolynomialRing<BigQuaternion> qfac; 069 070 071 //GenSolvablePolynomialRing<GenPolynomial<BigQuaternion>> rfac; 072 RecSolvablePolynomialRing<BigQuaternion> rfac; 073 074 075 GenSolvablePolynomial<BigQuaternion> a, b, a0, b0, c, d, e, f; 076 077 078 GenSolvablePolynomial<GenPolynomial<BigQuaternion>> ar, br, cr, dr, er, ar0, br0; 079 080 081 int rl = 4; 082 083 084 int kl = 2; 085 086 087 int ll = 2; 088 089 090 int el = 3; 091 092 093 float q = 0.25f; 094 095 096 @Override 097 protected void setUp() { 098 a = b = c = d = e = null; 099 ar = br = cr = dr = er = null; 100 String[] vars = new String[] { "a", "b", "c", "d" }; 101 BigQuaternionRing cf = new BigQuaternionRing(); 102 fd = new GreatestCommonDivisorSimple<BigQuaternion>(cf); 103 //System.out.println("fd = " + fd); 104 qfac = new GenSolvablePolynomialRing<BigQuaternion>(cf, to, vars); 105 RelationGenerator<BigQuaternion> wl = new WeylRelationsIterated<BigQuaternion>(); 106 //qfac.addRelations(wl); 107 rfac = (RecSolvablePolynomialRing<BigQuaternion>) qfac.recursive(1); 108 //System.out.println("qfac = " + qfac); 109 //System.out.println("rfac = " + rfac); 110 } 111 112 113 @Override 114 protected void tearDown() { 115 a = b = c = d = e = null; 116 ar = br = cr = dr = er = null; 117 fd = null; 118 qfac = null; 119 rfac = null; 120 } 121 122 123 /** 124 * Test quaternion base gcd simple. 125 */ 126 public void testQuatBaseGcdSimple() { 127 String[] uvars = new String[] { "x" }; 128 BigQuaternionRing cf = new BigQuaternionRing(); 129 qfac = new GenSolvablePolynomialRing<BigQuaternion>(cf, to, uvars); 130 //System.out.println("qfac = " + qfac.toScript()); 131 for (int i = 0; i < 3; i++) { 132 //System.out.println(); 133 a = qfac.random(kl + (i), ll + 2 * i, el + 2, q); 134 a = (GenSolvablePolynomial<BigQuaternion>) a.sum(qfac.univariate(0).power(2)); 135 b = qfac.random(kl + (i + 1), ll + i, el + 2, q); 136 b = (GenSolvablePolynomial<BigQuaternion>) b.sum(qfac.univariate(0)); 137 c = qfac.random(kl + (i + 1), ll + 1, el + 1, q); 138 c = c.multiply(qfac.univariate(0)); 139 if (a.isZERO() || b.isZERO() || c.isZERO()) { 140 // skip for this turn 141 continue; 142 } 143 a = a.monic(); 144 b = b.monic(); 145 c = c.monic(); 146 //System.out.println("a = " + a); 147 //System.out.println("b = " + b); 148 //System.out.println("c = " + c); 149 150 a = a.multiply(c); 151 b = b.multiply(c); 152 //a = c.multiply(a); 153 //b = c.multiply(b); 154 //System.out.println("a = " + a); 155 //System.out.println("b = " + b); 156 157 d = fd.leftBaseGcd(a, b); 158 //System.out.println("d = " + d); 159 //System.out.println("c = " + c); 160 161 e = FDUtil.<BigQuaternion> leftBaseSparsePseudoRemainder(a, d); 162 //System.out.println("e = " + e); 163 assertTrue("gcd(ca,cb) | ca " + e, e.isZERO()); 164 165 e = FDUtil.<BigQuaternion> leftBaseSparsePseudoRemainder(b, d); 166 //System.out.println("e = " + e); 167 assertTrue("gcd(ca,cb) | cb " + e, e.isZERO()); 168 169 // todo 170 //e = FDUtil.<BigQuaternion> leftBaseSparsePseudoRemainder(d, c); 171 e = FDUtil.<BigQuaternion> leftBaseSparsePseudoRemainder(c, d); 172 //System.out.println("e = " + e); 173 assertTrue("c | gcd(ca,cb) " + e, e.isZERO()); 174 } 175 } 176 177 178 /** 179 * Test quaternion univariate recursive left gcd simple. 180 */ 181 //@SuppressWarnings("cast") 182 public void testRecursiveLeftGCDSimple() { 183 String[] vars = new String[] { "a", "b" }; 184 BigQuaternionRing cf = new BigQuaternionRing(); 185 //GenSolvablePolynomialRing<BigQuaternion> qfac; 186 qfac = new GenSolvablePolynomialRing<BigQuaternion>(cf, to, vars); 187 //System.out.println("qfac = " + qfac.toScript()); 188 189 RelationGenerator<BigQuaternion> wl = new WeylRelationsIterated<BigQuaternion>(); 190 //qfac.addRelations(wl); 191 //System.out.println("qfac = " + qfac.toScript()); 192 rfac = (RecSolvablePolynomialRing<BigQuaternion>) qfac.recursive(1); 193 //System.out.println("rfac = " + rfac.toScript()); 194 195 GreatestCommonDivisorAbstract<BigQuaternion> fd = new GreatestCommonDivisorSimple<BigQuaternion>(cf); 196 //System.out.println("fd = " + fd); 197 198 //kl = 3; 199 ll = 3; 200 el = 3; 201 202 ar = rfac.random(kl, ll, el + 1, q); 203 br = rfac.random(kl, ll, el, q); 204 cr = rfac.random(kl, ll, el, q); 205 ////cr = (RecSolvablePolynomial<BigQuaternion>) cr.abs(); 206 ///cr = PolyUtil.<BigQuaternion> monic(cr); // leftMonic 207 //cr = (RecSolvablePolynomial<BigQuaternion>) fd.recursivePrimitivePart(cr).abs(); 208 //System.out.println("ar = " + ar); 209 //System.out.println("br = " + br); 210 211 if (cr.isConstant()) { 212 er = rfac.univariate(0); 213 System.out.println("univ(0) = " + er); 214 cr = (RecSolvablePolynomial<BigQuaternion>) cr.sum(er); 215 } 216 //System.out.println("cr = " + cr); 217 218 //ar0 = ar; 219 //br0 = br; 220 //ar = cr.multiply(ar); 221 //br = cr.multiply(br); 222 ar = ar.multiply(cr); 223 br = br.multiply(cr); 224 //System.out.println("ar = " + ar); 225 //System.out.println("br = " + br); 226 227 dr = fd.leftRecursiveUnivariateGcd(ar, br); 228 //System.out.println("cr_r = " + cr); 229 //System.out.println("dr_r = " + dr); 230 //dr = PolyUtil.<BigQuaternion> monic(dr); // leftMonic 231 //System.out.println("monic(dr_r) = " + dr); 232 233 er = FDUtil.<BigQuaternion> recursiveSparsePseudoRemainder(dr, cr); 234 //System.out.println("er = " + er); 235 assertTrue("c | gcd(ac,bc) " + er, er.isZERO()); 236 237 er = FDUtil.<BigQuaternion> recursiveSparsePseudoRemainder(ar, dr); 238 //System.out.println("er = " + er); 239 assertTrue("gcd(a,b) | a " + er, er.isZERO()); 240 241 er = FDUtil.<BigQuaternion> recursiveSparsePseudoRemainder(br, dr); 242 //System.out.println("er = " + er); 243 assertTrue("gcd(a,b) | b " + er, er.isZERO()); 244 } 245 246 247 /** 248 * Test quaternion univariate recursive left gcd simple Weyl. 249 */ 250 //@SuppressWarnings("cast") 251 public void testRecursiveLeftGCDSimpleWeyl() { 252 String[] vars = new String[] { "a", "b" }; 253 BigQuaternionRing cf = new BigQuaternionRing(); 254 //GenSolvablePolynomialRing<BigQuaternion> qfac; 255 qfac = new GenSolvablePolynomialRing<BigQuaternion>(cf, to, vars); 256 //System.out.println("qfac = " + qfac.toScript()); 257 258 RelationGenerator<BigQuaternion> wl = new WeylRelationsIterated<BigQuaternion>(); 259 qfac.addRelations(wl); 260 //System.out.println("qfac = " + qfac.toScript()); 261 rfac = (RecSolvablePolynomialRing<BigQuaternion>) qfac.recursive(1); 262 //System.out.println("rfac = " + rfac.toScript()); 263 264 GreatestCommonDivisorAbstract<BigQuaternion> fd = new GreatestCommonDivisorSimple<BigQuaternion>(cf); 265 System.out.println("fd = " + fd); 266 267 //kl = 3; 268 ll = 3; 269 el = 3; 270 271 ar = rfac.random(kl, ll, el + 1, q); 272 br = rfac.random(kl, ll, el, q); 273 cr = rfac.random(kl, ll, el, q); 274 ////cr = (RecSolvablePolynomial<BigQuaternion>) cr.abs(); 275 ///cr = PolyUtil.<BigQuaternion> monic(cr); // leftMonic 276 //cr = (RecSolvablePolynomial<BigQuaternion>) fd.recursivePrimitivePart(cr).abs(); 277 //System.out.println("ar = " + ar); 278 //System.out.println("br = " + br); 279 280 if (cr.isConstant()) { 281 er = rfac.univariate(0); 282 System.out.println("univ(0) = " + er); 283 cr = (RecSolvablePolynomial<BigQuaternion>) cr.sum(er); 284 } 285 //System.out.println("cr = " + cr); 286 287 //ar0 = ar; 288 //br0 = br; 289 //ar = cr.multiply(ar); 290 //br = cr.multiply(br); 291 ar = ar.multiply(cr); 292 br = br.multiply(cr); 293 //System.out.println("ar = " + ar); 294 //System.out.println("br = " + br); 295 296 dr = fd.leftRecursiveUnivariateGcd(ar, br); 297 //System.out.println("cr_w = " + cr); 298 //System.out.println("dr_w = " + dr); 299 //dr = PolyUtil.<BigQuaternion> monic(dr); // leftMonic 300 //System.out.println("monic(dr_w) = " + dr); 301 302 er = FDUtil.<BigQuaternion> recursiveSparsePseudoRemainder(dr, cr); 303 //System.out.println("er = " + er); 304 assertTrue("c | gcd(ac,bc) " + er, er.isZERO()); 305 306 er = FDUtil.<BigQuaternion> recursiveSparsePseudoRemainder(ar, dr); 307 //System.out.println("er = " + er); 308 assertTrue("gcd(a,b) | a " + er, er.isZERO()); 309 310 er = FDUtil.<BigQuaternion> recursiveSparsePseudoRemainder(br, dr); 311 //System.out.println("er = " + er); 312 assertTrue("gcd(a,b) | b " + er, er.isZERO()); 313 } 314 315 316 /** 317 * Test 3 vars arbitrary recursive gcd simple. 318 */ 319 @SuppressWarnings("cast") 320 public void testArbitrary3RecursiveGCDSimple() { 321 String[] cvars = new String[] { "a", "b" }; 322 String[] vars = new String[] { "c" }; 323 BigQuaternionRing cf = new BigQuaternionRing(); 324 qfac = new GenSolvablePolynomialRing<BigQuaternion>(cf, to, cvars); 325 RelationGenerator<BigQuaternion> wl = new WeylRelationsIterated<BigQuaternion>(); 326 //dfac.addRelations(wl); 327 //System.out.println("qfac = " + qfac.toScript()); 328 rfac = new RecSolvablePolynomialRing<BigQuaternion>(qfac, to, vars); 329 System.out.println("rfac = " + rfac.toScript()); 330 331 //kl = 3; 332 int ll = 2; 333 int el = 2; 334 335 ar0 = rfac.random(kl, ll, el, q); 336 br0 = rfac.random(kl, ll, el, q); 337 cr = rfac.random(kl, ll, el, q); 338 339 //cr = (RecSolvablePolynomial<BigQuaternion>) fd.recursivePrimitivePart(cr).abs(); 340 //cr = (RecSolvablePolynomial<BigQuaternion>) cr.monic(); 341 if (cr.isZERO()) { 342 cr = rfac.getONE(); 343 } 344 if (cr.isConstant()) { 345 er = rfac.univariate(0); 346 System.out.println("univ(0) = " + er); 347 cr = (RecSolvablePolynomial<BigQuaternion>) cr.sum(er); 348 } 349 //System.out.println("cr = " + cr); 350 //System.out.println("ar = " + ar); 351 //System.out.println("br = " + br); 352 //System.out.println("cr = " + cr); 353 354 // left gcd 355 ar = ar0.multiply(cr); 356 br = br0.multiply(cr); 357 //System.out.println("ar = " + ar); 358 //System.out.println("br = " + br); 359 360 dr = fd.leftRecursiveGcd(ar, br); 361 //System.out.println("cr = " + cr); 362 //System.out.println("dr = " + dr); 363 364 er = FDUtil.<BigQuaternion> recursiveSparsePseudoRemainder(dr, cr); 365 //System.out.println("er = " + er); 366 assertTrue("c | gcd(ac,bc): " + er, er.isZERO()); 367 368 er = FDUtil.<BigQuaternion> recursiveSparsePseudoRemainder(ar, dr); 369 //System.out.println("er = " + er); 370 assertTrue("gcd(ac,bc) | ac: " + er, er.isZERO()); 371 372 er = FDUtil.<BigQuaternion> recursiveSparsePseudoRemainder(br, dr); 373 //System.out.println("er = " + er); 374 assertTrue("gcd(ac,bc) | bc: " + er, er.isZERO()); 375 } 376 377}