001/*
002 * $Id$
003 */
004
005package edu.jas.integrate;
006
007
008import edu.jas.arith.BigRational;
009import edu.jas.kern.ComputerThreads;
010import edu.jas.poly.GenPolynomial;
011import edu.jas.poly.GenPolynomialRing;
012import edu.jas.poly.PolyUtil;
013import edu.jas.poly.TermOrder;
014import edu.jas.ufd.Quotient;
015import edu.jas.ufd.QuotientRing;
016
017import junit.framework.Test;
018import junit.framework.TestCase;
019import junit.framework.TestSuite;
020
021
022/**
023 * Quotient over BigRational GenPolynomial tests with JUnit.
024 * @author Heinz Kredel
025 */
026
027public class ElementaryIntegrationTest extends TestCase {
028
029
030    /**
031     * main.
032     */
033    public static void main(String[] args) {
034        junit.textui.TestRunner.run(suite());
035    }
036
037
038    /**
039     * Constructs a <CODE>ElementaryIntegrationTest</CODE> object.
040     * @param name String.
041     */
042    public ElementaryIntegrationTest(String name) {
043        super(name);
044    }
045
046
047    /**
048     * suite.
049     */
050    public static Test suite() {
051        TestSuite suite = new TestSuite(ElementaryIntegrationTest.class);
052        return suite;
053    }
054
055
056    TermOrder tord;
057
058
059    QuotientRing<BigRational> qfac;
060
061
062    GenPolynomialRing<BigRational> mfac;
063
064
065    ElementaryIntegration<BigRational> integrator;
066
067
068    QuotIntegral<BigRational> rint;
069
070
071    Quotient<BigRational> a, b, c, d, e;
072
073
074    int rl = 1; // only univariate polynomials
075
076
077    int kl = 5;
078
079
080    int ll = 3; //6;
081
082
083    int el = 4;
084
085
086    float q = 0.4f;
087
088
089    @Override
090    protected void setUp() {
091        a = b = c = d = e = null;
092        tord = new TermOrder(TermOrder.INVLEX);
093        BigRational br = new BigRational(1);
094        String[] vars = new String[] { "x" };
095        mfac = new GenPolynomialRing<BigRational>(br, rl, tord, vars);
096        qfac = new QuotientRing<BigRational>(mfac);
097        integrator = new ElementaryIntegration<BigRational>(br);
098    }
099
100
101    @Override
102    protected void tearDown() {
103        a = b = c = d = e = null;
104        //qfac.terminate();
105        qfac = null;
106        ComputerThreads.terminate();
107    }
108
109
110    /**
111     * Test rational integral.
112     */
113    public void testRational() {
114        for (int i = 0; i < 3; i++) {
115            a = qfac.random(kl, ll + 2 * i, el + i, q);
116            //System.out.println("a = " + a);
117            //             if ( a.isZERO() || a.isONE() ) {
118            //                 continue;
119            //             }
120            b = integrator.derivative(a);
121            //System.out.println("b =  " + b);
122            rint = integrator.integrate(b);
123            //System.out.println("QuotIntegral: " + rint);
124
125            assertTrue("isIntegral ", integrator.isIntegral(rint));
126            assertFalse("rint not empty: " + rint, rint.toString().isEmpty());
127            assertTrue("rint contains: " + rint, rint.toString().indexOf("integral") >= 0);
128        }
129    }
130
131
132    /**
133     * Test 1/p pure logarithm integral.
134     */
135    public void testPureLogarithm1() {
136        for (int i = 0; i < 3; i++) {
137            a = qfac.random(kl, ll + i, el + i, q);
138            //System.out.println("a = " + a);
139            //             if ( a.isZERO() || a.isONE() ) {
140            //                 continue;
141            //             }
142            b = new Quotient<BigRational>(qfac, qfac.getONE().num, a.den);
143            //System.out.println("b =  " + b);
144            rint = integrator.integrate(b);
145            //System.out.println("QuotIntegral: " + rint);
146
147            assertTrue("isIntegral ", integrator.isIntegral(rint));
148            assertFalse("rint not empty: " + rint, rint.toString().isEmpty());
149            assertTrue("rint contains: " + rint, rint.toString().indexOf("integral") >= 0);
150        }
151    }
152
153
154    /**
155     * Test p'/p pure logarithm integral.
156     */
157    public void testPureLogarithmD() {
158        for (int i = 0; i < 3; i++) {
159            a = qfac.random(kl, ll + i, el + i, q);
160            //System.out.println("a = " + a);
161            //             if ( a.isZERO() || a.isONE() ) {
162            //                 continue;
163            //             }
164            GenPolynomial<BigRational> pp = PolyUtil.<BigRational> baseDerivative(a.den);
165            b = new Quotient<BigRational>(qfac, pp, a.den);
166            //System.out.println("b =  " + b);
167            rint = integrator.integrate(b);
168            //System.out.println("QuotIntegral: " + rint);
169
170            assertTrue("isIntegral ", integrator.isIntegral(rint));
171            assertFalse("rint not empty: " + rint, rint.toString().isEmpty());
172            assertTrue("rint contains: " + rint, rint.toString().indexOf("integral") >= 0);
173        }
174    }
175
176
177    /**
178     * Test mixed rational with p'/p logarithm integral.
179     */
180    public void testRationalWithLogarithmD() {
181        for (int i = 0; i < 3; i++) {
182            a = qfac.random(kl, ll + i, el + i, q);
183            //System.out.println("a = " + a);
184            //             if ( a.isZERO() || a.isONE() ) {
185            //                 continue;
186            //             }
187
188            b = integrator.derivative(a);
189            //System.out.println("b =  " + b);
190
191            GenPolynomial<BigRational> pp = PolyUtil.<BigRational> baseDerivative(a.den);
192            c = new Quotient<BigRational>(qfac, pp, a.den);
193            //System.out.println("c =  " + c);
194
195            e = b.sum(c);
196            //System.out.println("e =  " + e);
197
198            rint = integrator.integrate(e);
199            //System.out.println("QuotIntegral: " + rint);
200
201            assertTrue("isIntegral ", integrator.isIntegral(rint));
202            assertFalse("rint not empty: " + rint, rint.toString().isEmpty());
203            assertTrue("rint contains: " + rint, rint.toString().indexOf("integral") >= 0);
204        }
205    }
206
207
208    /**
209     * Test mixed rational with 1/p logarithm integral.
210     */
211    public void xtestRationalWithLogarithm1() {
212        for (int i = 0; i < 3; i++) {
213            a = qfac.random(kl, ll + i, el + i, q);
214            //System.out.println("a = " + a);
215            //             if ( a.isZERO() || a.isONE() ) {
216            //                 continue;
217            //             }
218
219            b = integrator.derivative(a);
220            //System.out.println("b =  " + b);
221
222            d = new Quotient<BigRational>(qfac, qfac.getONE().num, a.den);
223            //System.out.println("d =  " + d);
224
225            e = b.sum(d);
226            //System.out.println("e =  " + e);
227
228            rint = integrator.integrate(e);
229            //System.out.println("QuotIntegral: " + rint);
230
231            assertTrue("isIntegral ", integrator.isIntegral(rint));
232            assertFalse("rint not empty: " + rint, rint.toString().isEmpty());
233            assertTrue("rint contains: " + rint, rint.toString().indexOf("integral") >= 0);
234        }
235    }
236
237
238    /**
239     * Test mixed rational with p'/p + 1/p logarithm integral.
240     */
241    public void testRationalWithLogarithm() {
242        for (int i = 0; i < 3; i++) {
243            a = qfac.random(kl, ll + i, el + i, q);
244            //System.out.println("a = " + a);
245            //             if ( a.isZERO() || a.isONE() ) {
246            //                 continue;
247            //             }
248
249            b = integrator.derivative(a);
250            //System.out.println("b =  " + b);
251
252            GenPolynomial<BigRational> pp = PolyUtil.<BigRational> baseDerivative(a.den);
253            c = new Quotient<BigRational>(qfac, pp, a.den);
254            //System.out.println("c =  " + c);
255
256            d = new Quotient<BigRational>(qfac, qfac.getONE().num, a.den);
257            //System.out.println("d =  " + d);
258
259            e = b.sum(c).sum(d);
260            //System.out.println("e =  " + e);
261
262            rint = integrator.integrate(e);
263            //System.out.println("QuotIntegral: " + rint);
264
265            assertTrue("isIntegral ", integrator.isIntegral(rint));
266            assertFalse("rint not empty: " + rint, rint.toString().isEmpty());
267            assertTrue("rint contains: " + rint, rint.toString().indexOf("integral") >= 0);
268        }
269    }
270
271
272    /**
273     * Test rational integral with quotient coefficients.
274     */
275    public void testRationalRecursive() {
276        QuotientRing<Quotient<BigRational>> qqfac;
277        GenPolynomialRing<Quotient<BigRational>> qmfac;
278        ElementaryIntegration<Quotient<BigRational>> qintegrator;
279        QuotIntegral<Quotient<BigRational>> qrint;
280        String[] vars = new String[] { "y" };
281
282        qmfac = new GenPolynomialRing<Quotient<BigRational>>(qfac, 1, tord, vars);
283        qqfac = new QuotientRing<Quotient<BigRational>>(qmfac);
284
285        qintegrator = new ElementaryIntegration<Quotient<BigRational>>(qfac);
286
287        Quotient<Quotient<BigRational>> qa, qb;
288
289        for (int i = 0; i < 2; i++) {
290            qa = qqfac.random(2, ll, el, q);
291            //System.out.println("qa = " + qa);
292            //             if ( a.isZERO() || a.isONE() ) {
293            //                 continue;
294            //             }
295            qb = qintegrator.derivative(qa);
296            //System.out.println("qb =  " + qb);
297            qrint = qintegrator.integrate(qb);
298            //System.out.println("QuotIntegral: " + qrint);
299
300            assertTrue("isIntegral ", qintegrator.isIntegral(qrint));
301            assertFalse("rint not empty: " + qrint, qrint.toString().isEmpty());
302            assertTrue("rint contains: " + qrint, qrint.toString().indexOf("integral") >= 0);
303        }
304    }
305
306
307    /**
308     * Test mixed rational integral.
309     */
310    public void testMixedRational() {
311        //integrate( (3*x^16-19*x^15+43*x^14-20*x^13-91*x^12+183*x^11-81*x^10-166*x^9+271*x^8-101*x^7-127*x^6+168*x^5-53*x^4-31*x^3+41*x^2-2*x-2)/(4*x^14-20*x^13+28*x^12+24*x^11-108*x^10+84*x^9+76*x^8-176*x^7+76*x^6+84*x^5-108*x^4+24*x^3+28*x^2-20*x+4), x)
312
313        BigRational br = new BigRational(1);
314        String[] vars = new String[] { "x" };
315        GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(br, vars);
316        QuotientRing<BigRational> qfac = new QuotientRing<BigRational>(pfac);
317        GenPolynomial<BigRational> n = pfac.parse(
318                        "(3*x^16-19*x^15+43*x^14-20*x^13-91*x^12+183*x^11-81*x^10-166*x^9+271*x^8-101*x^7-127*x^6+168*x^5-53*x^4-31*x^3+41*x^2-2*x-2)");
319        GenPolynomial<BigRational> d = pfac.parse(
320                        "(4*x^14-20*x^13+28*x^12+24*x^11-108*x^10+84*x^9+76*x^8-176*x^7+76*x^6+84*x^5-108*x^4+24*x^3+28*x^2-20*x+4)");
321        //System.out.println("n = " + n);
322        //System.out.println("d = " + d);
323        Quotient<BigRational> a = new Quotient<BigRational>(qfac, n, d);
324        //System.out.println("a = " + a);
325
326        QuotIntegral<BigRational> qrint = integrator.integrate(a);
327        //System.out.println("QuotIntegral: " + qrint);
328        assertTrue("isIntegral ", integrator.isIntegral(qrint));
329
330        Quotient<BigRational> b = qfac.parse(
331                        "{ 3*x^16-19*x^15+43*x^14-20*x^13-91*x^12+183*x^11-81*x^10-166*x^9+271*x^8-101*x^7-127*x^6+168*x^5-53*x^4-31*x^3+41*x^2-2*x-2 | 4*x^14-20*x^13+28*x^12+24*x^11-108*x^10+84*x^9+76*x^8-176*x^7+76*x^6+84*x^5-108*x^4+24*x^3+28*x^2-20*x+4 }");
332        //System.out.println("b = " + b);
333        assertEquals("a == b: ", a, b);
334
335        qrint = integrator.integrate(b);
336        //System.out.println("QuotIntegral: " + qrint);
337        assertTrue("isIntegral ", integrator.isIntegral(qrint));
338        assertFalse("qrint not empty: " + qrint, qrint.toString().isEmpty());
339        assertTrue("qrint contains: " + qrint, qrint.toString().indexOf("integral") >= 0);
340    }
341
342}