001    /*
002     * $Id: Examples.java 1976 2008-08-03 09:56:01Z kredel $
003     */
004    
005    package edu.jas.poly;
006    
007    import java.util.ArrayList;
008    //import java.util.Arrays;
009    import java.util.List;
010    
011    import edu.jas.arith.BigRational;
012    import edu.jas.arith.BigInteger;
013    import edu.jas.arith.ModInteger;
014    import edu.jas.arith.ModIntegerRing;
015    
016    /**
017     * Examples for polynomials usage.
018     * @author Heinz Kredel.
019     */
020    
021    public class Examples {
022    
023    /**
024     * main.
025     */
026       public static void main (String[] args) {
027           //example0();
028           /*
029           example1();
030           example2();
031           example3();
032           example4();
033           example5();
034           */
035           //example6();
036           example7();
037           example7();
038           //example8();
039           //example9();
040           //example10();
041           //example11();
042           //example12();
043       }
044    
045    
046    /**
047     * example0.
048     * for PPPJ 2006.
049     */
050    public static void example0() {
051            BigInteger z = new BigInteger();
052    
053            TermOrder to = new TermOrder();
054            String[] vars = new String[] { "x1", "x2", "x3" };
055            GenPolynomialRing<BigInteger> ring;
056            ring = new GenPolynomialRing<BigInteger>(z,3,to,vars);
057            System.out.println("ring = " + ring);
058    
059            GenPolynomial<BigInteger> pol;
060            pol = ring.parse( "3 x1^2 x3^4 + 7 x2^5 - 61" );
061            System.out.println("pol = " + pol);
062            System.out.println("pol = " + pol.toString(ring.getVars()));
063    
064            GenPolynomial<BigInteger> one;
065            one = ring.parse( "1" );
066            System.out.println("one = " + one);
067            System.out.println("one = " + one.toString(ring.getVars()));
068    
069            GenPolynomial<BigInteger> p;
070            p = pol.subtract(pol);
071            System.out.println("p = " + p);
072            System.out.println("p = " + p.toString(ring.getVars()));
073    
074            p = pol.multiply(pol);
075            System.out.println("p = " + p);
076            System.out.println("p = " + p.toString(ring.getVars()));
077    }
078    
079    
080    /**
081     * example1.
082     * random polynomial with rational coefficients.
083     * 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           GenPolynomialRing<BigRational> fac;
091                    fac = new GenPolynomialRing<BigRational>(cfac,7);
092           //System.out.println("fac = " + fac);
093           System.out.println("fac = " + fac);
094    
095           GenPolynomial<BigRational> a = fac.random(10);
096           System.out.println("a = " + a);
097    }
098    
099    
100    /**
101     * example2.
102     * 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.
125     * random rational algebraic number.
126     * 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           GenPolynomialRing<BigRational> mfac;
135              mfac = new GenPolynomialRing<BigRational>( cfac, 1 );
136           System.out.println("mfac = " + mfac);
137    
138           GenPolynomial<BigRational> modul = mfac.random(8).monic();
139              // assume !mo.isUnit()
140           System.out.println("modul = " + modul);
141    
142           AlgebraicNumberRing<BigRational> fac;
143              fac = new AlgebraicNumberRing<BigRational>( modul );
144           System.out.println("fac = " + fac);
145    
146           AlgebraicNumber< BigRational > a = fac.random(15);
147           System.out.println("a = " + a);
148    }
149    
150       protected static long getPrime() {
151           long prime = 2; //2^60-93; // 2^30-35; //19; knuth (2,390)
152           for ( int i = 1; i < 60; i++ ) {
153               prime *= 2;
154           }
155           prime -= 93;
156           //System.out.println("prime = " + prime);
157           return prime;
158       }
159    
160    
161    /**
162     * example4.
163     * random modular algebraic number.
164     * 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           GenPolynomialRing<ModInteger> mfac;
174              mfac = new GenPolynomialRing<ModInteger>( cfac, 1 );
175           System.out.println("mfac = " + mfac);
176    
177           GenPolynomial<ModInteger> modul = mfac.random(8).monic();
178              // assume !modul.isUnit()
179           System.out.println("modul = " + modul);
180    
181           AlgebraicNumberRing<ModInteger> fac;
182              fac = new AlgebraicNumberRing<ModInteger>( modul );
183           System.out.println("fac = " + fac);
184    
185           AlgebraicNumber< ModInteger > a = fac.random(12);
186           System.out.println("a = " + a);
187    }
188    
189    
190    /**
191     * example5.
192     * 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           WeylRelations<BigRational> wl = new WeylRelations<BigRational>(sfac);
205           wl.generate();
206           System.out.println("sfac = " + sfac);
207    
208           GenSolvablePolynomial<BigRational> a = sfac.random(5);
209           System.out.println("a = " + a);
210           System.out.println("a = " + a.toString( sfac.vars ) );
211    
212           GenSolvablePolynomial<BigRational> b = a.multiply(a);
213           System.out.println("b = " + b);
214           System.out.println("b = " + b.toString( sfac.vars ) );
215    
216           System.out.println("sfac = " + sfac);
217    }
218    
219    
220    /**
221     * example6.
222     * Fateman benchmark: p = (x+y+z)^20; q = p * (p+1)
223     * 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.
278     * Fateman benchmark: p = (x+y+z)^20; q = p * (p+1)
279     * Q[z,y,x]
280     */
281    public static void example7() {
282           System.out.println("\n\n example 7");
283    
284           BigRational cfac = new BigRational();
285           System.out.println("cfac = " + cfac);
286    
287           TermOrder to = new TermOrder( TermOrder.INVLEX );
288           System.out.println("to   = " + to);
289    
290           GenPolynomialRing<BigRational> fac;
291           fac = new GenPolynomialRing<BigRational>(cfac,3,to);
292           System.out.println("fac = " + fac);
293                    fac.setVars( new String[]{ "z", "y", "x" } );
294           System.out.println("fac = " + fac);
295    
296           long mi = 1L;
297           //long mi = Integer.MAX_VALUE;
298           GenPolynomial<BigRational> x = fac.univariate(0,mi);
299           GenPolynomial<BigRational> y = fac.univariate(1,mi);
300           GenPolynomial<BigRational> z = fac.univariate(2,mi);
301    
302           // System.out.println("x = " + x);
303           System.out.println("x = " + x.toString( fac.vars ) );
304           // System.out.println("y = " + y);
305           System.out.println("y = " + y.toString( fac.vars ) );
306           // System.out.println("z = " + z);
307           System.out.println("z = " + z.toString( fac.vars ) );
308    
309           GenPolynomial<BigRational> p = x.sum(y).sum(z).sum( fac.getONE());
310           BigRational f = cfac.fromInteger(10000000001L);
311               //f = f.multiply( f );
312           //p = p.multiply( f );
313           // System.out.println("p = " + p);
314           System.out.println("p = " + p.toString( fac.vars ) );
315    
316           int mpow = 20;
317           System.out.println("mpow = " + mpow);
318           GenPolynomial<BigRational> q = p;
319           for ( int i = 1; i < mpow; i++ ) {
320               q = q.multiply(p);
321           }
322           //System.out.println("q = " + q.toString( fac.vars ) );
323           System.out.println("len(q) = " + q.length());
324           System.out.println("deg(q) = " + q.degree());
325    
326           GenPolynomial<BigRational> q1 = q.sum( fac.getONE() );
327    
328           GenPolynomial<BigRational> q2;
329           long t = System.currentTimeMillis();
330           q2 = q.multiply(q1); 
331           t = System.currentTimeMillis() - t;
332    
333           System.out.println("len(q2)    = " + q2.length());
334           System.out.println("deg(q2)    = " + q2.degree());
335           System.out.println("LeadEV(q2) = " + q2.leadingExpVector());
336           System.out.println("time       = " + t + " ms");
337    }
338    
339    
340    /**
341     * example8.
342     * Chebyshev polynomials
343     *
344     *  T(0) = 1
345     *  T(1) = x
346     *  T(n) = 2x * T(n-1) - T(n-2)
347     */
348    public static void example8() {
349        int m = 10;
350        BigInteger fac = new BigInteger();
351        String[] var = new String[]{ "x" };
352    
353        GenPolynomialRing<BigInteger> ring
354            = new GenPolynomialRing<BigInteger>(fac,1,var);
355    
356        List<GenPolynomial<BigInteger>> T 
357           = new ArrayList<GenPolynomial<BigInteger>>(m);
358    
359        GenPolynomial<BigInteger> t, one, x, x2, x2a, x2b;
360    
361        one = ring.getONE();
362        x   = ring.univariate(0);
363        x2  = ring.parse("2 x");
364        x2a = x.multiply( fac.fromInteger(2) );
365        x2b = x.multiply( new BigInteger(2) );
366        x2 = x2b;
367    
368        T.add( one );
369        T.add( x );
370        for ( int n = 2; n < m; n++ ) {
371            t = x2.multiply( T.get(n-1) ).subtract( T.get(n-2) );
372            T.add( t );
373        }
374        for ( int n = 0 /*m-2*/; n < m; n++ ) {
375            System.out.println("T["+n+"] = " + T.get(n) ); //.toString(var) );
376        }
377    }
378    
379    
380    /**
381     * example9.
382     * Legendre polynomials
383     *
384     *  P(0) = 1
385     *  P(1) = x
386     *  P(n) = 1/n [ (2n-1) * x * P(n-1) - (n-1) * P(n-2) ]
387     */
388     // P(n+1) = 1/(n+1) [ (2n+1) * x * P(n) - n * P(n-1) ]
389    public static void example9() {
390        int n = 10;
391    
392        BigRational fac = new BigRational();
393        String[] var = new String[]{ "x" };
394    
395        GenPolynomialRing<BigRational> ring
396            = new GenPolynomialRing<BigRational>(fac,1,var);
397    
398        List<GenPolynomial<BigRational>> P 
399           = new ArrayList<GenPolynomial<BigRational>>(n);
400    
401        GenPolynomial<BigRational> t, one, x, xc, xn;
402        BigRational n21, nn;
403    
404        one = ring.getONE();
405        x   = ring.univariate(0);
406    
407        P.add( one );
408        P.add( x );
409        for ( int i = 2; i < n; i++ ) {
410            n21 = new BigRational( 2*i-1 );
411            xc = x.multiply( n21 );
412            t = xc.multiply( P.get(i-1) );
413            nn = new BigRational( i-1 );
414            xc = P.get(i-2).multiply( nn );
415            t = t.subtract( xc );
416            nn = new BigRational(1,i);
417            t = t.multiply( nn );
418            P.add( t );
419        }
420        for ( int i = 0; i < n; i++ ) {
421            System.out.println("P["+i+"] = " + P.get(i).toString(var) );
422            System.out.println();
423        }
424    }
425    
426    
427    /**
428     * example10.
429     * Hermite polynomials
430     *
431     *  H(0) = 1
432     *  H(1) = 2 x
433     *  H(n) = 2 * x * H(n-1) - 2 * (n-1) * H(n-2)
434     */
435     // H(n+1) = 2 * x * H(n) - 2 * n * H(n-1)
436    public static void example10() {
437        int n = 100;
438    
439        BigInteger fac = new BigInteger();
440        String[] var = new String[]{ "x" };
441    
442        GenPolynomialRing<BigInteger> ring
443            = new GenPolynomialRing<BigInteger>(fac,1,var);
444    
445        List<GenPolynomial<BigInteger>> H 
446           = new ArrayList<GenPolynomial<BigInteger>>(n);
447    
448        GenPolynomial<BigInteger> t, one, x2, xc, x;
449        BigInteger n2, nn;
450    
451        one = ring.getONE();
452        x   = ring.univariate(0);
453        n2 = new BigInteger(2);
454        x2 = x.multiply( n2 );
455        H.add( one );
456        H.add( x2 );
457        for ( int i = 2; i < n; i++ ) {
458            t = x2.multiply( H.get(i-1) );
459            nn = new BigInteger( 2*(i-1) );
460            xc = H.get(i-2).multiply( nn );
461            t = t.subtract( xc );
462            H.add( t );
463        }
464        for ( int i = n-1; i < n; i++ ) {
465            System.out.println("H["+i+"] = " + H.get(i).toString(var) );
466            System.out.println();
467        }
468    }
469    
470    
471    /**
472     * example11.
473     * degree matrix;
474     *
475     */
476    public static void example11() {
477        int n = 50;
478        BigRational fac = new BigRational();
479        GenPolynomialRing<BigRational> ring
480               = new GenPolynomialRing<BigRational>(fac,n);
481        System.out.println("ring = " + ring + "\n");
482    
483        GenPolynomial<BigRational> p = ring.random(5,3,6,0.5f);
484        System.out.println("p = " + p + "\n");
485    
486        List<GenPolynomial<BigInteger>> dem 
487            = TermOrderOptimization.<BigRational>degreeMatrix( p );
488    
489        System.out.println("dem = " + dem + "\n");
490    
491        List<GenPolynomial<BigRational>> polys 
492            = new ArrayList<GenPolynomial<BigRational>>();
493        polys.add( p );
494        for ( int i = 0; i < 5; i++ ) {
495            polys.add( ring.random(5,3,6,0.1f) );
496        }
497        System.out.println("polys = " + polys + "\n");
498    
499        dem = TermOrderOptimization.<BigRational>degreeMatrix( polys );
500        System.out.println("dem = " + dem + "\n");
501    
502        List<Integer> perm;
503        perm = TermOrderOptimization.optimalPermutation( dem );
504        System.out.println("perm = " + perm + "\n");
505    
506        List<GenPolynomial<BigInteger>> pdem; 
507        pdem = TermOrderOptimization.<GenPolynomial<BigInteger>>listPermutation( perm, dem );
508        System.out.println("pdem = " + pdem + "\n");
509    
510        GenPolynomialRing<BigRational> pring;
511        pring = TermOrderOptimization.<BigRational>permutation( perm, ring );
512        System.out.println("ring  = " + ring);
513        System.out.println("pring = " + pring + "\n");
514    
515        List<GenPolynomial<BigRational>> ppolys;
516        ppolys = TermOrderOptimization.<BigRational>permutation( perm, pring, polys );
517        System.out.println("ppolys = " + ppolys + "\n");
518    
519        dem = TermOrderOptimization.<BigRational>degreeMatrix( ppolys );
520        //System.out.println("pdem = " + dem + "\n");
521    
522        perm = TermOrderOptimization.optimalPermutation( dem );
523        //System.out.println("pperm = " + perm + "\n");
524        int i = 0;
525        for ( Integer j : perm ) {
526            if ( i != (int)j ) {
527               System.out.println("error = " + i + " != " + j + "\n");
528            }
529            i++;
530        }
531    
532        OptimizedPolynomialList<BigRational> op;
533        op = TermOrderOptimization.<BigRational>optimizeTermOrder( ring, polys );
534        System.out.println("op:\n" + op);
535        if ( ! op.equals( new PolynomialList<BigRational>(pring,ppolys) ) ) {
536           System.out.println("error = " + "\n" + op);
537        }
538    }
539    
540    
541    /**
542     * example12.
543     * type games.
544     */
545    public static void example12() {
546           System.out.println("\n\n example 12");
547    
548           BigRational t1 = new BigRational();
549           System.out.println("t1 = " + t1);
550    
551           BigInteger t2 = new BigInteger();
552           System.out.println("t2 = " + t2);
553    
554           System.out.println("t1.isAssignableFrom(t2) = " 
555                + t1.getClass().isAssignableFrom(t2.getClass()));
556           System.out.println("t2.isAssignableFrom(t1) = " 
557                + t2.getClass().isAssignableFrom(t1.getClass()));
558    
559           GenPolynomialRing<BigInteger> t3 
560              = new GenPolynomialRing<BigInteger>(t2,3);
561           System.out.println("t3 = " + t3);
562    
563           GenSolvablePolynomialRing<BigInteger> t4 
564              = new GenSolvablePolynomialRing<BigInteger>(t2,3);
565           System.out.println("t4 = " + t4);
566    
567           System.out.println("t3.isAssignableFrom(t4) = " 
568                + t3.getClass().isAssignableFrom(t4.getClass()));
569           System.out.println("t4.isAssignableFrom(t3) = " 
570                + t4.getClass().isAssignableFrom(t3.getClass()));
571    
572    
573           GenPolynomialRing<BigRational> t5 
574              = new GenPolynomialRing<BigRational>(t1,3);
575           System.out.println("t5 = " + t5);
576    
577           System.out.println("t3.isAssignableFrom(t5) = " 
578                + t3.getClass().isAssignableFrom(t5.getClass()));
579           System.out.println("t5.isAssignableFrom(t3) = " 
580                + t5.getClass().isAssignableFrom(t3.getClass()));
581    }
582    
583    }