001/*
002 * $Id: RootUtilTest.java 3974 2012-07-01 12:29:44Z kredel $
003 */
004
005package edu.jas.root;
006
007
008import java.util.ArrayList;
009import java.util.List;
010
011import junit.framework.Test;
012import junit.framework.TestCase;
013import junit.framework.TestSuite;
014
015import edu.jas.arith.BigDecimal;
016import edu.jas.arith.BigRational;
017import edu.jas.arith.Roots;
018import edu.jas.kern.ComputerThreads;
019import edu.jas.poly.Complex;
020import edu.jas.poly.ComplexRing;
021import edu.jas.poly.GenPolynomial;
022import edu.jas.poly.GenPolynomialRing;
023import edu.jas.poly.PolyUtil;
024import edu.jas.poly.TermOrder;
025import edu.jas.structure.Power;
026
027
028/**
029 * RootUtil tests with JUnit.
030 * @author Heinz Kredel.
031 */
032
033public 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): " + a, 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        //a = dfac.parse(" 1/8 x^6 - 5/3 x^5 + 3/20 x^4 - 2 x^3 ");
251        //System.out.println("a = " + a);
252
253        List<ComplexAlgebraicNumber<BigRational>> lcn = RootFactory.<BigRational> complexAlgebraicNumbers(a);
254        //System.out.println("lcn = " + lcn);
255        assertTrue("#roots == deg(a): " + a, lcn.size() == a.degree(0));
256
257        for (ComplexAlgebraicNumber<BigRational> car : lcn) {
258            //System.out.println("car = " + car.toScript() + " in " + car.toScriptFactory());
259            //System.out.println("car = " + car.ring.root);
260            //System.out.println("car = " + car.ring.root.centerApprox() + ", "
261            //        + (Roots.sqrt(new BigDecimal(car.ring.root.rationalLength()))) + ", " + car.ring.root);
262            assertTrue("f(r) == 0: " + car, RootFactory.<BigRational> isRoot(a,car));
263        }
264    }
265}