001/*
002 * $Id$
003 */
004
005package edu.jas.ps;
006
007import java.util.List;
008
009import edu.jas.arith.BigComplex;
010import edu.jas.arith.BigDecimal;
011import edu.jas.arith.BigInteger;
012import edu.jas.arith.BigRational;
013import edu.jas.poly.GenPolynomial;
014import edu.jas.poly.GenPolynomialRing;
015import edu.jas.structure.BinaryFunctor;
016import edu.jas.structure.RingElem;
017import edu.jas.structure.RingFactory;
018import edu.jas.structure.Selector;
019import edu.jas.structure.UnaryFunctor;
020
021
022/**
023 * Examples for univariate power series implementations.
024 * @author Heinz Kredel
025 */
026
027public class Examples {
028
029
030    public static void main(String[] args) {
031        example2();
032        example4();
033        example6();
034        example8();
035        example9();
036        example10();
037        example11();
038        example1();
039        example3();
040        example5();
041        example7();
042        if ( args.length > 0 ) {
043            example12();
044        }
045        example13();
046        example14();
047    }
048
049
050    static UnivPowerSeries<BigInteger> integersFrom(final int start) {
051        UnivPowerSeriesRing<BigInteger> pfac = new UnivPowerSeriesRing<BigInteger>(new BigInteger());
052        return new UnivPowerSeries<BigInteger>(pfac, new Coefficients<BigInteger>() {
053
054
055            @Override
056            public BigInteger generate(int i) {
057                return new BigInteger(start + i);
058            }
059        });
060    }
061
062
063    //----------------------
064
065
066    static class Sum<C extends RingElem<C>> implements BinaryFunctor<C, C, C> {
067
068
069        public C eval(C c1, C c2) {
070            return c1.sum(c2);
071        }
072    }
073
074
075    static class Odds<C extends RingElem<C>> implements Selector<C> {
076
077
078        C two;
079
080
081        RingFactory<C> fac;
082
083
084        public Odds(RingFactory<C> fac) {
085            this.fac = fac;
086            two = this.fac.fromInteger(2);
087            //System.out.println("two = " + two);
088        }
089
090
091        public boolean select(C c) {
092            //System.out.print("c = " + c);
093            if (c.remainder(two).isONE()) {
094                //System.out.println(" odd");
095                return true;
096            }
097            //System.out.println(" even");
098            return false;
099        }
100    }
101
102
103    //----------------------
104
105
106    public static void example1() {
107        UnivPowerSeries<BigInteger> integers = integersFrom(0);
108
109        BigInteger e = new BigInteger(1);
110        BigInteger v = integers.evaluate(e);
111        System.out.println("integers(" + e + ") = " + v);
112        e = new BigInteger(0);
113        v = integers.evaluate(e);
114        System.out.println("integers(" + e + ") = " + v);
115        e = new BigInteger(2);
116        v = integers.evaluate(e);
117        System.out.println("integers(" + e + ") = " + v);
118    }
119
120
121    public static void example2() {
122        UnivPowerSeries<BigInteger> integers = integersFrom(0);
123
124        System.out.print("integer coefficients = ");
125        UnivPowerSeries<BigInteger> s = integers;
126        for (int i = 0; i < 20; i++) {
127            BigInteger c = s.leadingCoefficient();
128            System.out.print(c.toString() + ", ");
129            s = s.reductum();
130        }
131        System.out.println("...");
132    }
133
134
135    public static void example3() {
136        RingFactory<BigInteger> fac = new BigInteger(1);
137        UnivPowerSeriesRing<BigInteger> ups = new UnivPowerSeriesRing<BigInteger>(fac);
138        System.out.println("ups = " + ups);
139        System.out.println("ups.isCommutative() = " + ups.isCommutative());
140        System.out.println("ups.isAssociative() = " + ups.isAssociative());
141        System.out.println("ups.isField()       = " + ups.isField());
142
143        System.out.println("ups.getZERO()       = " + ups.getZERO());
144        System.out.println("ups.getONE()        = " + ups.getONE());
145
146        UnivPowerSeries<BigInteger> rnd = ups.random();
147        System.out.println("rnd = " + rnd);
148        System.out.println("rnd = " + rnd);
149        System.out.println("rnd.isUnit()       = " + rnd.isUnit());
150    }
151
152
153    public static void example4() {
154        UnivPowerSeries<BigInteger> integers = integersFrom(0);
155        System.out.println("integers = " + integers);
156    }
157
158
159    public static void example6() {
160        UnivPowerSeriesRing<BigInteger> pfac = new UnivPowerSeriesRing<BigInteger>(new BigInteger());
161        UnivPowerSeries<BigInteger> integers;
162        integers = pfac.fixPoint(new UnivPowerSeriesMap<BigInteger>() {
163
164
165            public UnivPowerSeries<BigInteger> map(UnivPowerSeries<BigInteger> ps) {
166                return ps.map(new UnaryFunctor<BigInteger, BigInteger>() {
167
168
169                    public BigInteger eval(BigInteger s) {
170                        return s.sum(new BigInteger(1));
171                    }
172                }).prepend(new BigInteger(0));
173            }
174        });
175        System.out.println("integers1 = " + integers);
176        System.out.println("integers2 = " + integers);
177    }
178
179
180    public static void example8() {
181        final BigInteger z = new BigInteger(0);
182        final BigInteger one = new BigInteger(1);
183        UnivPowerSeriesRing<BigInteger> pfac = new UnivPowerSeriesRing<BigInteger>(z);
184        UnivPowerSeries<BigInteger> fibs;
185        fibs = pfac.fixPoint(new UnivPowerSeriesMap<BigInteger>() {
186
187
188            public UnivPowerSeries<BigInteger> map(UnivPowerSeries<BigInteger> ps) {
189                return ps.zip(new Sum<BigInteger>(), ps.prepend(one)).prepend(z);
190            }
191        });
192        System.out.println("fibs1 = " + fibs.toString(/*20*/));
193        System.out.println("fibs2 = " + fibs.toString(/*20*/));
194    }
195
196
197    public static void example9() {
198        UnivPowerSeries<BigInteger> integers = integersFrom(0);
199        System.out.println("      integers = " + integers);
200        UnivPowerSeries<BigInteger> doubleintegers = integers.sum(integers);
201        System.out.println("doubleintegers = " + doubleintegers);
202        UnivPowerSeries<BigInteger> nulls = integers.subtract(integers);
203        System.out.println("null  integers = " + nulls);
204        doubleintegers = integers.multiply(new BigInteger(2));
205        System.out.println("doubleintegers = " + doubleintegers);
206        nulls = integers.multiply(new BigInteger(0));
207        System.out.println("null  integers = " + nulls);
208        UnivPowerSeries<BigInteger> odds = integers.select(new Odds<BigInteger>(new BigInteger()));
209        System.out.println("odd   integers = " + odds);
210    }
211
212
213    public static void example10() {
214        final BigInteger fac = new BigInteger();
215        UnivPowerSeriesRing<BigInteger> pfac = new UnivPowerSeriesRing<BigInteger>(fac);
216        UnivPowerSeries<BigInteger> integers = integersFrom(0);
217        System.out.println("      integers = " + integers);
218        UnivPowerSeries<BigInteger> ONE = new UnivPowerSeries<BigInteger>(pfac,
219                new Coefficients<BigInteger>() {
220
221
222                    @Override
223                    public BigInteger generate(int i) {
224                        if (i == 0) {
225                            return fac.getONE();
226                        }
227                        return fac.getZERO();
228                    }
229                }//, null
230        );
231        System.out.println("ONE  = " + ONE);
232        UnivPowerSeries<BigInteger> ZERO = new UnivPowerSeries<BigInteger>(pfac,
233                new Coefficients<BigInteger>() {
234
235
236                    @Override
237                    public BigInteger generate(int i) {
238                        return fac.getZERO();
239                    }
240                }//, null
241        );
242        System.out.println("ZERO = " + ZERO);
243        UnivPowerSeries<BigInteger> ints = integers.multiply(ONE);
244        System.out.println("integers       = " + ints);
245        UnivPowerSeries<BigInteger> nulls = integers.multiply(ZERO);
246        System.out.println("null  integers = " + nulls);
247        UnivPowerSeries<BigInteger> nints = integers.negate();
248        System.out.println("-integers      = " + nints);
249        UnivPowerSeries<BigInteger> one = ONE.multiply(ONE);
250        System.out.println("integers one   = " + one);
251        UnivPowerSeries<BigInteger> ints2 = integers.multiply(integers);
252        System.out.println("integers 2     = " + ints2);
253        UnivPowerSeries<BigInteger> inv1 = ONE.inverse();
254        System.out.println("integers inv1  = " + inv1);
255        UnivPowerSeries<BigInteger> intr = integers.reductum();
256        System.out.println("integers intr  = " + intr);
257        UnivPowerSeries<BigInteger> ints2inv = ONE.sum(ZERO).inverse();
258        System.out.println("integers ints2inv = " + ints2inv);
259        UnivPowerSeries<BigInteger> one1 = ints2.multiply(ints2inv);
260        System.out.println("integers one1  = " + one1);
261        UnivPowerSeries<BigInteger> ii = ints2inv.inverse();
262        System.out.println("integers ii    = " + ii);
263        UnivPowerSeries<BigInteger> rem = integers.subtract(integers.divide(ints2).multiply(ints2));
264        System.out.println("integers rem   = " + rem);
265    }
266
267
268    public static void example11() {
269        //final BigInteger fac = new BigInteger();
270        UnivPowerSeries<BigInteger> integers = integersFrom(0);
271        System.out.println("      integers = " + integers);
272        UnivPowerSeries<BigInteger> int2 = integers.multiply(new BigInteger(2));
273        System.out.println("    2*integers = " + int2);
274        System.out.println("integers < 2*integers  = " + integers.compareTo(int2));
275        System.out.println("2*integers > integers  = " + int2.compareTo(integers));
276        System.out.println("2*integers == integers = " + int2.equals(integers));
277        System.out.println("integers == integers   = " + integers.equals(integers.copy()));
278        System.out.println("integers.hashCode()    = " + integers.hashCode());
279    }
280
281
282    public static void example5() {
283        //final BigInteger fac = new BigInteger();
284        //UnivPowerSeriesRing<BigInteger> pfac = new UnivPowerSeriesRing<BigInteger>(fac);
285        UnivPowerSeries<BigInteger> integers = integersFrom(0);
286        System.out.println("      integers = " + integers);
287        UnivPowerSeries<BigInteger> ints2 = integers.multiply(integers);
288        System.out.println("integers 2     = " + ints2);
289
290        UnivPowerSeries<BigInteger> q1 = ints2.divide(integers);
291        System.out.println("q1             = " + q1);
292        UnivPowerSeries<BigInteger> q2 = integers.divide(ints2);
293        System.out.println("q2             = " + q2);
294
295        UnivPowerSeries<BigInteger> r1 = ints2.remainder(integers);
296        System.out.println("r1             = " + r1);
297        UnivPowerSeries<BigInteger> r2 = integers.remainder(ints2);
298        System.out.println("r2             = " + r2);
299
300        UnivPowerSeries<BigInteger> qr1 = q1.multiply(integers).sum(r1);
301        System.out.println("qr1            = " + qr1);
302        UnivPowerSeries<BigInteger> qr2 = q2.multiply(ints2).sum(r2);
303        System.out.println("qr2            = " + qr2);
304
305        System.out.println("sign(qr1-ints2) = " + qr1.compareTo(ints2));
306        System.out.println("sign(qr2-integers) = " + qr2.compareTo(integers));
307
308        UnivPowerSeries<BigInteger> g = ints2.gcd(integers);
309        System.out.println("g               = " + g);
310    }
311
312
313    public static void example7() {
314        final BigRational fac = new BigRational();
315        final UnivPowerSeriesRing<BigRational> pfac = new UnivPowerSeriesRing<BigRational>(fac, 11, "y");
316        UnivPowerSeries<BigRational> exp = pfac.fixPoint(new UnivPowerSeriesMap<BigRational>() {
317
318
319            public UnivPowerSeries<BigRational> map(UnivPowerSeries<BigRational> e) {
320                return e.integrate(fac.getONE());
321            }
322        });
323        System.out.println("exp = " + exp);
324        UnivPowerSeries<BigRational> tan = pfac.fixPoint(new UnivPowerSeriesMap<BigRational>() {
325
326
327            public UnivPowerSeries<BigRational> map(UnivPowerSeries<BigRational> t) {
328                return t.multiply(t).sum(pfac.getONE()).integrate(fac.getZERO());
329            }
330        });
331        System.out.println("tan = " + tan);
332        UnivPowerSeries<BigRational> sin = new UnivPowerSeries<BigRational>(pfac,
333                new Coefficients<BigRational>() {
334
335
336                    @Override
337                    public BigRational generate(int i) {
338                        BigRational c;
339                        if (i == 0) {
340                            c = fac.getZERO();
341                        } else if (i == 1) {
342                            c = fac.getONE();
343                        } else {
344                            c = get(i - 2).negate();
345                            c = c.divide(fac.fromInteger(i)).divide(fac.fromInteger(i - 1));
346                        }
347                        return c;
348                    }
349                });
350        System.out.println("sin = " + sin);
351        UnivPowerSeries<BigRational> sin1 = pfac.fixPoint(new UnivPowerSeriesMap<BigRational>() {
352
353
354            public UnivPowerSeries<BigRational> map(UnivPowerSeries<BigRational> e) {
355                return e.negate().integrate(fac.getONE()).integrate(fac.getZERO());
356            }
357        });
358        System.out.println("sin1 = " + sin1);
359
360        UnivPowerSeries<BigRational> cos = new UnivPowerSeries<BigRational>(pfac,
361                new Coefficients<BigRational>() {
362
363
364                    @Override
365                    public BigRational generate(int i) {
366                        BigRational c;
367                        if (i == 0) {
368                            c = fac.getONE();
369                        } else if (i == 1) {
370                            c = fac.getZERO();
371                        } else {
372                            c = get(i - 2).negate();
373                            c = c.divide(fac.fromInteger(i)).divide(fac.fromInteger(i - 1));
374                        }
375                        return c;
376                    }
377                });
378        System.out.println("cos = " + cos);
379        UnivPowerSeries<BigRational> cos1 = pfac.fixPoint(new UnivPowerSeriesMap<BigRational>() {
380
381
382            public UnivPowerSeries<BigRational> map(UnivPowerSeries<BigRational> e) {
383                return e.negate().integrate(fac.getZERO()).integrate(fac.getONE());
384            }
385        });
386        System.out.println("cos1 = " + cos1);
387
388        UnivPowerSeries<BigRational> cos2 = pfac.solveODE(sin1.negate(), fac.getONE());
389        System.out.println("cos2 = " + cos2);
390
391        UnivPowerSeries<BigRational> sin2 = pfac.solveODE(cos1, fac.getZERO());
392        System.out.println("sin2 = " + sin2);
393
394        UnivPowerSeries<BigRational> sinh = new UnivPowerSeries<BigRational>(pfac,
395                new Coefficients<BigRational>() {
396
397
398                    @Override
399                    public BigRational generate(int i) {
400                        BigRational c;
401                        if (i == 0) {
402                            c = fac.getZERO();
403                        } else if (i == 1) {
404                            c = fac.getONE();
405                        } else {
406                            c = get(i - 2);
407                            c = c.divide(fac.fromInteger(i)).divide(fac.fromInteger(i - 1));
408                        }
409                        return c;
410                    }
411                });
412        System.out.println("sinh = " + sinh);
413        UnivPowerSeries<BigRational> cosh = new UnivPowerSeries<BigRational>(pfac,
414                new Coefficients<BigRational>() {
415
416
417                    @Override
418                    public BigRational generate(int i) {
419                        BigRational c;
420                        if (i == 0) {
421                            c = fac.getONE();
422                        } else if (i == 1) {
423                            c = fac.getZERO();
424                        } else {
425                            c = get(i - 2);
426                            c = c.divide(fac.fromInteger(i)).divide(fac.fromInteger(i - 1));
427                        }
428                        return c;
429                    }
430                }//, null
431        );
432        System.out.println("cosh = " + cosh);
433
434        UnivPowerSeries<BigRational> sinhcosh = sinh.sum(cosh);
435        System.out.println("sinh+cosh = " + sinhcosh);
436        System.out.println("sinh+cosh == exp: " + sinhcosh.equals(exp));
437    }
438
439
440    public static void example12() {
441        final BigComplex fac = new BigComplex();
442        final BigComplex I = BigComplex.I;
443        final UnivPowerSeriesRing<BigComplex> pfac = new UnivPowerSeriesRing<BigComplex>(fac);
444        UnivPowerSeries<BigComplex> exp = pfac.fixPoint(new UnivPowerSeriesMap<BigComplex>() {
445
446
447            public UnivPowerSeries<BigComplex> map(UnivPowerSeries<BigComplex> e) {
448                return e.integrate(I);
449            }
450        });
451        System.out.println("exp = " + exp);
452
453        UnivPowerSeries<BigComplex> sin = pfac.fixPoint(new UnivPowerSeriesMap<BigComplex>() {
454
455
456            public UnivPowerSeries<BigComplex> map(UnivPowerSeries<BigComplex> e) {
457                return e.negate().integrate(fac.getONE()).integrate(fac.getZERO());
458            }
459        });
460        System.out.println("sin = " + sin);
461
462        UnivPowerSeries<BigComplex> cos = pfac.fixPoint(new UnivPowerSeriesMap<BigComplex>() {
463
464
465            public UnivPowerSeries<BigComplex> map(UnivPowerSeries<BigComplex> e) {
466                return e.negate().integrate(fac.getZERO()).integrate(fac.getONE());
467            }
468        });
469        System.out.println("cos = " + cos);
470
471        UnivPowerSeries<BigComplex> cpis = cos.sum(sin.multiply(I));
472        System.out.println("cpis = " + cpis);
473    }
474
475
476    public static void example13() {
477        BigRational fac = new BigRational();
478        UnivPowerSeriesRing<BigRational> pfac = new UnivPowerSeriesRing<BigRational>(fac, 11, "y");
479        UnivPowerSeries<BigRational> exp = pfac.getEXP();
480        System.out.println("exp = " + exp);
481        System.out.println("exp(1) = " + exp.evaluate(fac.getONE()));
482        System.out.println("exp(0) = " + exp.evaluate(fac.getZERO()));
483
484        BigDecimal dfac = new BigDecimal();
485        UnivPowerSeriesRing<BigDecimal> dpfac = new UnivPowerSeriesRing<BigDecimal>(dfac, 11, "z");
486        UnivPowerSeries<BigDecimal> dexp = dpfac.getEXP();
487        System.out.println("exp = " + dexp);
488        System.out.println("exp(1) = " + dexp.evaluate(dfac.getONE()));
489        System.out.println("exp(0) = " + dexp.evaluate(dfac.getZERO()));
490    }
491
492
493    public static void example14() {
494        BigRational cfac = new BigRational();
495        UnivPowerSeriesRing<BigRational> pfac = new UnivPowerSeriesRing<BigRational>(cfac, 11, "t");
496        System.out.println("pfac = " + pfac);
497        System.out.println("pfac = " + pfac.toScript());
498
499        GenPolynomialRing<UnivPowerSeries<BigRational>> fac = new GenPolynomialRing<UnivPowerSeries<BigRational>>(pfac,new String[] { "x"} ); 
500        System.out.println("fac = " + fac);
501        System.out.println("fac = " + fac.toScript());
502        List<UnivPowerSeries<BigRational>> gens = pfac.generators();
503        System.out.println("gens = " + gens);
504
505        GenPolynomial<UnivPowerSeries<BigRational>> p = fac.parse("x^2 - x");
506        System.out.println("p = " + p);
507        GenPolynomial<UnivPowerSeries<BigRational>> s = p.sum(gens.get(1).multiply(gens.get(1)));
508        System.out.println("s = " + s);
509
510        GenPolynomial<UnivPowerSeries<BigRational>> q = p.multiply(s);
511        System.out.println("q = " + q);
512
513        GenPolynomial<UnivPowerSeries<BigRational>> r = q.gcd(s);
514        System.out.println("r = " + r);
515    }
516
517}