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}