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