001/* 002 * $Id: SolvableLocalResidueTest.java 4668 2013-10-19 17:41:05Z kredel $ 003 */ 004 005package edu.jas.application; 006 007 008import java.util.ArrayList; 009import java.util.List; 010 011import junit.framework.Test; 012import junit.framework.TestCase; 013import junit.framework.TestSuite; 014 015import org.apache.log4j.BasicConfigurator; 016 017import edu.jas.arith.BigRational; 018import edu.jas.kern.ComputerThreads; 019import edu.jas.kern.PrettyPrint; 020import edu.jas.poly.GenSolvablePolynomial; 021import edu.jas.poly.GenSolvablePolynomialRing; 022import edu.jas.poly.RelationGenerator; 023import edu.jas.poly.TermOrder; 024import edu.jas.poly.WeylRelations; 025 026 027/** 028 * SolvableLocalResidue over BigRational GenSolvablePolynomial tests with JUnit. 029 * @author Heinz Kredel. 030 */ 031public class SolvableLocalResidueTest extends TestCase { 032 033 034 /** 035 * main. 036 */ 037 public static void main(String[] args) { 038 BasicConfigurator.configure(); 039 junit.textui.TestRunner.run(suite()); 040 } 041 042 043 /** 044 * Constructs a <CODE>SolvableLocalResidueTest</CODE> object. 045 * @param name String. 046 */ 047 public SolvableLocalResidueTest(String name) { 048 super(name); 049 } 050 051 052 /** 053 * suite. 054 */ 055 public static Test suite() { 056 TestSuite suite = new TestSuite(SolvableLocalResidueTest.class); 057 return suite; 058 } 059 060 061 SolvableLocalResidueRing<BigRational> efac; 062 063 064 GenSolvablePolynomialRing<BigRational> mfac; 065 066 067 SolvableIdeal<BigRational> id; 068 069 070 SolvableLocalResidue<BigRational> a, b, c, d, e; 071 072 073 SolvableLocalResidue<BigRational> az, bz, cz, dz, ez; 074 075 076 int rl = 4; 077 078 079 int kl = 2; 080 081 082 int ll = 3; //6; 083 084 085 int el = 2; 086 087 088 float q = 0.15f; 089 090 091 int il = (rl == 1 ? 1 : 2); 092 093 094 @Override 095 protected void setUp() { 096 a = b = c = d = e = null; 097 TermOrder to = new TermOrder(TermOrder.INVLEX); 098 String[] vars = new String[] { "w", "x", "y", "z" }; 099 mfac = new GenSolvablePolynomialRing<BigRational>(new BigRational(1), rl, to, vars); 100 RelationGenerator<BigRational> wl = new WeylRelations<BigRational>(); 101 wl.generate(mfac); 102 if (!mfac.isAssociative()) { 103 System.out.println("ring not associative: " + mfac); 104 } 105 //id = genRandomIdeal(); 106 //id = genIdealA(); 107 id = genPrimeIdealA(); 108 //System.out.println("id = " + id); 109 assert !id.isONE() : "id = " + id; 110 efac = new SolvableLocalResidueRing<BigRational>(id); 111 //System.out.println("efac = " + efac.toScript()); 112 } 113 114 115 protected SolvableIdeal<BigRational> genRandomIdeal() { 116 List<GenSolvablePolynomial<BigRational>> F; 117 do { 118 F = new ArrayList<GenSolvablePolynomial<BigRational>>(il); 119 for (int i = 0; i < il; i++) { 120 GenSolvablePolynomial<BigRational> mo = mfac.random(kl, ll, el + 1, q); 121 while (mo.isConstant()) { 122 mo = mfac.random(kl, ll, el + 1, q); 123 } 124 F.add(mo); 125 } 126 SolvableIdeal<BigRational> id = new SolvableIdeal<BigRational>(mfac, F); 127 id.doGB(); 128 } while (id.isONE()); 129 return id; 130 } 131 132 133 protected SolvableIdeal<BigRational> genIdealA() { 134 GenSolvablePolynomial<BigRational> p; 135 List<GenSolvablePolynomial<BigRational>> F; 136 F = new ArrayList<GenSolvablePolynomial<BigRational>>(il); 137 p = mfac.parse("y^2 - 42/5"); 138 F.add(p); 139 //p = mfac.parse("z^2"); 140 p = mfac.parse("x^2"); 141 F.add(p); 142 //p = mfac.parse("x^2 - w^2 "); 143 //F.add( p ); 144 SolvableIdeal<BigRational> id = new SolvableIdeal<BigRational>(mfac, F); 145 id.doGB(); 146 return id; 147 } 148 149 150 protected SolvableIdeal<BigRational> genPrimeIdealA() { // well, almost 151 GenSolvablePolynomial<BigRational> p; 152 List<GenSolvablePolynomial<BigRational>> F; 153 F = new ArrayList<GenSolvablePolynomial<BigRational>>(il); 154 p = mfac.parse("y^2 + 5"); 155 F.add(p); 156 p = mfac.parse("x^2 + 3"); 157 F.add(p); 158 SolvableIdeal<BigRational> id = new SolvableIdeal<BigRational>(mfac, F); 159 id.doGB(); 160 return id; 161 } 162 163 164 @Override 165 protected void tearDown() { 166 a = b = c = d = e = null; 167 //efac.terminate(); 168 efac = null; 169 ComputerThreads.terminate(); 170 } 171 172 173 /** 174 * Test constructor and toString. 175 */ 176 public void testConstruction() { 177 c = efac.getONE(); 178 //System.out.println("c = " + c); 179 //System.out.println("c.val = " + c.val); 180 assertTrue("length( c ) = 1", c.num.length() == 1); 181 assertTrue("isZERO( c )", !c.isZERO()); 182 assertTrue("isONE( c )", c.isONE()); 183 184 d = efac.getZERO(); 185 //System.out.println("d = " + d); 186 //System.out.println("d.val = " + d.val); 187 assertTrue("length( d ) = 0", d.num.length() == 0); 188 assertTrue("isZERO( d )", d.isZERO()); 189 assertTrue("isONE( d )", !d.isONE()); 190 191 for (SolvableLocalResidue<BigRational> g : efac.generators()) { 192 //System.out.println("g = " + g); 193 assertFalse("not isZERO( g )", g.isZERO()); 194 } 195 //wrong, solved: 196 assertTrue("isAssociative: ", efac.isAssociative()); 197 } 198 199 200 /** 201 * Test random polynomial. 202 */ 203 public void testRandom() { 204 for (int i = 0; i < 4; i++) { 205 //a = efac.random(ll+i); 206 a = efac.random(kl + i, ll + 1, el, q); 207 //System.out.println("a = " + a); 208 if (a.isZERO() || a.isONE()) { 209 continue; 210 } 211 assertTrue("length( a" + i + " ) <> 0", a.num.length() >= 0); 212 assertTrue(" not isZERO( a" + i + " )", !a.isZERO()); 213 assertTrue(" not isONE( a" + i + " )", !a.isONE()); 214 assertEquals("a == a: ", a, a); 215 } 216 } 217 218 219 /** 220 * Test addition. 221 */ 222 public void testAddition() { 223 a = efac.random(kl, ll, el, q); 224 b = efac.random(kl, ll, el, q); 225 //a = efac.parse("{ 1 | w * x + 25/28 }"); 226 //b = efac.parse("{ x - 35/18 | x + 2 w - 6 }"); 227 //!a = efac.parse("{ x - 1/7 | y * z + 7/10 }"); 228 //!b = efac.parse("{ 1 | w + 3 }"); 229 //a = efac.parse("{ 1 | y * z + 7/10 }"); 230 //b = efac.parse("{ x - 1/7 | w + 3 }"); 231 //a = efac.parse("{ ( -21/10 ) z - 5/4 x | x * z - 1/2 x + 1/2 }"); 232 //b = efac.parse("{ 1 | z^2 - 63/5 }"); 233 //a = efac.parse("{ 1 | z - 92/105 }"); 234 //b = efac.parse("{ 1 | x }"); // when not prime 235 //a = efac.parse("{ x - 3 | z + 5 }"); 236 //b = efac.parse("{ w + 2 | z - x * y }"); 237 //b = new SolvableLocalResidue<BigRational>(efac,efac.ideal.getList().get(0)); 238 //b = a.negate(); 239 //System.out.println("a = " + a); 240 //System.out.println("b = " + b); 241 242 c = a.sum(efac.getZERO()); 243 d = a.subtract(efac.getZERO()); 244 assertEquals("a+0 = a-0", c, d); 245 246 c = efac.getZERO().sum(a); 247 d = efac.getZERO().subtract(a.negate()); 248 assertEquals("0+a = 0-(-a)", c, d); 249 250 c = a.sum(b); 251 d = b.sum(a); 252 //System.out.println("c = " + c); 253 //System.out.println("d = " + d); 254 assertEquals("a+b = b+a", c, d); 255 256 c = a.sum(b); 257 //System.out.println("c = " + c); 258 d = c.subtract(b); 259 //System.out.println("d = " + d); 260 //System.out.println("a = " + a); 261 assertEquals("(a+b)-b = a: b = " + b, a, d); 262 263 c = efac.random(kl, ll, el, q); 264 //c = new SolvableLocalResidue<BigRational>(efac, mfac.univariate(1, 2)); 265 //c = efac.parse("{ 42/5 }"); 266 //System.out.println("c = " + c); 267 d = c.sum(a.sum(b)); 268 e = c.sum(a).sum(b); 269 //System.out.println("d = " + d); 270 //System.out.println("e = " + e); 271 //System.out.println("d-e = " + d.subtract(e)); 272 assertEquals("c+(a+b) = (c+a)+b: a = " + a + ", b = " + b + ", c = " + c, d, e); 273 } 274 275 276 /** 277 * Test multiplication. 278 */ 279 public void testMultiplication() { 280 a = efac.random(kl, ll, el, q); 281 b = efac.random(kl, ll, el, q); 282 //System.out.println("a = " + a); 283 //System.out.println("b = " + b); 284 285 c = a.multiply(efac.getONE()); 286 d = efac.getONE().multiply(a); 287 //System.out.println("c = " + c); 288 //System.out.println("d = " + d); 289 assertEquals("a*1 = 1*a", c, a); 290 assertEquals("a*1 = 1*a", c, d); 291 292 c = b.multiply(a); 293 d = a.multiply(b); 294 //System.out.println("c = " + c); 295 //System.out.println("d = " + d); 296 //non-com TODO 297 //assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector()) ); 298 299 //c = efac.random(kl,ll,el,q); 300 c = new SolvableLocalResidue<BigRational>(efac, mfac.univariate(1, 2)); 301 //System.out.println("c = " + c); 302 d = a.multiply(b.multiply(c)); 303 //System.out.println("d = " + d); 304 e = (a.multiply(b)).multiply(c); 305 //System.out.println("e = " + e); 306 assertEquals("a(bc) = (ab)c", d, e); 307 } 308 309 310 /** 311 * Test inverse. 312 */ 313 public void testInverse() { 314 a = efac.random(kl, ll + 1, el + 1, q * 1.15f); 315 //System.out.println("a = " + a); 316 b = new SolvableLocalResidue<BigRational>(efac, mfac.getONE(), mfac.univariate(1, 2)); 317 //System.out.println("b = " + b); 318 a = a.multiply(b); 319 //System.out.println("a = " + a); 320 321 if (a.isUnit()) { // true if != 0 322 c = a.inverse(); 323 //System.out.println("c = " + c); 324 d = c.multiply(a); 325 //d = a.multiply(c); 326 //System.out.println("d = " + d); 327 assertTrue("1/a * a = 1", d.isONE()); 328 d = c.inverse(); 329 //System.out.println("d = " + d); 330 //System.out.println("a = " + a); 331 //System.out.println("c = " + c); 332 //System.out.println("a-d = " + a.subtract(d)); 333 assertEquals("1/(1/a) = a", a, d); 334 } 335 } 336 337 338 /** 339 * Test roots (eval mod ideal). todo 340 */ 341 public void testRoot() { 342 c = efac.parse("y"); 343 //System.out.println("c = " + c); 344 d = efac.parse("5"); 345 //System.out.println("d = " + d); 346 e = c.multiply(c).sum(d); 347 //System.out.println("e = " + e); 348 assertTrue("e == 0 mod ideal", e.isZERO()); 349 for (GenSolvablePolynomial<BigRational> p : efac.ideal.getList()) { 350 String s = p.toString(); 351 //System.out.println("s = " + s); 352 e = efac.parse(s); // eval mod ideal 353 //System.out.println("e = " + e); 354 assertTrue("e == 0 mod ideal", e.isZERO()); 355 } 356 } 357 358 359 /** 360 * Test parse. 361 */ 362 public void testParse() { 363 a = efac.random(kl, ll, el, q); 364 //PrettyPrint.setInternal(); 365 //System.out.println("a = " + a); 366 PrettyPrint.setPretty(); 367 //System.out.println("a = " + a); 368 String p = a.toString(); 369 //System.out.println("p = " + p); 370 b = efac.parse(p); 371 //System.out.println("b = " + b); 372 assertEquals("parse(a.toSting()) = a", a, b); 373 } 374 375}