001 /* 002 * $Id: GCDPartFracRatTest.java 2845 2009-11-01 10:44:18Z kredel $ 003 */ 004 005 package edu.jas.ufd; 006 007 008 import java.util.ArrayList; 009 import java.util.List; 010 import java.util.SortedMap; 011 import java.util.TreeMap; 012 013 import junit.framework.Test; 014 import junit.framework.TestCase; 015 import junit.framework.TestSuite; 016 017 import edu.jas.arith.BigRational; 018 import edu.jas.poly.ExpVector; 019 import edu.jas.poly.GenPolynomial; 020 import edu.jas.poly.GenPolynomialRing; 021 import edu.jas.poly.PolyUtil; 022 import edu.jas.poly.TermOrder; 023 024 025 /** 026 * GCD partial fraction with rational coefficients algorithm tests with JUnit. 027 * @author Heinz Kredel. 028 */ 029 030 public class GCDPartFracRatTest 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>GCDPartFracRatTest</CODE> object. 043 * @param name String. 044 */ 045 public GCDPartFracRatTest(String name) { 046 super(name); 047 } 048 049 050 /** 051 */ 052 public static Test suite() { 053 TestSuite suite = new TestSuite(GCDPartFracRatTest.class); 054 return suite; 055 } 056 057 058 //private final static int bitlen = 100; 059 060 GreatestCommonDivisorAbstract<BigRational> ufd; 061 062 063 TermOrder to = new TermOrder(TermOrder.INVLEX); 064 065 066 GenPolynomialRing<BigRational> dfac; 067 068 069 GenPolynomialRing<BigRational> cfac; 070 071 072 GenPolynomialRing<GenPolynomial<BigRational>> rfac; 073 074 075 BigRational mi; 076 077 078 BigRational ai; 079 080 081 BigRational bi; 082 083 084 BigRational ci; 085 086 087 BigRational di; 088 089 090 BigRational ei; 091 092 093 GenPolynomial<BigRational> a; 094 095 096 GenPolynomial<BigRational> b; 097 098 099 GenPolynomial<BigRational> c; 100 101 102 GenPolynomial<BigRational> d; 103 104 105 GenPolynomial<BigRational> e; 106 107 108 GenPolynomial<GenPolynomial<BigRational>> ar; 109 110 111 GenPolynomial<GenPolynomial<BigRational>> br; 112 113 114 GenPolynomial<GenPolynomial<BigRational>> cr; 115 116 117 GenPolynomial<GenPolynomial<BigRational>> dr; 118 119 120 GenPolynomial<GenPolynomial<BigRational>> er; 121 122 123 int rl = 3; 124 125 126 int kl = 2; 127 128 129 int ll = 3; 130 131 132 int el = 3; 133 134 135 float q = 0.25f; 136 137 138 @Override 139 protected void setUp() { 140 a = b = c = d = e = null; 141 ai = bi = ci = di = ei = null; 142 ar = br = cr = dr = er = null; 143 mi = new BigRational(1); 144 ufd = new GreatestCommonDivisorSubres<BigRational>(); 145 String[] vars = ExpVector.STDVARS(rl); 146 String[] cvars = ExpVector.STDVARS(rl - 1); 147 String[] rvars = new String[] { vars[rl - 1] }; 148 dfac = new GenPolynomialRing<BigRational>(mi, rl, to, vars); 149 cfac = new GenPolynomialRing<BigRational>(mi, rl - 1, to, cvars); 150 rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(cfac, 1, to, rvars); 151 //System.out.println("mi = " + mi); 152 } 153 154 155 @Override 156 protected void tearDown() { 157 a = b = c = d = e = null; 158 ai = bi = ci = di = ei = null; 159 ar = br = cr = dr = er = null; 160 mi = null; 161 ufd = null; 162 dfac = null; 163 cfac = null; 164 rfac = null; 165 } 166 167 168 /** 169 * Test base quotioent and remainder. 170 * 171 */ 172 public void testBaseQR() { 173 174 dfac = new GenPolynomialRing<BigRational>(mi, 1, to); 175 176 for (int i = 0; i < 3; i++) { 177 a = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 178 c = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 179 //a = ufd.basePrimitivePart(a).abs(); 180 //c = ufd.basePrimitivePart(c); 181 do { 182 ci = mi.random(kl * (i + 2)); 183 ci = ci.sum(mi.getONE()); 184 } while (ci.isZERO()); 185 186 //System.out.println("a = " + a); 187 //System.out.println("c = " + c); 188 //System.out.println("ci = " + ci); 189 190 if (a.isZERO() || c.isZERO()) { 191 // skip for this turn 192 continue; 193 } 194 assertTrue("length( c" + i + " ) <> 0", c.length() > 0); 195 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 196 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 197 198 b = a.multiply(c); 199 //System.out.println("b = " + b); 200 d = PolyUtil.<BigRational> basePseudoRemainder(b, c); 201 //System.out.println("d = " + d); 202 203 assertTrue("rem(ac,c) == 0", d.isZERO()); 204 205 b = a.multiply(ci); 206 //System.out.println("b = " + b); 207 d = b.divide(ci); 208 //System.out.println("d = " + d); 209 210 assertEquals("a == ac/c", a, d); 211 212 b = a.multiply(c); 213 //System.out.println("b = " + b); 214 d = PolyUtil.<BigRational> basePseudoDivide(b, c); 215 //System.out.println("d = " + d); 216 217 assertEquals("a == ac/c", a, d); 218 219 b = a.multiply(c).sum( dfac.getONE() ); 220 //System.out.println("b = " + b); 221 //System.out.println("c = " + c); 222 GenPolynomial<BigRational>[] qr = PolyUtil.<BigRational> basePseudoQuotientRemainder(b, c); 223 d = qr[0]; 224 e = qr[1]; 225 //System.out.println("d = " + d); 226 //System.out.println("e = " + e); 227 228 e = d.multiply(c).sum(e); 229 //System.out.println("e = " + e); 230 assertEquals("b == b/c + b%c ", b, e); 231 232 } 233 } 234 235 236 /** 237 * Test base extended gcd. 238 * 239 */ 240 public void testBaseExtGcd() { 241 242 dfac = new GenPolynomialRing<BigRational>(mi, 1, to); 243 244 for (int i = 0; i < 3; i++) { 245 a = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 246 b = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 247 c = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 248 //a = ufd.basePrimitivePart(a); 249 //b = ufd.basePrimitivePart(b); 250 //c = ufd.basePrimitivePart(c).abs(); 251 252 //System.out.println("a = " + a); 253 //System.out.println("b = " + b); 254 //System.out.println("c = " + c); 255 256 if (a.isZERO() || b.isZERO() || c.isZERO()) { 257 // skip for this turn 258 continue; 259 } 260 assertTrue("length( c" + i + " ) <> 0", c.length() > 0); 261 //assertTrue(" not isZERO( c"+i+" )", !c.isZERO() ); 262 //assertTrue(" not isONE( c"+i+" )", !c.isONE() ); 263 264 a = a.multiply(c); 265 b = b.multiply(c); 266 267 GenPolynomial<BigRational>[] egcd = ufd.baseExtendedGcd(a, b); 268 d = egcd[0]; 269 e = PolyUtil.<BigRational> basePseudoRemainder(d, c); 270 //System.out.println("d = " + d); 271 assertTrue("c | gcd(ac,bc) " + e, e.isZERO()); 272 273 e = egcd[1].multiply(a).sum( egcd[2].multiply(b) ); 274 assertEquals("gcd(a,b) = s a + t b ", d, e); 275 276 //System.out.println("a = " + a); 277 //System.out.println("b = " + b); 278 //System.out.println("d = " + d); 279 GenPolynomial<BigRational>[] diop = ufd.baseGcdDiophant(a, b, d); 280 e = diop[0].multiply(a).sum( diop[1].multiply(b) ); 281 //System.out.println("e = " + e); 282 assertEquals("d*gcd(a,b) = s a + t b ", d, e); 283 } 284 } 285 286 287 /** 288 * Test base partial fraction. 289 * 290 */ 291 public void testBasePartFrac() { 292 293 dfac = new GenPolynomialRing<BigRational>(mi, 1, to); 294 295 for (int i = 0; i < 3; i++) { 296 a = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 297 b = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 298 c = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 299 //a = dfac.random(kl, ll + 2 * i, el + 2 * i, q); 300 //b = dfac.random(kl, ll + 2 * i, el + 2 * i, q); 301 //c = dfac.random(kl, ll + 2 * i, el + 2 * i, q); 302 //a = ufd.basePrimitivePart(a); 303 //b = ufd.basePrimitivePart(b); 304 //c = ufd.basePrimitivePart(c).abs(); 305 306 if ( b.isZERO() || c.isZERO() ) { 307 // skip for this turn 308 continue; 309 } 310 if ( b.isConstant() || c.isConstant() ) { 311 // skip for this turn 312 continue; 313 } 314 //System.out.println("a = " + a); 315 //System.out.println("b = " + b); 316 //System.out.println("c = " + c); 317 318 // a / (b*c) = a0 + ap/b + as/c 319 GenPolynomial<BigRational> gcd = ufd.baseGcd(b,c); 320 //System.out.println("gcd = " + gcd); 321 if ( !gcd.isONE() ) { 322 b = PolyUtil.<BigRational> basePseudoDivide(b, gcd); 323 c = PolyUtil.<BigRational> basePseudoDivide(c, gcd); 324 } 325 //System.out.println("b = " + b); 326 //System.out.println("c = " + c); 327 328 GenPolynomial<BigRational>[] pf = ufd.basePartialFraction(a, b, c); 329 //System.out.println("a0 = " + pf[0]); 330 //System.out.println("ap = " + pf[1]); 331 //System.out.println("as = " + pf[2]); 332 333 d = pf[0].multiply(b).multiply(c); // a0*b*c 334 //System.out.println("d = " + d); 335 336 e = c.multiply( pf[1] ).sum( b.multiply(pf[2]) ); // ap * b + as * c 337 //System.out.println("e = " + e); 338 339 d = d.sum( e ); // a0*b*c + ap * c + as * b 340 //System.out.println("d = " + d); 341 342 assertEquals("a = a0*b*c + s * c + t * b ", a, d); 343 344 List<GenPolynomial<BigRational>> D = new ArrayList<GenPolynomial<BigRational>>(2); 345 D.add(b); 346 D.add(c); 347 //System.out.println("D = " + D); 348 List<GenPolynomial<BigRational>> F = ufd.basePartialFraction(a, D); 349 //System.out.println("F = " + F.size()); 350 351 boolean t = ufd.isBasePartialFraction(a, D, F); 352 assertTrue("a/D = a0 + sum(fi/di)", t); 353 } 354 } 355 356 357 /** 358 * Test base partial fraction list. 359 * 360 */ 361 public void testBasePartFracList() { 362 363 dfac = new GenPolynomialRing<BigRational>(mi, 1, to); 364 365 for (int i = 0; i < 3; i++) { 366 a = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 367 //System.out.println("a = " + a); 368 369 List<GenPolynomial<BigRational>> D = new ArrayList<GenPolynomial<BigRational>>(); 370 for ( int j = 0; j < i*3; j++ ) { 371 b = dfac.random(kl * (i + 1), ll + i, el + i, q); 372 if ( b.isZERO() || b.isConstant() ) { 373 // skip for this turn 374 continue; 375 } 376 D.add(b); 377 } 378 //System.out.println("D = " + D); 379 D = ufd.coPrime(D); 380 //System.out.println("D = " + D); 381 382 List<GenPolynomial<BigRational>> F = ufd.basePartialFraction(a, D); 383 //System.out.println("F = " + F.size()); 384 385 boolean t = ufd.isBasePartialFraction(a, D, F); 386 assertTrue("a = a0*b*c + s * c + t * b ", t); 387 } 388 } 389 390 391 /** 392 * Test base partial fraction exponent. 393 * 394 */ 395 public void testBasePartFracExponent() { 396 397 dfac = new GenPolynomialRing<BigRational>(mi, 1, to); 398 399 for (int i = 0; i < 3; i++) { 400 a = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 401 //System.out.println("a = " + a); 402 403 b = dfac.random(kl * (i + 1), ll + i, el + i, q); 404 if ( b.isZERO() || b.isConstant() ) { 405 // skip for this turn 406 continue; 407 } 408 //System.out.println("b = " + b); 409 410 List<GenPolynomial<BigRational>> F = ufd.basePartialFraction(a, b, 3); 411 //System.out.println("F = " + F); 412 413 boolean t = ufd.isBasePartialFraction(a, b, 3, F); 414 assertTrue("a/b^e = a0 + sum(ai/p^i) ", t); 415 } 416 } 417 418 419 /** 420 * Test base partial fraction list exponent (squarefree). 421 * 422 */ 423 public void testBasePartFracListExponent() { 424 425 SquarefreeAbstract<BigRational> sqf = SquarefreeFactory.getImplementation(mi); 426 427 dfac = new GenPolynomialRing<BigRational>(mi, 1, to); 428 429 for (int i = 0; i < 3; i++) { 430 a = dfac.random(kl * (i + 2), ll + 2 * i, el + 2 * i, q); 431 //System.out.println("a = " + a); 432 433 List<GenPolynomial<BigRational>> D = new ArrayList<GenPolynomial<BigRational>>(); 434 for ( int j = 0; j < i*3; j++ ) { 435 b = dfac.random(kl, ll + 1 + i, el + i, q); 436 if ( b.isZERO() || b.isConstant() ) { 437 // skip for this turn 438 continue; 439 } 440 D.add(b); 441 } 442 //System.out.println("D = " + D); 443 D = ufd.coPrime(D); 444 //System.out.println("D = " + D); 445 446 SortedMap<GenPolynomial<BigRational>,Long> Ds = new TreeMap<GenPolynomial<BigRational>,Long>(); 447 long j = 1L; 448 for ( GenPolynomial<BigRational> p : D ) { 449 Ds.put(p,j); 450 j++; 451 } 452 //System.out.println("Ds = " + Ds); 453 454 List<List<GenPolynomial<BigRational>>> F = sqf.basePartialFraction(a, Ds); 455 //System.out.println("F = " + F.size()); 456 457 boolean t = sqf.isBasePartialFraction(a, Ds, F); 458 assertTrue("a/prod(b_i^i) = a0 + sum(aij/b_i^j) ", t); 459 } 460 } 461 462 }