001/* 002 * $Id: WordResidueTest.java 5303 2015-08-16 17:11:07Z 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// import org.apache.log4j.Logger; 017 018import edu.jas.arith.BigRational; 019import edu.jas.poly.GenWordPolynomial; 020import edu.jas.poly.GenWordPolynomialRing; 021import edu.jas.structure.NotDivisibleException; 022import edu.jas.structure.NotInvertibleException; 023 024 025/** 026 * WordResidue tests with JUnit. 027 * @author Heinz Kredel. 028 */ 029 030public class WordResidueTest extends TestCase { 031 032 033 /** 034 * main. 035 */ 036 public static void main(String[] args) { 037 BasicConfigurator.configure(); 038 junit.textui.TestRunner.run(suite()); 039 } 040 041 042 /** 043 * Constructs a <CODE>WordResidueTest</CODE> object. 044 * @param name String. 045 */ 046 public WordResidueTest(String name) { 047 super(name); 048 } 049 050 051 /** 052 * suite. 053 */ 054 public static Test suite() { 055 TestSuite suite = new TestSuite(WordResidueTest.class); 056 return suite; 057 } 058 059 060 WordIdeal<BigRational> id; 061 062 063 WordResidueRing<BigRational> fac; 064 065 066 GenWordPolynomialRing<BigRational> mfac; 067 068 069 List<GenWordPolynomial<BigRational>> F; 070 071 072 WordResidue<BigRational> a, b, c, d, e, f; 073 074 075 int rl = 4; 076 077 078 int kl = 3; 079 080 081 int ll = 4; 082 083 084 int el = 2; 085 086 087 int il = (rl == 1 ? 1 : 2); 088 089 090 @Override 091 protected void setUp() { 092 a = b = c = d = e = null; 093 String[] vars = new String[] { "w", "x", "y", "z" }; 094 mfac = new GenWordPolynomialRing<BigRational>(new BigRational(1), vars); 095 //System.out.println("mfac = " + mfac.toScript()); 096 //GenWordPolynomial<BigRational> p1 = mfac.parse("w - x^2"); 097 //GenWordPolynomial<BigRational> p1 = mfac.parse("x + 49/12"); 098 //GenWordPolynomial<BigRational> p2 = mfac.parse("y - 5 * w - 65/28"); 099 do { 100 F = new ArrayList<GenWordPolynomial<BigRational>>(il); 101 for (int i = 0; i < il; i++) { 102 GenWordPolynomial<BigRational> mo = mfac.random(kl, ll, el); 103 while (mo.isConstant()) { 104 mo = mfac.random(kl, ll, el); 105 } 106 F.add(mo); 107 } 108 //F.add(p1); F.add(p2); 109 id = new WordIdeal<BigRational>(mfac, F); 110 id.doGB(); 111 } while (id.isONE()); 112 //System.out.println("id = " + id); 113 assert !id.isONE() : "id = " + id; 114 fac = new WordResidueRing<BigRational>(id); 115 //System.out.println("fac = " + fac.toScript()); 116 F = null; 117 } 118 119 120 @Override 121 protected void tearDown() { 122 a = b = c = d = e = null; 123 fac = null; 124 id = null; 125 mfac = null; 126 } 127 128 129 /** 130 * Test constructor and toString. 131 */ 132 public void testConstruction() { 133 c = fac.getONE(); 134 //System.out.println("c = " + c); 135 //System.out.println("c.val = " + c.val); 136 assertTrue("length( c ) = 1 ", c.val.length() == 1 || id.isONE()); 137 assertTrue("isZERO( c )", !c.isZERO() || id.isONE()); 138 assertTrue("isONE( c )", c.isONE() || id.isONE()); 139 140 d = fac.getZERO(); 141 //System.out.println("d = " + d); 142 //System.out.println("d.val = " + d.val); 143 assertTrue("length( d ) = 0", d.val.length() == 0); 144 assertTrue("isZERO( d )", d.isZERO()); 145 assertTrue("isONE( d )", !d.isONE()); 146 147 for (WordResidue<BigRational> g : fac.generators()) { 148 //System.out.println("g = " + g); 149 assertFalse("not isZERO( g )", g.isZERO()); 150 } 151 } 152 153 154 /** 155 * Test random polynomial. 156 */ 157 public void testRandom() { 158 for (int i = 1; i < 7; i++) { 159 //a = fac.random(ll+i); 160 a = fac.random(kl * i / 2, ll + i, el + i / 2); 161 //System.out.println("a = " + a); 162 if (a.isZERO() || a.isONE()) { 163 continue; 164 } 165 assertTrue("length( a" + i + " ) <> 0", a.val.length() >= 0); 166 assertTrue(" not isZERO( a" + i + " )", !a.isZERO()); 167 assertTrue(" not isONE( a" + i + " )", !a.isONE()); 168 } 169 } 170 171 172 /** 173 * Test addition. 174 */ 175 public void testAddition() { 176 a = fac.random(kl, ll, el + 1); 177 b = fac.random(kl, ll, el + 1); 178 //System.out.println("a = " + a); 179 //System.out.println("b = " + b); 180 181 c = a.sum(b); 182 d = c.subtract(b); 183 assertEquals("a+b-b = a", a, d); 184 185 c = a.sum(b); 186 d = b.sum(a); 187 assertEquals("a+b = b+a", c, d); 188 189 c = fac.random(kl, ll, el); 190 //System.out.println("c = " + c); 191 d = c.sum(a.sum(b)); 192 e = c.sum(a).sum(b); 193 assertEquals("c+(a+b) = (c+a)+b", d, e); 194 195 c = a.sum(fac.getZERO()); 196 d = a.subtract(fac.getZERO()); 197 assertEquals("a+0 = a-0", c, d); 198 199 c = fac.getZERO().sum(a); 200 d = fac.getZERO().subtract(a.negate()); 201 assertEquals("0+a = 0+(-a)", c, d); 202 } 203 204 205 /** 206 * Test multiplication. 207 */ 208 public void testMultiplication() { 209 List<WordResidue<BigRational>> g = fac.generators(); 210 //System.out.println("g = " + g); 211 //a = fac.random(kl,ll,el,q); 212 a = g.get(1); 213 if (a.isZERO()) { 214 a = fac.getONE(); //return; 215 } 216 assertTrue("not isZERO( a )", !a.isZERO()); 217 218 b = fac.random(kl, ll, el); 219 //b = g.get(g.size()-1); 220 if (b.isZERO()) { 221 b = fac.getONE(); //return; 222 } 223 assertTrue("not isZERO( b )", !b.isZERO()); 224 //System.out.println("a = " + a); 225 //System.out.println("b = " + b); 226 227 c = a.multiply(fac.getONE()); 228 d = fac.getONE().multiply(a); 229 assertEquals("a*1 = 1*a", c, d); 230 assertEquals("a*1 = 1*a", c, a); 231 232 c = b.multiply(a); 233 d = a.multiply(b); 234 assertTrue("not isZERO( c )", !c.isZERO()); 235 assertTrue("not isZERO( d )", !d.isZERO()); 236 237 //System.out.println("a = " + a); 238 //System.out.println("b = " + b); 239 //System.out.println("c = " + c); 240 //System.out.println("d = " + d); 241 //e = d.subtract(c); 242 //non-com: assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() ); 243 //non-com: assertEquals("a*b = b*a",c,d); 244 245 c = fac.random(kl, ll + 1, el); 246 //System.out.println("c = " + c); 247 d = a.multiply(b.multiply(c)); 248 e = a.multiply(b).multiply(c); 249 //System.out.println("d = " + d); 250 //System.out.println("e = " + e); 251 //System.out.println("d-e = " + d.subtract(e) ); 252 assertEquals("a(bc) = (ab)c", d, e); 253 //assertTrue("a(bc) = (ab)c", d.equals(e) ); 254 255 if (a.isUnit()) { // !a.isZERO() isUnit() 256 try { 257 c = a.inverse(); 258 //System.out.println("a = " + a); 259 //System.out.println("c = " + c); 260 d = c.multiply(a); 261 //System.out.println("d = " + d); 262 assertTrue("a*1/a = 1: " + fac, d.isONE()); // || true 263 } catch (NotInvertibleException e) { 264 // can happen 265 } catch (UnsupportedOperationException e) { 266 } 267 } 268 } 269 270 271 /** 272 * Test division. 273 */ 274 public void testDivision() { 275 List<WordResidue<BigRational>> g = fac.generators(); 276 //System.out.println("g = " + g); 277 //a = fac.random(kl,ll,el,q); 278 a = g.get(1); 279 if (a.isZERO()) { 280 a = fac.getONE(); 281 } 282 assertTrue("not isZERO( a )", !a.isZERO()); 283 284 b = fac.random(kl, ll, el + 2).monic(); 285 if (b.isZERO() || b.isONE()) { 286 b = g.get(g.size() - 1); 287 //b = fac.getONE(); 288 } 289 assertTrue("not isZERO( b )", !b.isZERO()); 290 //a = fac.parse("w"); 291 //b = fac.parse("w w + 79/360 z + 13/28 w"); 292 293 //System.out.println("a = " + a); 294 //System.out.println("b = " + b); 295 296 // left division 297 c = a.multiply(b); 298 //System.out.println("c = " + c); 299 try { 300 d = c.divide(b); 301 //System.out.println("d = " + d); 302 e = c.remainder(b); 303 //System.out.println("e = " + e); 304 305 f = d.multiply(b).sum(e); 306 //System.out.println("f = " + f); 307 assertEquals("c == f: ", c, f); 308 } catch (NotDivisibleException ex) { 309 // pass 310 System.out.println("ex = " + ex); 311 } 312 313 // right division 314 c = b.multiply(a); 315 //System.out.println("c = " + c); 316 try { 317 d = c.rightDivide(b); 318 //System.out.println("d = " + d); 319 e = c.rightRemainder(b); 320 //System.out.println("e = " + e); 321 322 f = b.multiply(d).sum(e); 323 //System.out.println("f = " + f); 324 assertEquals("c == f: ", c, f); 325 } catch (NotDivisibleException ex) { 326 // pass 327 System.out.println("ex = " + ex); 328 } 329 330 // two-sided division 331 c = a.multiply(b.multiply(a)); 332 //System.out.println("c = " + c); 333 try { 334 WordResidue<BigRational>[] dd = c.twosidedDivide(b); 335 //System.out.println("dd = " + dd[0] + " // " + dd[1]); 336 e = c.twosidedRemainder(b); 337 //System.out.println("e = " + e); 338 339 f = dd[0].multiply(b).multiply(dd[1]).sum(e); 340 //System.out.println("f = " + f); 341 //System.out.println("c-f = " + c.subtract(f)); 342 assertEquals("c == f: ", c, f); 343 } catch (NotDivisibleException ex) { 344 // pass 345 System.out.println("ex = " + ex); 346 } 347 } 348}