001/* 002 * $Id$ 003 */ 004 005package edu.jas.poly; 006 007 008import java.util.ArrayList; 009import java.util.List; 010 011import edu.jas.arith.BigInteger; 012import edu.jas.arith.BigRational; 013import edu.jas.arith.ModInteger; 014import edu.jas.arith.ModIntegerRing; 015 016 017/** 018 * Examples for polynomials usage. 019 * @author Heinz Kredel 020 */ 021 022public class Examples { 023 024 025 /** 026 * main. 027 */ 028 public static void main(String[] args) { 029 //example0(); 030 /* 031 example1(); 032 example2(); 033 example3(); 034 example4(); 035 example5(); 036 */ 037 //example6(); 038 example7(); 039 example7(); 040 //example8(); 041 //example9(); 042 //example10(); 043 //example11(); 044 //example12(); 045 //example13(); 046 } 047 048 049 /** 050 * example0. for PPPJ 2006. 051 */ 052 public static void example0() { 053 BigInteger z = new BigInteger(); 054 055 TermOrder to = new TermOrder(); 056 String[] vars = new String[] { "x1", "x2", "x3" }; 057 GenPolynomialRing<BigInteger> ring; 058 ring = new GenPolynomialRing<BigInteger>(z, 3, to, vars); 059 System.out.println("ring = " + ring); 060 061 GenPolynomial<BigInteger> pol; 062 pol = ring.parse("3 x1^2 x3^4 + 7 x2^5 - 61"); 063 System.out.println("pol = " + pol); 064 System.out.println("pol = " + pol.toString(ring.getVars())); 065 066 GenPolynomial<BigInteger> one; 067 one = ring.parse("1"); 068 System.out.println("one = " + one); 069 System.out.println("one = " + one.toString(ring.getVars())); 070 071 GenPolynomial<BigInteger> p; 072 p = pol.subtract(pol); 073 System.out.println("p = " + p); 074 System.out.println("p = " + p.toString(ring.getVars())); 075 076 p = pol.multiply(pol); 077 System.out.println("p = " + p); 078 System.out.println("p = " + p.toString(ring.getVars())); 079 } 080 081 082 /** 083 * example1. random polynomial with rational coefficients. Q[x_1,...x_7] 084 */ 085 public static void example1() { 086 System.out.println("\n\n example 1"); 087 088 BigRational cfac = new BigRational(); 089 System.out.println("cfac = " + cfac); 090 String[] vars = new String[] { "x1", "x2", "x3", "x4", "x5", "x6", "x7" }; 091 GenPolynomialRing<BigRational> fac; 092 fac = new GenPolynomialRing<BigRational>(cfac, 7, vars); 093 //System.out.println("fac = " + fac); 094 System.out.println("fac = " + fac); 095 096 GenPolynomial<BigRational> a = fac.random(10); 097 System.out.println("a = " + a); 098 } 099 100 101 /** 102 * example2. random polynomial with coefficients of rational polynomials. 103 * Q[x_1,...x_7][y_1,...,y_3] 104 */ 105 public static void example2() { 106 System.out.println("\n\n example 2"); 107 108 BigRational cfac = new BigRational(); 109 System.out.println("cfac = " + cfac); 110 String[] cvars = new String[] { "x1", "x2", "x3", "x4", "x5", "x6", "x7" }; 111 GenPolynomialRing<BigRational> fac; 112 fac = new GenPolynomialRing<BigRational>(cfac, 7, cvars); 113 System.out.println("fac = " + fac); 114 115 String[] vars = new String[] { "y1", "y2", "y3" }; 116 GenPolynomialRing<GenPolynomial<BigRational>> gfac; 117 gfac = new GenPolynomialRing<GenPolynomial<BigRational>>(fac, 3, vars); 118 System.out.println("gfac = " + gfac); 119 120 GenPolynomial<GenPolynomial<BigRational>> a = gfac.random(10); 121 System.out.println("a = " + a); 122 } 123 124 125 /** 126 * example3. random rational algebraic number. Q(alpha) 127 */ 128 public static void example3() { 129 System.out.println("\n\n example 3"); 130 131 BigRational cfac = new BigRational(); 132 System.out.println("cfac = " + cfac); 133 134 String[] vars = new String[] { "alpha" }; 135 GenPolynomialRing<BigRational> mfac; 136 mfac = new GenPolynomialRing<BigRational>(cfac, 1, vars); 137 System.out.println("mfac = " + mfac); 138 139 GenPolynomial<BigRational> modul = mfac.random(8).monic(); 140 // assume !mo.isUnit() 141 System.out.println("modul = " + modul); 142 143 AlgebraicNumberRing<BigRational> fac; 144 fac = new AlgebraicNumberRing<BigRational>(modul); 145 System.out.println("fac = " + fac); 146 147 AlgebraicNumber<BigRational> a = fac.random(15); 148 System.out.println("a = " + a); 149 } 150 151 152 protected static long getPrime() { 153 long prime = 2; //2^60-93; // 2^30-35; //19; knuth (2,390) 154 for (int i = 1; i < 60; i++) { 155 prime *= 2; 156 } 157 prime -= 93; 158 //System.out.println("prime = " + prime); 159 return prime; 160 } 161 162 163 /** 164 * example4. random modular algebraic number. Z_p(alpha) 165 */ 166 public static void example4() { 167 System.out.println("\n\n example 4"); 168 169 long prime = getPrime(); 170 ModIntegerRing cfac = new ModIntegerRing(prime); 171 System.out.println("cfac = " + cfac); 172 173 String[] vars = new String[] { "alpha" }; 174 GenPolynomialRing<ModInteger> mfac; 175 mfac = new GenPolynomialRing<ModInteger>(cfac, 1, vars); 176 System.out.println("mfac = " + mfac); 177 178 GenPolynomial<ModInteger> modul = mfac.random(8).monic(); 179 // assume !modul.isUnit() 180 System.out.println("modul = " + modul); 181 182 AlgebraicNumberRing<ModInteger> fac; 183 fac = new AlgebraicNumberRing<ModInteger>(modul); 184 System.out.println("fac = " + fac); 185 186 AlgebraicNumber<ModInteger> a = fac.random(12); 187 System.out.println("a = " + a); 188 } 189 190 191 /** 192 * example5. random solvable polynomial with rational coefficients. 193 * Q{x_1,...x_6, {x_2 * x_1 = x_1 x_2 +1, ...} } 194 */ 195 public static void example5() { 196 System.out.println("\n\n example 5"); 197 198 BigRational cfac = new BigRational(); 199 System.out.println("cfac = " + cfac); 200 GenSolvablePolynomialRing<BigRational> sfac; 201 sfac = new GenSolvablePolynomialRing<BigRational>(cfac, 6); 202 //System.out.println("sfac = " + sfac); 203 204 RelationGenerator<BigRational> wl = new WeylRelations<BigRational>(); 205 //wl.generate(sfac); 206 sfac.addRelations(wl); 207 System.out.println("sfac = " + sfac); 208 209 GenSolvablePolynomial<BigRational> a = sfac.random(5); 210 System.out.println("a = " + a); 211 System.out.println("a = " + a.toString(sfac.vars)); 212 213 GenSolvablePolynomial<BigRational> b = a.multiply(a); 214 System.out.println("b = " + b); 215 System.out.println("b = " + b.toString(sfac.vars)); 216 217 System.out.println("sfac = " + sfac); 218 } 219 220 221 /** 222 * example6. Fateman benchmark: p = (x+y+z)^20; q = p * (p+1) Z[z,y,x] 223 */ 224 public static void example6() { 225 System.out.println("\n\n example 6"); 226 227 BigInteger cfac = new BigInteger(); 228 System.out.println("cfac = " + cfac); 229 230 TermOrder to = new TermOrder(TermOrder.INVLEX); 231 System.out.println("to = " + to); 232 233 GenPolynomialRing<BigInteger> fac; 234 fac = new GenPolynomialRing<BigInteger>(cfac, 3, to); 235 System.out.println("fac = " + fac); 236 fac.setVars(new String[] { "z", "y", "x" }); 237 System.out.println("fac = " + fac); 238 239 GenPolynomial<BigInteger> x = fac.univariate(0); 240 GenPolynomial<BigInteger> y = fac.univariate(1); 241 GenPolynomial<BigInteger> z = fac.univariate(2); 242 243 System.out.println("x = " + x); 244 System.out.println("x = " + x.toString(fac.vars)); 245 System.out.println("y = " + y); 246 System.out.println("y = " + y.toString(fac.vars)); 247 System.out.println("z = " + z); 248 System.out.println("z = " + z.toString(fac.vars)); 249 250 GenPolynomial<BigInteger> p = x.sum(y).sum(z).sum(fac.getONE()); 251 //BigInteger f = cfac.fromInteger(10000000001L); 252 // p = p.multiply( f ); 253 System.out.println("p = " + p); 254 System.out.println("p = " + p.toString(fac.vars)); 255 256 GenPolynomial<BigInteger> q = p; 257 for (int i = 1; i < 20; i++) { 258 q = q.multiply(p); 259 } 260 //System.out.println("q = " + q.toString( fac.vars ) ); 261 System.out.println("q = " + q.length()); 262 263 GenPolynomial<BigInteger> q1 = q.sum(fac.getONE()); 264 265 GenPolynomial<BigInteger> q2; 266 long t = System.currentTimeMillis(); 267 q2 = q.multiply(q1); 268 t = System.currentTimeMillis() - t; 269 270 System.out.println("q2 = " + q2.length()); 271 System.out.println("time = " + t + " ms"); 272 } 273 274 275 /** 276 * example7. Fateman benchmark: p = (x+y+z)^20; q = p * (p+1) Q[z,y,x] 277 */ 278 public static void example7() { 279 System.out.println("\n\n example 7"); 280 281 BigRational cfac = new BigRational(); 282 System.out.println("cfac = " + cfac); 283 284 TermOrder to = new TermOrder(TermOrder.INVLEX); 285 System.out.println("to = " + to); 286 287 GenPolynomialRing<BigRational> fac; 288 fac = new GenPolynomialRing<BigRational>(cfac, 3, to); 289 System.out.println("fac = " + fac); 290 fac.setVars(new String[] { "z", "y", "x" }); 291 System.out.println("fac = " + fac); 292 293 long mi = 1L; 294 //long mi = Integer.MAX_VALUE; 295 GenPolynomial<BigRational> x = fac.univariate(0, mi); 296 GenPolynomial<BigRational> y = fac.univariate(1, mi); 297 GenPolynomial<BigRational> z = fac.univariate(2, mi); 298 299 // System.out.println("x = " + x); 300 System.out.println("x = " + x.toString(fac.vars)); 301 // System.out.println("y = " + y); 302 System.out.println("y = " + y.toString(fac.vars)); 303 // System.out.println("z = " + z); 304 System.out.println("z = " + z.toString(fac.vars)); 305 306 GenPolynomial<BigRational> p = x.sum(y).sum(z).sum(fac.getONE()); 307 //BigRational f = cfac.fromInteger(10000000001L); 308 // f = f.multiply( f ); 309 //p = p.multiply( f ); 310 // System.out.println("p = " + p); 311 System.out.println("p = " + p.toString(fac.vars)); 312 313 int mpow = 20; 314 System.out.println("mpow = " + mpow); 315 GenPolynomial<BigRational> q = p; 316 for (int i = 1; i < mpow; i++) { 317 q = q.multiply(p); 318 } 319 //System.out.println("q = " + q.toString( fac.vars ) ); 320 System.out.println("len(q) = " + q.length()); 321 System.out.println("deg(q) = " + q.degree()); 322 323 GenPolynomial<BigRational> q1 = q.sum(fac.getONE()); 324 325 GenPolynomial<BigRational> q2; 326 long t = System.currentTimeMillis(); 327 q2 = q.multiply(q1); 328 t = System.currentTimeMillis() - t; 329 330 System.out.println("len(q2) = " + q2.length()); 331 System.out.println("deg(q2) = " + q2.degree()); 332 System.out.println("LeadEV(q2) = " + q2.leadingExpVector()); 333 System.out.println("time = " + t + " ms"); 334 } 335 336 337 /** 338 * example8. Chebyshev polynomials 339 * 340 * T(0) = 1 T(1) = x T(n) = 2x * T(n-1) - T(n-2) 341 */ 342 public static void example8() { 343 int m = 10; 344 BigInteger fac = new BigInteger(); 345 String[] var = new String[] { "x" }; 346 347 GenPolynomialRing<BigInteger> ring = new GenPolynomialRing<BigInteger>(fac, 1, var); 348 349 List<GenPolynomial<BigInteger>> T = new ArrayList<GenPolynomial<BigInteger>>(m); 350 351 GenPolynomial<BigInteger> t, one, x, x2, x2b; 352 353 one = ring.getONE(); 354 x = ring.univariate(0); 355 //x2 = ring.parse("2 x"); 356 //x2a = x.multiply( fac.fromInteger(2) ); 357 x2b = x.multiply(new BigInteger(2)); 358 x2 = x2b; 359 360 T.add(one); 361 T.add(x); 362 for (int n = 2; n < m; n++) { 363 t = x2.multiply(T.get(n - 1)).subtract(T.get(n - 2)); 364 T.add(t); 365 } 366 for (int n = 0 /*m-2*/; n < m; n++) { 367 System.out.println("T[" + n + "] = " + T.get(n)); //.toString(var) ); 368 } 369 } 370 371 372 /** 373 * example9. Legendre polynomials 374 * 375 * P(0) = 1 P(1) = x P(n) = 1/n [ (2n-1) * x * P(n-1) - (n-1) * P(n-2) ] 376 */ 377 // P(n+1) = 1/(n+1) [ (2n+1) * x * P(n) - n * P(n-1) ] 378 public static void example9() { 379 int n = 10; 380 381 BigRational fac = new BigRational(); 382 String[] var = new String[] { "x" }; 383 384 GenPolynomialRing<BigRational> ring = new GenPolynomialRing<BigRational>(fac, 1, var); 385 386 List<GenPolynomial<BigRational>> P = new ArrayList<GenPolynomial<BigRational>>(n); 387 388 GenPolynomial<BigRational> t, one, x, xc; 389 BigRational n21, nn; 390 391 one = ring.getONE(); 392 x = ring.univariate(0); 393 394 P.add(one); 395 P.add(x); 396 for (int i = 2; i < n; i++) { 397 n21 = new BigRational(2 * i - 1); 398 xc = x.multiply(n21); 399 t = xc.multiply(P.get(i - 1)); 400 nn = new BigRational(i - 1); 401 xc = P.get(i - 2).multiply(nn); 402 t = t.subtract(xc); 403 nn = new BigRational(1, i); 404 t = t.multiply(nn); 405 P.add(t); 406 } 407 for (int i = 0; i < n; i++) { 408 System.out.println("P[" + i + "] = " + P.get(i).toString(var)); 409 System.out.println(); 410 } 411 } 412 413 414 /** 415 * example10. Hermite polynomials 416 * 417 * H(0) = 1 H(1) = 2 x H(n) = 2 * x * H(n-1) - 2 * (n-1) * H(n-2) 418 */ 419 // H(n+1) = 2 * x * H(n) - 2 * n * H(n-1) 420 public static void example10() { 421 int n = 100; 422 423 BigInteger fac = new BigInteger(); 424 String[] var = new String[] { "x" }; 425 426 GenPolynomialRing<BigInteger> ring = new GenPolynomialRing<BigInteger>(fac, 1, var); 427 428 List<GenPolynomial<BigInteger>> H = new ArrayList<GenPolynomial<BigInteger>>(n); 429 430 GenPolynomial<BigInteger> t, one, x2, xc, x; 431 BigInteger n2, nn; 432 433 one = ring.getONE(); 434 x = ring.univariate(0); 435 n2 = new BigInteger(2); 436 x2 = x.multiply(n2); 437 H.add(one); 438 H.add(x2); 439 for (int i = 2; i < n; i++) { 440 t = x2.multiply(H.get(i - 1)); 441 nn = new BigInteger(2 * (i - 1)); 442 xc = H.get(i - 2).multiply(nn); 443 t = t.subtract(xc); 444 H.add(t); 445 } 446 for (int i = n - 1; i < n; i++) { 447 System.out.println("H[" + i + "] = " + H.get(i).toString(var)); 448 System.out.println(); 449 } 450 } 451 452 453 /** 454 * example11. degree matrix; 455 * 456 */ 457 @SuppressWarnings("unchecked") 458 public static void example11() { 459 int n = 50; 460 BigRational fac = new BigRational(); 461 GenPolynomialRing<BigRational> ring = new GenPolynomialRing<BigRational>(fac, n); 462 System.out.println("ring = " + ring + "\n"); 463 464 GenPolynomial<BigRational> p = ring.random(5, 3, 6, 0.5f); 465 System.out.println("p = " + p + "\n"); 466 467 List<GenPolynomial<BigInteger>> dem = TermOrderOptimization.<BigRational> degreeMatrix(p); 468 469 System.out.println("dem = " + dem + "\n"); 470 471 List<GenPolynomial<BigRational>> polys = new ArrayList<GenPolynomial<BigRational>>(); 472 polys.add(p); 473 for (int i = 0; i < 5; i++) { 474 polys.add(ring.random(5, 3, 6, 0.1f)); 475 } 476 System.out.println("polys = " + polys + "\n"); 477 478 dem = TermOrderOptimization.<BigRational> degreeMatrix(polys); 479 System.out.println("dem = " + dem + "\n"); 480 481 List<Integer> perm; 482 perm = TermOrderOptimization.optimalPermutation(dem); 483 System.out.println("perm = " + perm + "\n"); 484 485 List<GenPolynomial<BigInteger>> pdem; 486 pdem = TermOrderOptimization.<GenPolynomial<BigInteger>> listPermutation(perm, dem); 487 System.out.println("pdem = " + pdem + "\n"); 488 489 GenPolynomialRing<BigRational> pring; 490 pring = TermOrderOptimization.<BigRational> permutation(perm, ring); 491 System.out.println("ring = " + ring); 492 System.out.println("pring = " + pring + "\n"); 493 494 List<GenPolynomial<BigRational>> ppolys; 495 ppolys = TermOrderOptimization.<BigRational> permutation(perm, pring, polys); 496 System.out.println("ppolys = " + ppolys + "\n"); 497 498 dem = TermOrderOptimization.<BigRational> degreeMatrix(ppolys); 499 //System.out.println("pdem = " + dem + "\n"); 500 501 perm = TermOrderOptimization.optimalPermutation(dem); 502 //System.out.println("pperm = " + perm + "\n"); 503 int i = 0; 504 for (Integer j : perm) { 505 if (i != (int) j) { 506 System.out.println("error = " + i + " != " + j + "\n"); 507 } 508 i++; 509 } 510 511 OptimizedPolynomialList<BigRational> op; 512 op = TermOrderOptimization.<BigRational> optimizeTermOrder(ring, polys); 513 System.out.println("op:\n" + op); 514 if (!op.equals(new PolynomialList<BigRational>(pring, ppolys))) { 515 System.out.println("error = " + "\n" + op); 516 } 517 } 518 519 520 /** 521 * example12. type games. 522 */ 523 public static void example12() { 524 System.out.println("\n\n example 12"); 525 526 BigRational t1 = new BigRational(); 527 System.out.println("t1 = " + t1); 528 529 BigInteger t2 = new BigInteger(); 530 System.out.println("t2 = " + t2); 531 532 System.out.println("t1.isAssignableFrom(t2) = " + t1.getClass().isAssignableFrom(t2.getClass())); 533 System.out.println("t2.isAssignableFrom(t1) = " + t2.getClass().isAssignableFrom(t1.getClass())); 534 535 String[] vars = new String[] { "x1", "x2", "x3" }; 536 GenPolynomialRing<BigInteger> t3 = new GenPolynomialRing<BigInteger>(t2, 3, vars); 537 System.out.println("t3 = " + t3); 538 539 GenSolvablePolynomialRing<BigInteger> t4 = new GenSolvablePolynomialRing<BigInteger>(t2, vars); 540 System.out.println("t4 = " + t4); 541 542 System.out.println("t3.isAssignableFrom(t4) = " + t3.getClass().isAssignableFrom(t4.getClass())); 543 System.out.println("t4.isAssignableFrom(t3) = " + t4.getClass().isAssignableFrom(t3.getClass())); 544 545 GenPolynomialRing<BigRational> t5 = new GenPolynomialRing<BigRational>(t1, 3, vars); 546 System.out.println("t5 = " + t5); 547 548 System.out.println("t3.isAssignableFrom(t5) = " + t3.getClass().isAssignableFrom(t5.getClass())); 549 System.out.println("t5.isAssignableFrom(t3) = " + t5.getClass().isAssignableFrom(t3.getClass())); 550 } 551 552 553 /** 554 * example13. poly parser for strange syntax. 555 */ 556 public static void example13() { 557 System.out.println("\n\n example 13"); 558 TermOrder to = new TermOrder(TermOrder.INVLEX); 559 BigRational cfraction = new BigRational(1); 560 String[] vars = new String[] { "x" }; 561 562 //Scripting.setPrecision(5); 563 564 GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfraction, 1, to, vars); 565 GenPolynomial<BigRational> FF0 = pfac.parse("19(6)/10"); 566 System.out.println("FF0 = " + FF0); 567 FF0 = pfac.parse("19(6)1/10"); 568 System.out.println("FF0 = " + FF0); 569 FF0 = pfac.parse("19 6/10"); 570 System.out.println("FF0 = " + FF0); 571 FF0 = pfac.parse("19*6/10"); 572 System.out.println("FF0 = " + FF0); 573 FF0 = pfac.parse("19+6/10"); 574 System.out.println("FF0 = " + FF0); 575 FF0 = pfac.parse("(x).2"); 576 System.out.println("FF0 = " + FF0); 577 FF0 = pfac.parse("4.0/9.0"); 578 System.out.println("FF0 = " + FF0); 579 FF0 = pfac.parse("4/9.0"); 580 System.out.println("FF0 = " + FF0); 581 FF0 = pfac.parse("4.0/9"); 582 System.out.println("FF0 = " + FF0); 583 FF0 = pfac.parse("-4.0/9"); 584 System.out.println("FF0 = " + FF0); 585 } 586}