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}