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}