001/*
002 * $Id$
003 */
004
005package edu.jas.gbufd;
006
007
008import java.io.IOException;
009import java.io.Reader;
010import java.io.StringReader;
011import java.util.ArrayList;
012import java.util.List;
013
014
015import edu.jas.arith.BigRational;
016import edu.jas.gb.GroebnerBase;
017import edu.jas.gb.GroebnerBaseSeq;
018import edu.jas.gb.OrderedSyzPairlist;
019import edu.jas.gb.ReductionSeq;
020import edu.jas.poly.AlgebraicNumber;
021import edu.jas.poly.AlgebraicNumberRing;
022import edu.jas.poly.Complex;
023import edu.jas.poly.GenPolynomial;
024import edu.jas.poly.GenPolynomialRing;
025import edu.jas.poly.GenPolynomialTokenizer;
026import edu.jas.poly.PolynomialList;
027import edu.jas.poly.TermOrder;
028
029import junit.framework.Test;
030import junit.framework.TestCase;
031import junit.framework.TestSuite;
032
033
034/**
035 * Groebner base via FGLM tests with JUnit.
036 * @author Heinz Kredel
037 */
038
039public class GroebnerBaseFGLMTest extends TestCase {
040
041
042    /**
043     * main
044     */
045    public static void main(String[] args) {
046        junit.textui.TestRunner.run(suite());
047    }
048
049
050    /**
051     * Constructs a <CODE>GroebnerBaseFGLMTest</CODE> object.
052     * @param name String.
053     */
054    public GroebnerBaseFGLMTest(String name) {
055        super(name);
056    }
057
058
059    /**
060     * suite.
061     */
062    public static Test suite() {
063        TestSuite suite = new TestSuite(GroebnerBaseFGLMTest.class);
064        return suite;
065    }
066
067
068    GenPolynomialRing<BigRational> fac;
069
070
071    PolynomialList<BigRational> F;
072
073
074    List<GenPolynomial<BigRational>> L, G, Gs;
075
076
077    GroebnerBase<BigRational> bb;
078
079
080    GenPolynomial<BigRational> a, b, c, d, e;
081
082
083    int rl = 4; //4; //3; 
084
085
086    int kl = 7; // 10
087
088
089    int ll = 7;
090
091
092    int el = 3; // 4
093
094
095    float q = 0.2f; //0.4f
096
097
098    @Override
099    protected void setUp() {
100        BigRational coeff = new BigRational(9);
101        fac = new GenPolynomialRing<BigRational>(coeff, rl, new TermOrder(TermOrder.INVLEX));
102        a = b = c = d = e = null;
103        bb = new GroebnerBaseFGLM<BigRational>();
104    }
105
106
107    @Override
108    protected void tearDown() {
109        a = b = c = d = e = null;
110        fac = null;
111        bb = null;
112    }
113
114
115    /**
116     * Test example GBase.
117     */
118    @SuppressWarnings({ "unchecked", "cast" })
119    public void testExamGBase() {
120        GroebnerBase<BigRational> bbs = new GroebnerBaseSeq<BigRational>(new ReductionSeq<BigRational>(),
121                        new OrderedSyzPairlist<BigRational>());
122        String exam = "(x,y,z) L " + "( " + "( z y**2 + 2 x + 1/2 )" + "( z x**2 - y**2 - 1/2 x )"
123                        + "( -z + y**2 x + 4 x**2 + 1/4 )" + " )";
124
125        Reader source = new StringReader(exam);
126        GenPolynomialTokenizer parser = new GenPolynomialTokenizer(source);
127        try {
128            F = (PolynomialList<BigRational>) parser.nextPolynomialSet();
129        } catch (ClassCastException e) {
130            fail("" + e);
131        } catch (IOException e) {
132            fail("" + e);
133        }
134        //System.out.println("F = " + F);
135
136        G = bb.GB(F.list);
137        PolynomialList<BigRational> P = new PolynomialList<BigRational>(F.ring, G);
138        //System.out.println("G = " + P);
139        assertTrue("isGB( GB(P) )", bb.isGB(G));
140        assertEquals("#GB(P) == 3", 3, G.size());
141
142        Gs = bbs.GB(F.list);
143        PolynomialList<BigRational> P2 = new PolynomialList<BigRational>(F.ring, Gs);
144        assertTrue("isGB( GB(P2) )", bb.isGB(Gs));
145        assertEquals("#GB(P2) == 3", 3, Gs.size());
146
147        assertEquals("GB == FGLM", P, P2);
148    }
149
150
151    /**
152     * Test Trinks7 GBase.
153     */
154    @SuppressWarnings({ "unchecked", "cast" })
155    public void testTrinks7GBase() {
156        GroebnerBase<BigRational> bbs = new GroebnerBaseSeq<BigRational>(new ReductionSeq<BigRational>(),
157                        new OrderedSyzPairlist<BigRational>());
158        String exam = "(B,S,T,Z,P,W) L " + "( " + "( 45 P + 35 S - 165 B - 36 ), "
159                        + "( 35 P + 40 Z + 25 T - 27 S ), " + "( 15 W + 25 S P + 30 Z - 18 T - 165 B**2 ), "
160                        + "( - 9 W + 15 T P + 20 S Z ), " + "( P W + 2 T Z - 11 B**3 ), "
161                        + "( 99 W - 11 B S + 3 B**2 ), " + "( B**2 + 33/50 B + 2673/10000 ) " + ") ";
162        Reader source = new StringReader(exam);
163        GenPolynomialTokenizer parser = new GenPolynomialTokenizer(source);
164        try {
165            F = (PolynomialList<BigRational>) parser.nextPolynomialSet();
166        } catch (ClassCastException e) {
167            fail("" + e);
168        } catch (IOException e) {
169            fail("" + e);
170        }
171        //System.out.println("F = " + F);
172
173        G = bb.GB(F.list);
174        PolynomialList<BigRational> trinks = new PolynomialList<BigRational>(F.ring, G);
175        //System.out.println("G = " + trinks);
176        assertTrue("isGB( GB(Trinks7) )", bb.isGB(G));
177        assertEquals("#GB(Trinks7) == 6", 6, G.size());
178
179        Gs = bbs.GB(F.list);
180        PolynomialList<BigRational> trinks2 = new PolynomialList<BigRational>(F.ring, Gs);
181        assertTrue("isGB( GB(Trinks7) )", bb.isGB(Gs));
182        assertEquals("#GB(Trinks7) == 6", 6, Gs.size());
183
184        assertEquals("GB == FGLM", trinks, trinks2);
185    }
186
187
188    /**
189     * Test Trinks6 GBase.
190     */
191    @SuppressWarnings({ "unchecked", "cast" })
192    public void testTrinks6GBase() {
193        GroebnerBase<BigRational> bbs = new GroebnerBaseSeq<BigRational>(new ReductionSeq<BigRational>(),
194                        new OrderedSyzPairlist<BigRational>());
195        String exam = "(B,S,T,Z,P,W) L " + "( " + "( 45 P + 35 S - 165 B - 36 ), "
196                        + "( 35 P + 40 Z + 25 T - 27 S ), " + "( 15 W + 25 S P + 30 Z - 18 T - 165 B**2 ), "
197                        + "( - 9 W + 15 T P + 20 S Z ), " + "( P W + 2 T Z - 11 B**3 ), "
198                        + "( 99 W - 11 B S + 3 B**2 ), " + ") ";
199
200        Reader source = new StringReader(exam);
201        GenPolynomialTokenizer parser = new GenPolynomialTokenizer(source);
202        try {
203            F = (PolynomialList<BigRational>) parser.nextPolynomialSet();
204        } catch (ClassCastException e) {
205            fail("" + e);
206        } catch (IOException e) {
207            fail("" + e);
208        }
209        //System.out.println("F = " + F);
210
211        G = bb.GB(F.list);
212        PolynomialList<BigRational> trinks = new PolynomialList<BigRational>(F.ring, G);
213        //System.out.println("G = " + trinks);
214        assertTrue("isGB( GB(Trinks7) )", bb.isGB(G));
215        assertEquals("#GB(Trinks7) == 6", 6, G.size());
216
217        Gs = bbs.GB(F.list);
218        PolynomialList<BigRational> trinks2 = new PolynomialList<BigRational>(F.ring, Gs);
219        assertTrue("isGB( GB(Trinks7) )", bb.isGB(Gs));
220        assertEquals("#GB(Trinks7) == 6", 6, Gs.size());
221
222        assertEquals("GB == FGLM", trinks, trinks2);
223    }
224
225
226    /**
227     * Test Trinks7 GBase over Q(sqrt(2)).
228     */
229    @SuppressWarnings({ "unchecked", "cast" })
230    public void testTrinks7GBaseSqrt() {
231        GroebnerBase<AlgebraicNumber<BigRational>> bbs = new GroebnerBaseSeq<AlgebraicNumber<BigRational>>(
232                        new ReductionSeq<AlgebraicNumber<BigRational>>(),
233                        new OrderedSyzPairlist<AlgebraicNumber<BigRational>>());
234        GroebnerBase<AlgebraicNumber<BigRational>> bb = new GroebnerBaseFGLM<AlgebraicNumber<BigRational>>();
235        String exam = "AN[ (w2) (w2^2 - 2) ] (B,S,T,Z,P,W) L " + "( " + "( 45 P + 35 S - 165 B - 36 ), "
236                        + "( 35 P + 40 Z + 25 T - 27 S ), " + "( 15 W + 25 S P + 30 Z - 18 T - 165 B**2 ), "
237                        + "( - 9 W + 15 T P + 20 S Z ), " + "( P W + 2 T Z - 11 B**3 ), "
238                        + "( 99 W - 11 B S + 3 B**2 ), " + "( B**2 + 33/50 B + 2673/10000 ) " + ") ";
239
240        Reader source = new StringReader(exam);
241        GenPolynomialTokenizer parser = new GenPolynomialTokenizer(source);
242        PolynomialList<AlgebraicNumber<BigRational>> F = null;
243        List<GenPolynomial<AlgebraicNumber<BigRational>>> G, Gs;
244        try {
245            F = (PolynomialList<AlgebraicNumber<BigRational>>) parser.nextPolynomialSet();
246        } catch (ClassCastException e) {
247            fail("" + e);
248        } catch (IOException e) {
249            fail("" + e);
250        }
251        //System.out.println("F = " + F);
252        GenPolynomialRing<AlgebraicNumber<BigRational>> pfac = F.ring;
253        AlgebraicNumberRing<BigRational> afac = (AlgebraicNumberRing<BigRational>) pfac.coFac;
254        //System.out.println("afac = " + afac);
255        afac = new AlgebraicNumberRing<BigRational>(afac.modul, true);
256        //System.out.println("afac = " + afac);
257        pfac = new GenPolynomialRing<AlgebraicNumber<BigRational>>(afac, pfac);
258        List<GenPolynomial<AlgebraicNumber<BigRational>>> Fp = new ArrayList<GenPolynomial<AlgebraicNumber<BigRational>>>(
259                        F.list.size());
260        for (GenPolynomial<AlgebraicNumber<BigRational>> p : F.list) {
261            GenPolynomial<AlgebraicNumber<BigRational>> pp = pfac.copy(p);
262            Fp.add(pp);
263        }
264        F = new PolynomialList<AlgebraicNumber<BigRational>>(pfac, Fp);
265
266        G = bb.GB(F.list);
267        PolynomialList<AlgebraicNumber<BigRational>> trinks = new PolynomialList<AlgebraicNumber<BigRational>>(
268                        F.ring, G);
269        //System.out.println("G = " + trinks);
270        assertTrue("isGB( GB(Trinks7) )", bb.isGB(G));
271        assertEquals("#GB(Trinks7) == 6", 6, G.size());
272
273        Gs = bbs.GB(F.list);
274        PolynomialList<AlgebraicNumber<BigRational>> trinks2 = new PolynomialList<AlgebraicNumber<BigRational>>(
275                        F.ring, Gs);
276        //System.out.println("Gs = " + trinks2);
277        assertTrue("isGB( GB(Trinks7) )", bb.isGB(Gs));
278        assertEquals("#GB(Trinks7) == 6", 6, Gs.size());
279
280        assertEquals("GB == FGLM", trinks, trinks2);
281    }
282
283
284    /**
285     * Test Trinks7 GBase over Q(i).
286     */
287    @SuppressWarnings({ "unchecked", "cast" })
288    public void testTrinks7GBaseCompl() {
289        GroebnerBase<Complex<BigRational>> bbs = new GroebnerBaseSeq<Complex<BigRational>>(
290                        new ReductionSeq<Complex<BigRational>>(),
291                        new OrderedSyzPairlist<Complex<BigRational>>());
292        GroebnerBase<Complex<BigRational>> bb = new GroebnerBaseFGLM<Complex<BigRational>>();
293        String exam = "Complex (B,S,T,Z,P,W) L " + "( " + "( 45 P + 35 S - 165 B - 36 ), "
294                        + "( 35 P + 40 Z + 25 T - 27 S ), " + "( 15 W + 25 S P + 30 Z - 18 T - 165 B**2 ), "
295                        + "( - 9 W + 15 T P + 20 S Z ), " + "( P W + 2 T Z - 11 B**3 ), "
296                        + "( 99 W - 11 B S + 3 B**2 ), " + "( B**2 + 33/50 B + 2673/10000 ) " + ") ";
297
298        Reader source = new StringReader(exam);
299        GenPolynomialTokenizer parser = new GenPolynomialTokenizer(source);
300        PolynomialList<Complex<BigRational>> F = null;
301        List<GenPolynomial<Complex<BigRational>>> G, Gs;
302        try {
303            F = (PolynomialList<Complex<BigRational>>) parser.nextPolynomialSet();
304        } catch (ClassCastException e) {
305            fail("" + e);
306        } catch (IOException e) {
307            fail("" + e);
308        }
309        //System.out.println("F = " + F);
310
311        G = bb.GB(F.list);
312        PolynomialList<Complex<BigRational>> trinks = new PolynomialList<Complex<BigRational>>(F.ring, G);
313        //System.out.println("G = " + trinks);
314        assertTrue("isGB( GB(Trinks7) )", bb.isGB(G));
315        assertEquals("#GB(Trinks7) == 6", 6, G.size());
316
317        Gs = bbs.GB(F.list);
318        PolynomialList<Complex<BigRational>> trinks2 = new PolynomialList<Complex<BigRational>>(F.ring, Gs);
319        //System.out.println("Gs = " + trinks2);
320        assertTrue("isGB( GB(Trinks7) )", bb.isGB(Gs));
321        assertEquals("#GB(Trinks7) == 6", 6, Gs.size());
322
323        assertEquals("GB == FGLM", trinks, trinks2);
324    }
325
326}