001    /*
002     * $Id: RootUtilTest.java 3630 2011-05-12 21:44:36Z kredel $
003     */
004    
005    package edu.jas.root;
006    
007    
008    import java.util.ArrayList;
009    import java.util.List;
010    
011    import junit.framework.Test;
012    import junit.framework.TestCase;
013    import junit.framework.TestSuite;
014    
015    import edu.jas.arith.BigDecimal;
016    import edu.jas.arith.BigRational;
017    import edu.jas.arith.Roots;
018    import edu.jas.kern.ComputerThreads;
019    import edu.jas.poly.Complex;
020    import edu.jas.poly.ComplexRing;
021    import edu.jas.poly.GenPolynomial;
022    import edu.jas.poly.GenPolynomialRing;
023    import edu.jas.poly.PolyUtil;
024    import edu.jas.poly.TermOrder;
025    import edu.jas.structure.Power;
026    
027    
028    /**
029     * RootUtil tests with JUnit.
030     * @author Heinz Kredel.
031     */
032    
033    public class RootUtilTest extends TestCase {
034    
035    
036        /**
037         * main.
038         */
039        public static void main(String[] args) {
040            junit.textui.TestRunner.run(suite());
041        }
042    
043    
044        /**
045         * Constructs a <CODE>RootUtilTest</CODE> object.
046         * @param name String.
047         */
048        public RootUtilTest(String name) {
049            super(name);
050        }
051    
052    
053        /**
054         */
055        public static Test suite() {
056            TestSuite suite = new TestSuite(RootUtilTest.class);
057            return suite;
058        }
059    
060    
061        //private final static int bitlen = 100;
062    
063        TermOrder to = new TermOrder(TermOrder.INVLEX);
064    
065    
066        GenPolynomialRing<BigRational> dfac;
067    
068    
069        BigRational ai;
070    
071    
072        BigRational bi;
073    
074    
075        BigRational ci;
076    
077    
078        BigRational di;
079    
080    
081        BigRational ei;
082    
083    
084        BigRational eps;
085    
086    
087        GenPolynomial<BigRational> a;
088    
089    
090        GenPolynomial<BigRational> b;
091    
092    
093        GenPolynomial<BigRational> c;
094    
095    
096        GenPolynomial<BigRational> d;
097    
098    
099        GenPolynomial<BigRational> e;
100    
101    
102        int rl = 1;
103    
104    
105        int kl = 3;
106    
107    
108        int ll = 5;
109    
110    
111        int el = 7;
112    
113    
114        float q = 0.7f;
115    
116    
117        @Override
118        protected void setUp() {
119            a = b = c = d = e = null;
120            ai = bi = ci = di = ei = null;
121            String[] vars = new String[] { "x" };
122            dfac = new GenPolynomialRing<BigRational>(new BigRational(1), rl, to, vars);
123            // eps = new BigRational(1L,1000000L*1000000L*1000000L);
124            eps = Power.positivePower(new BigRational(1L, 10L), BigDecimal.DEFAULT_PRECISION);
125        }
126    
127    
128        @Override
129        protected void tearDown() {
130            a = b = c = d = e = null;
131            ai = bi = ci = di = ei = null;
132            dfac = null;
133            eps = null;
134            ComputerThreads.terminate();
135        }
136    
137    
138        /**
139         * Test sign variations.
140         */
141        public void testSignVar() {
142            int[] li = new int[] { 1, 0, 0, -1, 2, 3, 0, 1, 0, 0, 0, -1 };
143    
144            List<BigRational> Li = new ArrayList<BigRational>();
145    
146            ai = new BigRational();
147    
148            for (int i = 0; i < li.length; i++) {
149                bi = ai.fromInteger(li[i]);
150                Li.add(bi);
151            }
152            //System.out.println("Li = " + Li);
153    
154            long v = RootUtil.<BigRational> signVar(Li);
155            //System.out.println("v = " + v);
156    
157            assertEquals("varSign(Li)", v, 3);
158    
159            List<BigRational> Mi = new ArrayList<BigRational>();
160            for (int i = 0; i < 7; i++) {
161                bi = ai.random(kl);
162                Mi.add(bi);
163            }
164            //System.out.println("Mi = " + Mi);
165    
166            v = RootUtil.<BigRational> signVar(Mi);
167            //System.out.println("v = " + v);
168            long vv = v;
169    
170            assertTrue("varSign(Mi)>=0", v >= 0);
171    
172            List<BigRational> Ni = new ArrayList<BigRational>(Mi);
173            Ni.addAll(Li);
174            //System.out.println("Ni = " + Ni);
175    
176            v = RootUtil.<BigRational> signVar(Ni);
177            //System.out.println("v = " + v);
178    
179            assertTrue("varSign(Mi)>=3", v >= 3 + vv);
180    
181            Ni = new ArrayList<BigRational>(Ni);
182            Ni.addAll(Mi);
183            //System.out.println("Ni = " + Ni);
184    
185            v = RootUtil.<BigRational> signVar(Ni);
186            //System.out.println("v = " + v);
187    
188            assertTrue("varSign(Mi)>=3", v >= 3 + vv);
189        }
190    
191    
192        /**
193         * Test real algebraic factory.
194         */
195        public void testRealAlgebraicFactory() {
196            a = dfac.random(kl, ll * 2, el * 2, q);
197            //a = a.multiply( dfac.univariate(0) );
198            //System.out.println("a = " + a);
199    
200            List<RealAlgebraicNumber<BigRational>> lrn = RootFactory.<BigRational> realAlgebraicNumbers(a);
201            //System.out.println("lrn = " + lrn);
202            assertTrue("#roots >= 0 ", lrn.size() >= 0);
203            for (RealAlgebraicNumber<BigRational> ra : lrn) {
204                //System.out.println("ra = " + ra.toScript() + " in " + ra.toScriptFactory());
205                assertTrue("f(r) == 0: " + ra, RootFactory.<BigRational> isRoot(a,ra));
206            }
207    
208            lrn = RootFactory.<BigRational> realAlgebraicNumbersField(a);
209            //System.out.println("lrn = " + lrn);
210            assertTrue("#roots >= 0 ", lrn.size() >= 0);
211            for (RealAlgebraicNumber<BigRational> ra : lrn) {
212                //System.out.println("ra = " + ra.toScript() + " in " + ra.toScriptFactory());
213                assertTrue("f(r) == 0: " + ra, RootFactory.<BigRational> isRoot(a,ra));
214            }
215        }
216    
217    
218        /**
219         * Test complex algebraic factory.
220         */
221        public void testComplexAlgebraicFactory() {
222            a = dfac.random(kl, ll, el, q);
223            //a = a.multiply( dfac.univariate(0) );
224            //System.out.println("a = " + a);
225            ComplexRing<BigRational> cf = new ComplexRing<BigRational>(new BigRational());
226            GenPolynomialRing<Complex<BigRational>> cfac = new GenPolynomialRing<Complex<BigRational>>(cf, dfac);
227    
228            GenPolynomial<Complex<BigRational>> ca = PolyUtil.<BigRational> toComplex(cfac, a);
229            //System.out.println("ca = " + ca);
230            List<ComplexAlgebraicNumber<BigRational>> lcn = RootFactory.<BigRational> complexAlgebraicNumbersComplex(ca);
231            //System.out.println("lcn = " + lcn);
232            assertTrue("#roots == deg(a): " + lcn.size() + " != " + a.degree(0), lcn.size() == a.degree(0));
233    
234            for (ComplexAlgebraicNumber<BigRational> car : lcn) {
235                //System.out.println("car = " + car.toScript() + " in " + car.toScriptFactory());
236                //System.out.println("car = " + car.ring.root);
237                //System.out.println("car = " + car.ring.root.centerApprox() + ", "
238                //        + (Roots.sqrt(new BigDecimal(car.ring.root.rationalLength()))) + ", " + car.ring.root);
239                assertTrue("f(r) == 0: " + car, RootFactory.<BigRational> isRoot(a,car));
240            }
241        }
242    
243    
244        /**
245         * Test complex rational factory.
246         */
247        public void testComplexRationalFactory() {
248            a = dfac.random(kl, ll, el, q);
249            //a = a.multiply( dfac.univariate(0) );
250            //System.out.println("a = " + a);
251    
252            List<ComplexAlgebraicNumber<BigRational>> lcn = RootFactory.<BigRational> complexAlgebraicNumbers(a);
253            //System.out.println("lcn = " + lcn);
254            assertTrue("#roots == deg(a) " + lcn.size() + ", " + a.degree(0), lcn.size() == a.degree(0));
255    
256            for (ComplexAlgebraicNumber<BigRational> car : lcn) {
257                //System.out.println("car = " + car.toScript() + " in " + car.toScriptFactory());
258                //System.out.println("car = " + car.ring.root);
259                //System.out.println("car = " + car.ring.root.centerApprox() + ", "
260                //        + (Roots.sqrt(new BigDecimal(car.ring.root.rationalLength()))) + ", " + car.ring.root);
261                assertTrue("f(r) == 0: " + car, RootFactory.<BigRational> isRoot(a,car));
262            }
263        }
264    }