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