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