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