001    /*
002     * $Id: UnivPowerSeriesTest.java 3338 2010-10-02 14:48:15Z kredel $
003     */
004    
005    package edu.jas.ps;
006    
007    
008    import java.util.List;
009    
010    import junit.framework.Test;
011    import junit.framework.TestCase;
012    import junit.framework.TestSuite;
013    
014    import edu.jas.arith.BigRational;
015    import edu.jas.poly.GenPolynomialRing;
016    import edu.jas.poly.GenPolynomial;
017    import edu.jas.poly.PolyUtil;
018    
019    
020    /**
021     * Univariate power series tests with JUnit.
022     * @author Heinz Kredel.
023     */
024    
025    public class UnivPowerSeriesTest extends TestCase {
026    
027    
028        /**
029         * main.
030         */
031        public static void main(String[] args) {
032            junit.textui.TestRunner.run(suite());
033        }
034    
035    
036        /**
037         * Constructs a <CODE>UnivPowerSeriesTest</CODE> object.
038         * @param name String.
039         */
040        public UnivPowerSeriesTest(String name) {
041            super(name);
042        }
043    
044    
045        /**
046         */
047        public static Test suite() {
048            TestSuite suite = new TestSuite(UnivPowerSeriesTest.class);
049            return suite;
050        }
051    
052    
053        //private final static int bitlen = 100;
054    
055        UnivPowerSeriesRing<BigRational> fac;
056    
057    
058        UnivPowerSeries<BigRational> a;
059    
060    
061        UnivPowerSeries<BigRational> b;
062    
063    
064        UnivPowerSeries<BigRational> c;
065    
066    
067        UnivPowerSeries<BigRational> d;
068    
069    
070        UnivPowerSeries<BigRational> e;
071    
072    
073        int kl = 10;
074    
075    
076        float q = 0.5f;
077    
078    
079        @Override
080        protected void setUp() {
081            a = b = c = d = e = null;
082            fac = new UnivPowerSeriesRing<BigRational>(new BigRational(1));
083        }
084    
085    
086        @Override
087        protected void tearDown() {
088            a = b = c = d = e = null;
089            fac = null;
090        }
091    
092    
093        /**
094         * Test constructor and toString.
095         * 
096         */
097        public void testConstruction() {
098            c = fac.getONE();
099            assertTrue("isZERO( c )", !c.isZERO());
100            assertTrue("isONE( c )", c.isONE());
101    
102            d = fac.getZERO();
103            assertTrue("isZERO( d )", d.isZERO());
104            assertTrue("isONE( d )", !d.isONE());
105        }
106    
107    
108        /**
109         * Test random polynomial.
110         */
111        public void testRandom() {
112            for (int i = 0; i < 5; i++) {
113                a = fac.random(i + 2);
114                //System.out.println("a = " + a);
115                assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
116                assertTrue(" not isONE( a" + i + " )", !a.isONE());
117            }
118        }
119    
120    
121        /**
122         * Test addition.
123         * 
124         */
125        public void testAddition() {
126            a = fac.random(kl);
127            b = fac.random(kl);
128    
129            c = a.sum(b);
130            d = b.sum(a);
131            assertEquals("a+b = b+a", c, d);
132    
133            d = c.subtract(b);
134            assertEquals("a+b-b = a", a, d);
135    
136            c = fac.random(kl);
137            d = a.sum(b.sum(c));
138            e = a.sum(b).sum(c);
139            assertEquals("a+(b+c) = (a+b)+c", d, e);
140        }
141    
142    
143        /**
144         * Test multiplication.
145         * 
146         */
147        public void testMultiplication() {
148            a = fac.random(kl);
149            assertTrue("not isZERO( a )", !a.isZERO());
150    
151            b = fac.random(kl);
152            assertTrue("not isZERO( b )", !b.isZERO());
153    
154            c = b.multiply(a);
155            d = a.multiply(b);
156            assertTrue("not isZERO( c )", !c.isZERO());
157            assertTrue("not isZERO( d )", !d.isZERO());
158    
159            //System.out.println("a = " + a);
160            //System.out.println("b = " + b);
161            e = d.subtract(c);
162            assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO());
163    
164            assertTrue("a*b = b*a", c.equals(d));
165            assertEquals("a*b = b*a", c, d);
166    
167            c = fac.random(kl);
168            //System.out.println("c = " + c);
169            d = a.multiply(b.multiply(c));
170            e = (a.multiply(b)).multiply(c);
171    
172            //System.out.println("d = " + d);
173            //System.out.println("e = " + e);
174    
175            //System.out.println("d-e = " + d.subtract(c) );
176    
177            assertEquals("a(bc) = (ab)c", d, e);
178            assertTrue("a(bc) = (ab)c", d.equals(e));
179        }
180    
181    
182        /**
183         * Test distributive law.
184         * 
185         */
186        public void testDistributive() {
187            a = fac.random(kl, q);
188            b = fac.random(kl, q);
189            c = fac.random(kl, q);
190    
191            d = a.multiply(b.sum(c));
192            e = a.multiply(b).sum(a.multiply(c));
193    
194            assertEquals("a(b+c) = ab+ac", d, e);
195        }
196    
197    
198        /**
199         * Test object quotient and remainder.
200         * 
201         */
202        public void testQuotRem() {
203            fac = new UnivPowerSeriesRing<BigRational>(new BigRational(1));
204    
205            a = fac.random(kl);
206            assertTrue("not isZERO( a )", !a.isZERO());
207    
208            b = fac.random(kl);
209            assertTrue("not isZERO( b )", !b.isZERO());
210    
211            UnivPowerSeries<BigRational> h = a;
212            UnivPowerSeries<BigRational> g = fac.random(kl);
213            assertTrue("not isZERO( g )", !g.isZERO());
214            a = a.multiply(g);
215            b = b.multiply(g);
216            //System.out.println("a = " + a);
217            //System.out.println("b = " + b);
218            //System.out.println("g = " + g);
219    
220            /*
221            UnivPowerSeries<BigRational>[] qr;
222            qr = b.divideAndRemainder(a);
223            c = qr[0];
224            d = qr[1];
225            //System.out.println("q = " + c);
226            //System.out.println("r = " + d);
227            e = c.multiply(a).sum(d);
228            assertEquals("b = q a + r", b, e );
229            */
230    
231            // gcd tests -------------------------------
232            c = a.gcd(b);
233            //System.out.println("gcd = " + c);
234            assertTrue("a mod gcd(a,b) = 0", a.remainder(c).isZERO());
235            assertTrue("b mod gcd(a,b) = 0", b.remainder(c).isZERO());
236            //assertEquals("g = gcd(a,b)", c, g );
237        }
238    
239    
240        /**
241         * Test evaluation.
242         * 
243         */
244        public void testEvaluation() {
245            a = fac.random(kl, q);
246            b = fac.random(kl, q);
247            BigRational fv = new BigRational(0);
248            BigRational v = fv.random(kl);
249    
250            BigRational av = a.evaluate(v);
251            BigRational bv = b.evaluate(v);
252    
253            c = a.sum(b);
254            BigRational cv = c.evaluate(v);
255            BigRational dv = av.sum(bv);
256            assertEquals("a(v)+b(v) = (a+b)(v) ", cv, dv);
257    
258            c = fac.getZERO();
259            cv = c.evaluate(v);
260            dv = fv.getZERO();
261            assertEquals("0(v) = 0 ", cv, dv);
262    
263            c = fac.getONE();
264            cv = c.evaluate(v);
265            dv = fv.getONE();
266            assertEquals("1(v) = 1 ", cv, dv);
267    
268            // not true: 
269            //c = a.multiply(b);
270            //cv = c.evaluate(v);
271            //dv = av.multiply(bv);
272            //assertEquals("a(v)*b(v) = (a*b)(v) ", cv, dv);
273        }
274    
275    
276        /**
277         * Test Taylor series.
278         * 
279         */
280        public void testTaylor() {
281            BigRational br = new BigRational(0);
282            GenPolynomialRing<BigRational> pr = fac.polyRing();
283            //System.out.println("pr  = " + pr);
284    
285            GenPolynomial<BigRational> p = pr.random(kl,3,3,q+q);
286            //System.out.println("p   = " + p);
287    
288            TaylorFunction<BigRational> F = new PolynomialTaylorFunction<BigRational>(p);
289    
290            UnivPowerSeriesRing<BigRational> psr = new UnivPowerSeriesRing<BigRational>(pr);
291            //System.out.println("psr = " + psr.toScript());
292    
293            UnivPowerSeries<BigRational> ps = fac.seriesOfTaylor(F,br);
294            //System.out.println("ps  = " + ps);
295            UnivPowerSeries<BigRational> pps = fac.fromPolynomial(p);
296            //System.out.println("pps = " + pps);
297            assertEquals("taylor(p) == p", ps, pps);
298    
299            for ( GenPolynomial<BigRational> g : pr.generators() ) {
300                F = new PolynomialTaylorFunction<BigRational>(g);
301                ps = fac.seriesOfTaylor(F,br);
302                //System.out.println("g   = " + g);
303                //System.out.println("ps  = " + ps);
304                pps = fac.fromPolynomial(g);
305                //System.out.println("pps = " + pps);
306                assertEquals("taylor(p) == p", ps, pps);
307            }
308        }
309    }