001/* 002 * $Id$ 003 */ 004 005package edu.jas.poly; 006 007 008import junit.framework.Test; 009import junit.framework.TestCase; 010import junit.framework.TestSuite; 011 012 013import edu.jas.arith.ModInteger; 014import edu.jas.arith.ModIntegerRing; 015 016 017/** 018 * ModInteger coefficients GenSolvablePolynomial tests with JUnit. 019 * @author Heinz Kredel 020 */ 021 022public class ModGenSolvablePolynomialTest extends TestCase { 023 024 025 /** 026 * main 027 */ 028 public static void main(String[] args) { 029 junit.textui.TestRunner.run(suite()); 030 } 031 032 033 /** 034 * Constructs a <CODE>ModGenSolvablePolynomialTest</CODE> object. 035 * @param name String. 036 */ 037 public ModGenSolvablePolynomialTest(String name) { 038 super(name); 039 } 040 041 042 /** 043 * suite. 044 */ 045 public static Test suite() { 046 TestSuite suite = new TestSuite(ModGenSolvablePolynomialTest.class); 047 return suite; 048 } 049 050 051 GenSolvablePolynomial<ModInteger> a, b, c, d, e, f, x1, x2; 052 053 054 int ml = 19; // modul 055 056 057 int rl = 5; 058 059 060 int kl = 10; 061 062 063 int ll = 5; 064 065 066 int el = 3; 067 068 069 float q = 0.5f; 070 071 072 RelationTable<ModInteger> table; 073 074 075 GenSolvablePolynomialRing<ModInteger> ring; 076 077 078 ModIntegerRing cfac; 079 080 081 @Override 082 protected void setUp() { 083 cfac = new ModIntegerRing(ml); 084 ring = new GenSolvablePolynomialRing<ModInteger>(cfac, rl); 085 table = null; //ring.table; 086 a = b = c = d = e = null; 087 } 088 089 090 @Override 091 protected void tearDown() { 092 table = null; 093 ring = null; 094 a = b = c = d = e = null; 095 } 096 097 098 /** 099 * Test constructor and toString. 100 */ 101 public void testConstructor() { 102 a = new GenSolvablePolynomial<ModInteger>(ring); 103 assertTrue("length( a ) = 0", a.length() == 0); 104 assertTrue("isZERO( a )", a.isZERO()); 105 assertTrue("isONE( a )", !a.isONE()); 106 107 c = ring.getONE(); 108 assertTrue("length( c ) = 1", c.length() == 1); 109 assertTrue("isZERO( c )", !c.isZERO()); 110 assertTrue("isONE( c )", c.isONE()); 111 112 d = ring.getZERO(); 113 assertTrue("length( d ) = 0", d.length() == 0); 114 assertTrue("isZERO( d )", d.isZERO()); 115 assertTrue("isONE( d )", !d.isONE()); 116 } 117 118 119 /** 120 * Test random polynomial. 121 */ 122 public void testRandom() { 123 assertTrue("isCommutative()", ring.isCommutative()); 124 125 for (int i = 0; i < 2; i++) { 126 // a = ring.random(ll+2*i); 127 a = ring.random(kl * (i + 1), ll + 2 * i, el + i, q); 128 assertTrue("length( a" + i + " ) <> 0", a.length() >= 0); 129 assertTrue(" not isZERO( a" + i + " )", !a.isZERO()); 130 assertTrue(" not isONE( a" + i + " )", !a.isONE()); 131 } 132 } 133 134 135 /** 136 * Test addition. 137 */ 138 public void testAddition() { 139 a = ring.random(kl, ll, el, q); 140 141 c = (GenSolvablePolynomial<ModInteger>) a.subtract(a); 142 assertTrue("a-a = 0", c.isZERO()); 143 144 b = (GenSolvablePolynomial<ModInteger>) a.sum(a); 145 c = (GenSolvablePolynomial<ModInteger>) b.subtract(a); 146 147 assertEquals("a+a-a = a", c, a); 148 assertTrue("a+a-a = a", c.equals(a)); 149 150 b = ring.random(kl, ll, el, q); 151 c = (GenSolvablePolynomial<ModInteger>) b.sum(a); 152 d = (GenSolvablePolynomial<ModInteger>) a.sum(b); 153 154 assertEquals("a+b = b+a", c, d); 155 assertTrue("a+b = b+a", c.equals(d)); 156 157 c = ring.random(kl, ll, el, q); 158 d = (GenSolvablePolynomial<ModInteger>) a.sum(b.sum(c)); 159 e = (GenSolvablePolynomial<ModInteger>) a.sum(b).sum(c); 160 161 assertEquals("a+(b+c) = (a+b)+c", d, e); 162 assertTrue("a+(b+c) = (a+b)+c", d.equals(e)); 163 164 ExpVector u = ExpVector.random(rl, el, q); 165 ModInteger x = cfac.random(kl); 166 167 b = ring.getONE().multiply(x, u); 168 c = (GenSolvablePolynomial<ModInteger>) a.sum(b); 169 d = (GenSolvablePolynomial<ModInteger>) a.sum(x, u); 170 assertEquals("a+p(x,u) = a+(x,u)", c, d); 171 172 c = (GenSolvablePolynomial<ModInteger>) a.subtract(b); 173 d = (GenSolvablePolynomial<ModInteger>) a.subtract(x, u); 174 assertEquals("a-p(x,u) = a-(x,u)", c, d); 175 176 a = ring.getZERO(); 177 b = ring.getONE().multiply(x, u); 178 c = (GenSolvablePolynomial<ModInteger>) b.sum(a); 179 d = (GenSolvablePolynomial<ModInteger>) a.sum(x, u); 180 assertEquals("a+p(x,u) = a+(x,u)", c, d); 181 182 c = (GenSolvablePolynomial<ModInteger>) a.subtract(b); 183 d = (GenSolvablePolynomial<ModInteger>) a.subtract(x, u); 184 assertEquals("a-p(x,u) = a-(x,u)", c, d); 185 } 186 187 188 /** 189 * Test multiplication. 190 */ 191 @SuppressWarnings("cast") 192 public void testMultiplication() { 193 a = ring.random(kl, ll, el, q); 194 assertTrue("not isZERO( a )", !a.isZERO()); 195 //a = ModGenSolvablePolynomial.DIRRAS(1, kl, 4, el, q ); 196 197 b = ring.random(kl, ll, el, q); 198 assertTrue("not isZERO( b )", !b.isZERO()); 199 200 c = b.multiply(a); 201 d = a.multiply(b); 202 assertTrue("not isZERO( c )", !c.isZERO()); 203 assertTrue("not isZERO( d )", !d.isZERO()); 204 205 e = (GenSolvablePolynomial<ModInteger>) d.subtract(c); 206 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO()); 207 208 assertEquals("a*b = b*a", c, d); 209 assertTrue("a*b = b*a", c.equals(d)); 210 211 c = ring.random(kl, ll, el, q); 212 d = a.multiply(b.multiply(c)); 213 e = (a.multiply(b)).multiply(c); 214 215 assertEquals("a(bc) = (ab)c", d, e); 216 assertTrue("a(bc) = (ab)c", d.equals(e)); 217 218 ModInteger x = a.leadingBaseCoefficient().inverse(); 219 c = (GenSolvablePolynomial<ModInteger>) a.monic(); 220 d = a.multiply(x); 221 assertEquals("a.monic() = a(1/ldcf(a))", c, d); 222 223 ExpVector u = ring.evzero; 224 ModInteger y = b.leadingBaseCoefficient().inverse(); 225 c = (GenSolvablePolynomial<ModInteger>) b.monic(); 226 d = b.multiply(y, u); 227 assertEquals("b.monic() = b(1/ldcf(b))", c, d); 228 229 e = ring.getONE().multiply(y, u); 230 d = b.multiply(e); 231 assertEquals("b.monic() = b(1/ldcf(b))", c, d); 232 233 d = e.multiply(b); 234 assertEquals("b.monic() = (1/ldcf(b) (0))*b", c, d); 235 236 d = a.monic(); 237 assertTrue("a.monic(): ", d.leadingBaseCoefficient().isONE()); 238 } 239 240 241 /** 242 * Test Weyl polynomials. 243 */ 244 public void testWeyl() { 245 int rloc = 4; 246 ring = new GenSolvablePolynomialRing<ModInteger>(cfac, rloc); 247 248 RelationGenerator<ModInteger> wl = new WeylRelations<ModInteger>(); 249 wl.generate(ring); 250 //table = ring.table; 251 //System.out.println("table = " + table); 252 //System.out.println("ring = " + ring); 253 254 assertFalse("isCommutative()", ring.isCommutative()); 255 assertTrue("isAssociative()", ring.isAssociative()); 256 257 a = ring.random(kl, ll, el + 2, q); 258 assertTrue("not isZERO( a )", !a.isZERO()); 259 //System.out.println("a = " + a); 260 261 b = ring.random(kl, ll, el + 2, q); 262 assertTrue("not isZERO( b )", !b.isZERO()); 263 //System.out.println("b = " + b); 264 265 266 // non commutative 267 c = b.multiply(a); 268 d = a.multiply(b); 269 //System.out.println("c = " + c); 270 //System.out.println("d = " + d); 271 assertTrue("not isZERO( c )", !c.isZERO()); 272 assertTrue("not isZERO( d )", !d.isZERO()); 273 274 e = (GenSolvablePolynomial<ModInteger>) d.subtract(c); 275 assertTrue("!isZERO( a*b-b*a ) " + e, !e.isZERO()); 276 assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector())); 277 278 c = ring.random(kl, ll, el, q); 279 //System.out.println("\na = " + a); 280 //System.out.println("\nb = " + b); 281 //System.out.println("\nc = " + c); 282 283 // associative 284 //x1 = b.multiply(c); 285 //System.out.println("\nx1 = " + x1); 286 d = a.multiply(b.multiply(c)); 287 288 //x2 = a.multiply(b); 289 //System.out.println("\nx2 = " + x2); 290 e = a.multiply(b).multiply(c); 291 292 //System.out.println("\nd = " + d); 293 //System.out.println("\ne = " + e); 294 295 //f = (GenSolvablePolynomial<ModInteger>)d.subtract(e); 296 //System.out.println("\nf = " + f); 297 298 assertEquals("a(bc) = (ab)c", d, e); 299 assertTrue("a(bc) = (ab)c", d.equals(e)); 300 } 301 302 303 /** 304 * Test BLAS level 1. 305 */ 306 public void testBLAS1() { 307 int rloc = 4; 308 ring = new GenSolvablePolynomialRing<ModInteger>(cfac, rloc); 309 RelationGenerator<ModInteger> wl = new WeylRelations<ModInteger>(); 310 wl.generate(ring); 311 table = ring.table; 312 //System.out.println("table = " + table); 313 //System.out.println("ring = " + ring); 314 315 a = ring.random(kl,ll,el,q); 316 b = ring.random(kl,ll,el,q); 317 ExpVector ev = ExpVector.random(rloc,el,q); 318 ModInteger lc = cfac.random(kl); 319 320 d = a.subtractMultiple(lc,b); 321 e = (GenSolvablePolynomial<ModInteger>) a.subtract( b.multiply(lc) ); 322 assertEquals("a - (lc) b == a - ((lc) b)",d,e); 323 324 d = a.subtractMultiple(lc,ev,b); 325 e = (GenSolvablePolynomial<ModInteger>) a.subtract( b.multiplyLeft(lc,ev) ); 326 assertEquals("a - (lc ev) b == a - ((lc ev) b): " + lc + ", " + ev, d, e); 327 328 ExpVector fv = ExpVector.random(rloc,el,q); 329 ModInteger tc = cfac.random(kl); 330 331 d = a.scaleSubtractMultiple(tc,lc,ev,b); 332 e = (GenSolvablePolynomial<ModInteger>) a.multiplyLeft(tc).subtract( b.multiplyLeft(lc,ev) ); 333 assertEquals("(tc) a - (lc ev) b == ((tc) a - ((lc ev) b))",d,e); 334 335 d = a.scaleSubtractMultiple(tc,fv,lc,ev,b); 336 e = (GenSolvablePolynomial<ModInteger>) a.multiplyLeft(tc,fv).subtract( b.multiplyLeft(lc,ev) ); 337 assertEquals("(tc fv) a - (lc ev) b == ((tc fv) a - ((lc ev) b)): " + tc + ", " + fv + ", " + lc + ", " + ev, d, e); 338 339 d = a.scaleSubtractMultiple(tc,lc,b); 340 e = (GenSolvablePolynomial<ModInteger>) a.multiplyLeft(tc).subtract( b.multiplyLeft(lc) ); 341 assertEquals("tc a - lc b == (tc a) - (lc b)",d,e); 342 } 343 344 345 /** 346 * Test distributive law. 347 */ 348 public void testDistributive() { 349 int rloc = 4; 350 ring = new GenSolvablePolynomialRing<ModInteger>(cfac, rloc); 351 352 RelationGenerator<ModInteger> wl = new WeylRelations<ModInteger>(); 353 wl.generate(ring); 354 //table = ring.table; 355 //System.out.println("table = " + table); 356 //System.out.println("ring = " + ring); 357 358 a = ring.random(kl, ll, el, q); 359 b = ring.random(kl, ll, el, q); 360 c = ring.random(kl, ll, el, q); 361 362 d = a.multiply((GenSolvablePolynomial<ModInteger>) b.sum(c)); 363 e = (GenSolvablePolynomial<ModInteger>) a.multiply(b).sum(a.multiply(c)); 364 365 assertEquals("a(b+c) = ab+ac", d, e); 366 } 367 368}