001    /*
002     * $Id: RGroebnerBaseSeqTest.java 3423 2010-12-24 10:56:50Z kredel $
003     */
004    
005    package edu.jas.gbufd;
006    
007    
008    import java.io.IOException;
009    import java.io.Reader;
010    import java.io.StringReader;
011    import java.util.ArrayList;
012    import java.util.List;
013    
014    import junit.framework.Test;
015    import junit.framework.TestCase;
016    import junit.framework.TestSuite;
017    
018    import org.apache.log4j.BasicConfigurator;
019    
020    import edu.jas.arith.BigInteger;
021    import edu.jas.arith.BigRational;
022    import edu.jas.arith.ModInteger;
023    import edu.jas.arith.ModIntegerRing;
024    import edu.jas.arith.Product;
025    import edu.jas.arith.ProductRing;
026    import edu.jas.gb.GroebnerBase;
027    import edu.jas.poly.GenPolynomial;
028    import edu.jas.poly.GenPolynomialRing;
029    import edu.jas.poly.GenPolynomialTokenizer;
030    import edu.jas.poly.PolynomialList;
031    import edu.jas.poly.TermOrder;
032    import edu.jas.poly.PolyUtil;
033    import edu.jas.structure.RingFactory;
034    
035    
036    /**
037     * R-Groebner base sequential tests with JUnit.
038     * @author Heinz Kredel.
039     */
040    
041    public class RGroebnerBaseSeqTest extends TestCase {
042    
043    
044        //private static final Logger logger = Logger.getLogger(RGroebnerBaseSeqTest.class);
045    
046        /**
047         * main
048         */
049        public static void main(String[] args) {
050            BasicConfigurator.configure();
051            junit.textui.TestRunner.run(suite());
052        }
053    
054    
055        /**
056         * Constructs a <CODE>RGroebnerBaseSeqTest</CODE> object.
057         * @param name String.
058         */
059        public RGroebnerBaseSeqTest(String name) {
060            super(name);
061        }
062    
063    
064        /**
065         * suite.
066         */
067        public static Test suite() {
068            TestSuite suite = new TestSuite(RGroebnerBaseSeqTest.class);
069            return suite;
070        }
071    
072    
073        ProductRing<BigRational> pfac;
074    
075    
076        GenPolynomialRing<Product<BigRational>> fac;
077    
078    
079        List<GenPolynomial<Product<BigRational>>> L;
080    
081    
082        PolynomialList<Product<BigRational>> F;
083    
084    
085        List<GenPolynomial<Product<BigRational>>> G;
086    
087    
088        GroebnerBase<Product<BigRational>> bb;
089    
090    
091        GenPolynomial<Product<BigRational>> a;
092    
093    
094        GenPolynomial<Product<BigRational>> b;
095    
096    
097        GenPolynomial<Product<BigRational>> c;
098    
099    
100        GenPolynomial<Product<BigRational>> d;
101    
102    
103        GenPolynomial<Product<BigRational>> e;
104    
105    
106        int rl = 3; //4; //3; 
107    
108    
109        int kl = 10;
110    
111    
112        int ll = 7;
113    
114    
115        int el = 3;
116    
117    
118        float q = 0.2f; //0.4f
119    
120    
121        @Override
122        protected void setUp() {
123            BigRational coeff = new BigRational(9);
124            pfac = new ProductRing<BigRational>(coeff, 4);
125            fac = new GenPolynomialRing<Product<BigRational>>(pfac, rl);
126            a = b = c = d = e = null;
127            bb = new RGroebnerBaseSeq<Product<BigRational>>();
128        }
129    
130    
131        @Override
132        protected void tearDown() {
133            a = b = c = d = e = null;
134            fac = null;
135            bb = null;
136        }
137    
138    
139        /**
140         * Test sequential GBase.
141         * 
142         */
143        public void testSequentialGBase() {
144    
145            L = new ArrayList<GenPolynomial<Product<BigRational>>>();
146    
147            a = fac.random(kl, ll, el, q);
148            b = fac.random(kl, ll, el, q);
149            c = fac.random(kl, ll, el, q);
150            d = fac.random(kl, ll, el, q);
151            e = d; //fac.random(kl, ll, el, q );
152    
153            if (a.isZERO() || b.isZERO() || c.isZERO() || d.isZERO()) {
154                return;
155            }
156    
157            assertTrue("not isZERO( a )", !a.isZERO());
158            L.add(a);
159    
160            L = bb.GB(L);
161            assertTrue("isGB( { a } )", bb.isGB(L));
162            //System.out.println("L = " + L );
163    
164            assertTrue("not isZERO( b )", !b.isZERO());
165            L.add(b);
166            //System.out.println("L = " + L.size() );
167    
168            L = bb.GB(L);
169            assertTrue("isGB( { a, b } )", bb.isGB(L));
170            //System.out.println("L = " + L );
171    
172            assertTrue("not isZERO( c )", !c.isZERO());
173            L.add(c);
174    
175            L = bb.GB(L);
176            assertTrue("isGB( { a, b, c } )", bb.isGB(L));
177            //System.out.println("L = " + L );
178    
179            assertTrue("not isZERO( d )", !d.isZERO());
180            L.add(d);
181    
182            L = bb.GB(L);
183            assertTrue("isGB( { a, b, c, d } )", bb.isGB(L));
184            //System.out.println("L = " + L );
185    
186            assertTrue("not isZERO( e )", !e.isZERO());
187            L.add(e);
188    
189            L = bb.GB(L);
190            assertTrue("isGB( { a, b, c, d, e } )", bb.isGB(L));
191            //System.out.println("L = " + L );
192        }
193    
194    
195        /**
196         * Test Trinks7 GBase.
197         * 
198         */
199        @SuppressWarnings("unchecked")
200        public void testTrinks7() {
201            String exam = "Z(B,S,T,Z,P,W) L " + "( " + "( 45 P + 35 S - 165 B - 36 ), "
202                    + "( 35 P + 40 Z + 25 T - 27 S ), "
203                    + "( 15 W + 25 S P + 30 Z - 18 T - 165 B**2 ), "
204                    + "( - 9 W + 15 T P + 20 S Z ), " + "( P W + 2 T Z - 11 B**3 ), "
205                    + "( 99 W - 11 B S + 3 B**2 ), " + "( 10000 B**2 + 6600 B + 2673 ) "
206                    + ") ";
207            Reader source = new StringReader(exam);
208            GenPolynomialTokenizer parser = new GenPolynomialTokenizer(source);
209    
210            PolynomialList<BigInteger> F = null;
211    
212            try {
213                F = (PolynomialList<BigInteger>) parser.nextPolynomialSet();
214            } catch (ClassCastException e) {
215                fail("" + e);
216            } catch (IOException e) {
217                fail("" + e);
218            }
219            //System.out.println("F = " + F);
220            int rl = F.ring.nvar;
221            TermOrder to = F.ring.tord;
222            String[] vars = F.ring.getVars();
223            PolynomialList<Product<ModInteger>> trinks;
224    
225            List<RingFactory<ModInteger>> colist;
226            colist = new ArrayList<RingFactory<ModInteger>>();
227    
228            //colist.add( new ModIntegerRing(2) );
229            //colist.add( new ModIntegerRing(3) );
230            //colist.add( new ModIntegerRing(5) );
231            //colist.add( new ModIntegerRing(30) ); // now ok, was not possible
232            colist.add(new ModIntegerRing(19));
233            colist.add(new ModIntegerRing(23));
234            //colist.add( new ModIntegerRing((2<<30)-19) );
235            //System.out.println("colist = " + colist);
236    
237            ProductRing<ModInteger> pfac;
238            pfac = new ProductRing<ModInteger>(colist);
239            //System.out.println("pfac   = " + pfac);
240    
241            GenPolynomialRing<Product<ModInteger>> fac;
242            fac = new GenPolynomialRing<Product<ModInteger>>(pfac, rl, to, vars);
243            //System.out.println("fac    = " + fac);
244    
245            List<GenPolynomial<Product<ModInteger>>> Fp;
246            Fp = PolyUtil.toProduct(fac, F.list);
247    
248            List<GenPolynomial<Product<ModInteger>>> Fpp;
249            Fpp = new ArrayList<GenPolynomial<Product<ModInteger>>>();
250    
251            for (GenPolynomial<Product<ModInteger>> a : Fp) {
252                Fpp.add(a.multiply(pfac.getAtomic(0)));
253                Fpp.add(a.multiply(pfac.getAtomic(1)));
254                //Fpp.add( a );
255            }
256            Fp = Fpp;
257    
258            trinks = new PolynomialList<Product<ModInteger>>(fac, Fp);
259            //System.out.println("Fp     = " + trinks);
260    
261            GroebnerBase<Product<ModInteger>> bbr = new RGroebnerBaseSeq<Product<ModInteger>>();
262    
263            List<GenPolynomial<Product<ModInteger>>> G;
264            G = bbr.GB(Fp);
265            //System.out.println("gb = " + G );
266    
267            //assertEquals("#GB(Trinks7) == 6", 6, G.size() );
268            //System.out.println("Fp = " + trinks);
269            trinks = new PolynomialList<Product<ModInteger>>(fac, G);
270            //System.out.println("G  = " + trinks);
271    
272            assertTrue("isGB( GB(Trinks7) )", bbr.isGB(G));
273        }
274    
275    
276    }