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