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