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}