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