001/*
002 * $Id: GroebnerBaseFGLMTest.java 5048 2014-12-30 17:45:01Z 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 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 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    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("cast")
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        @SuppressWarnings("unused")
144        String exam2 = "(x,y,z) L " + "( " + "( z y**2 + 2 x + 1/2 )" + "( z x**2 - y**2 - 1/2 x )"
145                        + "( -z + y**2 x + 4 x**2 + 1/4 )" + " )";
146
147        Reader source = new StringReader(exam);
148        GenPolynomialTokenizer parser = new GenPolynomialTokenizer(source);
149        try {
150            F = (PolynomialList<BigRational>) parser.nextPolynomialSet();
151        } catch (ClassCastException e) {
152            fail("" + e);
153        } catch (IOException e) {
154            fail("" + e);
155        }
156        //System.out.println("F = " + F);
157
158        G = bb.GB(F.list);
159        PolynomialList<BigRational> trinks = new PolynomialList<BigRational>(F.ring, G);
160        //System.out.println("G = " + trinks);
161        assertTrue("isGB( GB(Trinks7) )", bb.isGB(G));
162        assertEquals("#GB(Trinks7) == 6", 6, G.size());
163
164        Gs = bbs.GB(F.list);
165        PolynomialList<BigRational> trinks2 = new PolynomialList<BigRational>(F.ring, Gs);
166        assertTrue("isGB( GB(Trinks7) )", bb.isGB(Gs));
167        assertEquals("#GB(Trinks7) == 6", 6, Gs.size());
168
169        assertEquals("GB == FGLM", trinks, trinks2);
170    }
171
172
173    /**
174     * Test Trinks6 GBase.
175     */
176    @SuppressWarnings("cast")
177    public void testTrinks6GBase() {
178        GroebnerBase<BigRational> bbs = new GroebnerBaseSeq<BigRational>(new ReductionSeq<BigRational>(),
179                        new OrderedSyzPairlist<BigRational>());
180        String exam = "(B,S,T,Z,P,W) L " + "( " + "( 45 P + 35 S - 165 B - 36 ), "
181                        + "( 35 P + 40 Z + 25 T - 27 S ), " + "( 15 W + 25 S P + 30 Z - 18 T - 165 B**2 ), "
182                        + "( - 9 W + 15 T P + 20 S Z ), " + "( P W + 2 T Z - 11 B**3 ), "
183                        + "( 99 W - 11 B S + 3 B**2 ), " + ") ";
184
185        Reader source = new StringReader(exam);
186        GenPolynomialTokenizer parser = new GenPolynomialTokenizer(source);
187        try {
188            F = (PolynomialList<BigRational>) parser.nextPolynomialSet();
189        } catch (ClassCastException e) {
190            fail("" + e);
191        } catch (IOException e) {
192            fail("" + e);
193        }
194        //System.out.println("F = " + F);
195
196        G = bb.GB(F.list);
197        PolynomialList<BigRational> trinks = new PolynomialList<BigRational>(F.ring, G);
198        //System.out.println("G = " + trinks);
199        assertTrue("isGB( GB(Trinks7) )", bb.isGB(G));
200        assertEquals("#GB(Trinks7) == 6", 6, G.size());
201
202        Gs = bbs.GB(F.list);
203        PolynomialList<BigRational> trinks2 = new PolynomialList<BigRational>(F.ring, Gs);
204        assertTrue("isGB( GB(Trinks7) )", bb.isGB(Gs));
205        assertEquals("#GB(Trinks7) == 6", 6, Gs.size());
206
207        assertEquals("GB == FGLM", trinks, trinks2);
208    }
209
210
211    /**
212     * Test Trinks7 GBase over Q(sqrt(2)).
213     */
214    @SuppressWarnings("cast")
215    public void testTrinks7GBaseSqrt() {
216        GroebnerBase<AlgebraicNumber<BigRational>> bbs = new GroebnerBaseSeq<AlgebraicNumber<BigRational>>(
217                        new ReductionSeq<AlgebraicNumber<BigRational>>(),
218                        new OrderedSyzPairlist<AlgebraicNumber<BigRational>>());
219        GroebnerBase<AlgebraicNumber<BigRational>> bb = new GroebnerBaseFGLM<AlgebraicNumber<BigRational>>();
220        String exam = "AN[ (w2) (w2^2 - 2) ] (B,S,T,Z,P,W) L " + "( " + "( 45 P + 35 S - 165 B - 36 ), "
221                        + "( 35 P + 40 Z + 25 T - 27 S ), " + "( 15 W + 25 S P + 30 Z - 18 T - 165 B**2 ), "
222                        + "( - 9 W + 15 T P + 20 S Z ), " + "( P W + 2 T Z - 11 B**3 ), "
223                        + "( 99 W - 11 B S + 3 B**2 ), " + "( B**2 + 33/50 B + 2673/10000 ) " + ") ";
224
225        Reader source = new StringReader(exam);
226        GenPolynomialTokenizer parser = new GenPolynomialTokenizer(source);
227        PolynomialList<AlgebraicNumber<BigRational>> F = null;
228        List<GenPolynomial<AlgebraicNumber<BigRational>>> G, Gs;
229        try {
230            F = (PolynomialList<AlgebraicNumber<BigRational>>) parser.nextPolynomialSet();
231        } catch (ClassCastException e) {
232            fail("" + e);
233        } catch (IOException e) {
234            fail("" + e);
235        }
236        //System.out.println("F = " + F);
237        GenPolynomialRing<AlgebraicNumber<BigRational>> pfac = F.ring;
238        AlgebraicNumberRing<BigRational> afac = (AlgebraicNumberRing<BigRational>) pfac.coFac;
239        //System.out.println("afac = " + afac);
240        afac = new AlgebraicNumberRing<BigRational>(afac.modul, true);
241        //System.out.println("afac = " + afac);
242        pfac = new GenPolynomialRing<AlgebraicNumber<BigRational>>(afac, pfac);
243        List<GenPolynomial<AlgebraicNumber<BigRational>>> Fp = new ArrayList<GenPolynomial<AlgebraicNumber<BigRational>>>(
244                        F.list.size());
245        for (GenPolynomial<AlgebraicNumber<BigRational>> p : F.list) {
246            GenPolynomial<AlgebraicNumber<BigRational>> pp = pfac.copy(p);
247            Fp.add(pp);
248        }
249        F = new PolynomialList<AlgebraicNumber<BigRational>>(pfac, Fp);
250
251        G = bb.GB(F.list);
252        PolynomialList<AlgebraicNumber<BigRational>> trinks = new PolynomialList<AlgebraicNumber<BigRational>>(
253                        F.ring, G);
254        //System.out.println("G = " + trinks);
255        assertTrue("isGB( GB(Trinks7) )", bb.isGB(G));
256        assertEquals("#GB(Trinks7) == 6", 6, G.size());
257
258        Gs = bbs.GB(F.list);
259        PolynomialList<AlgebraicNumber<BigRational>> trinks2 = new PolynomialList<AlgebraicNumber<BigRational>>(
260                        F.ring, Gs);
261        //System.out.println("Gs = " + trinks2);
262        assertTrue("isGB( GB(Trinks7) )", bb.isGB(Gs));
263        assertEquals("#GB(Trinks7) == 6", 6, Gs.size());
264
265        assertEquals("GB == FGLM", trinks, trinks2);
266    }
267
268
269    /**
270     * Test Trinks7 GBase over Q(i).
271     */
272    @SuppressWarnings("cast")
273    public void testTrinks7GBaseCompl() {
274        GroebnerBase<Complex<BigRational>> bbs = new GroebnerBaseSeq<Complex<BigRational>>(
275                        new ReductionSeq<Complex<BigRational>>(),
276                        new OrderedSyzPairlist<Complex<BigRational>>());
277        GroebnerBase<Complex<BigRational>> bb = new GroebnerBaseFGLM<Complex<BigRational>>();
278        String exam = "Complex (B,S,T,Z,P,W) L " + "( " + "( 45 P + 35 S - 165 B - 36 ), "
279                        + "( 35 P + 40 Z + 25 T - 27 S ), " + "( 15 W + 25 S P + 30 Z - 18 T - 165 B**2 ), "
280                        + "( - 9 W + 15 T P + 20 S Z ), " + "( P W + 2 T Z - 11 B**3 ), "
281                        + "( 99 W - 11 B S + 3 B**2 ), " + "( B**2 + 33/50 B + 2673/10000 ) " + ") ";
282
283        Reader source = new StringReader(exam);
284        GenPolynomialTokenizer parser = new GenPolynomialTokenizer(source);
285        PolynomialList<Complex<BigRational>> F = null;
286        List<GenPolynomial<Complex<BigRational>>> G, Gs;
287        try {
288            F = (PolynomialList<Complex<BigRational>>) parser.nextPolynomialSet();
289        } catch (ClassCastException e) {
290            fail("" + e);
291        } catch (IOException e) {
292            fail("" + e);
293        }
294        //System.out.println("F = " + F);
295
296        G = bb.GB(F.list);
297        PolynomialList<Complex<BigRational>> trinks = new PolynomialList<Complex<BigRational>>(F.ring, G);
298        //System.out.println("G = " + trinks);
299        assertTrue("isGB( GB(Trinks7) )", bb.isGB(G));
300        assertEquals("#GB(Trinks7) == 6", 6, G.size());
301
302        Gs = bbs.GB(F.list);
303        PolynomialList<Complex<BigRational>> trinks2 = new PolynomialList<Complex<BigRational>>(F.ring, Gs);
304        //System.out.println("Gs = " + trinks2);
305        assertTrue("isGB( GB(Trinks7) )", bb.isGB(Gs));
306        assertEquals("#GB(Trinks7) == 6", 6, Gs.size());
307
308        assertEquals("GB == FGLM", trinks, trinks2);
309    }
310
311}