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