001/*
002 * $Id: RootUtilTest.java 5311 2015-10-25 22:28:29Z 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        assertTrue("#roots >= 0 ", lrn != null);
204        for (RealAlgebraicNumber<BigRational> ra : lrn) {
205            //System.out.println("ra = " + ra.toScript() + " in " + ra.toScriptFactory());
206            assertTrue("f(r) == 0: " + ra, RootFactory.<BigRational> isRoot(a,ra));
207        }
208
209        lrn = RootFactory.<BigRational> realAlgebraicNumbersField(a);
210        //System.out.println("lrn = " + lrn);
211        assertTrue("#roots >= 0 ", lrn != null);
212        for (RealAlgebraicNumber<BigRational> ra : lrn) {
213            //System.out.println("ra = " + ra.toScript() + " in " + ra.toScriptFactory());
214            assertTrue("f(r) == 0: " + ra, RootFactory.<BigRational> isRoot(a,ra));
215        }
216    }
217
218
219    /**
220     * Test complex algebraic factory.
221     */
222    public void testComplexAlgebraicFactory() {
223        a = dfac.random(kl, ll, el, q);
224        //a = a.multiply( dfac.univariate(0) );
225        //System.out.println("a = " + a);
226        ComplexRing<BigRational> cf = new ComplexRing<BigRational>(new BigRational());
227        GenPolynomialRing<Complex<BigRational>> cfac = new GenPolynomialRing<Complex<BigRational>>(cf, dfac);
228
229        GenPolynomial<Complex<BigRational>> ca = PolyUtil.<BigRational> toComplex(cfac, a);
230        //System.out.println("ca = " + ca);
231        List<ComplexAlgebraicNumber<BigRational>> lcn = RootFactory.<BigRational> complexAlgebraicNumbersComplex(ca);
232        //System.out.println("lcn = " + lcn);
233        assertTrue("#roots == deg(a): " + a, lcn.size() == a.degree(0));
234
235        for (ComplexAlgebraicNumber<BigRational> car : lcn) {
236            //System.out.println("car = " + car.toScript() + " in " + car.toScriptFactory());
237            //System.out.println("car = " + car.ring.root);
238            //System.out.println("car = " + car.ring.root.centerApprox() + ", "
239            //        + (Roots.sqrt(new BigDecimal(car.ring.root.rationalLength()))) + ", " + car.ring.root);
240            assertTrue("f(r) == 0: " + car, RootFactory.<BigRational> isRoot(a,car));
241        }
242    }
243
244
245    /**
246     * Test complex rational factory.
247     */
248    public void testComplexRationalFactory() {
249        a = dfac.random(kl, ll, el, q);
250        //a = a.multiply( dfac.univariate(0) );
251        //a = dfac.parse(" 1/8 x^6 - 5/3 x^5 + 3/20 x^4 - 2 x^3 ");
252        //System.out.println("a = " + a);
253
254        List<ComplexAlgebraicNumber<BigRational>> lcn = RootFactory.<BigRational> complexAlgebraicNumbers(a);
255        //System.out.println("lcn = " + lcn);
256        assertTrue("#roots == deg(a): " + a, lcn.size() == a.degree(0));
257
258        for (ComplexAlgebraicNumber<BigRational> car : lcn) {
259            //System.out.println("car = " + car.toScript() + " in " + car.toScriptFactory());
260            //System.out.println("car = " + car.ring.root);
261            //System.out.println("car = " + car.ring.root.centerApprox() + ", "
262            //        + (Roots.sqrt(new BigDecimal(car.ring.root.rationalLength()))) + ", " + car.ring.root);
263            assertTrue("f(r) == 0: " + car, RootFactory.<BigRational> isRoot(a,car));
264        }
265    }
266}