001 002 /* 003 * $Id: ComplexTest.java 3364 2010-10-24 12:56:06Z kredel $ 004 */ 005 006 package edu.jas.poly; 007 008 //import java.util.ArrayList; 009 //import java.util.List; 010 011 import junit.framework.Test; 012 import junit.framework.TestCase; 013 import junit.framework.TestSuite; 014 015 import org.apache.log4j.BasicConfigurator; 016 //import org.apache.log4j.Logger; 017 018 import edu.jas.arith.BigRational; 019 import edu.jas.arith.BigInteger; 020 021 //import edu.jas.structure.RingElem; 022 023 024 025 /** 026 * Complex test with JUnit. 027 * @author Heinz Kredel. 028 */ 029 030 public class ComplexTest extends TestCase { 031 032 /** 033 * main. 034 */ 035 public static void main (String[] args) { 036 BasicConfigurator.configure(); 037 junit.textui.TestRunner.run( suite() ); 038 } 039 040 /** 041 * Constructs a <CODE>ComplexTest</CODE> object. 042 * @param name String. 043 */ 044 public ComplexTest(String name) { 045 super(name); 046 } 047 048 /** 049 * suite. 050 */ 051 public static Test suite() { 052 TestSuite suite= new TestSuite(ComplexTest.class); 053 return suite; 054 } 055 056 ComplexRing<BigInteger> fac; 057 GenPolynomialRing<BigRational> pfac; 058 ComplexRing< GenPolynomial<BigRational> > mfac; 059 060 Complex< BigInteger > a; 061 Complex< BigInteger > b; 062 Complex< BigInteger > c; 063 Complex< BigInteger > d; 064 Complex< BigInteger > e; 065 066 Complex< GenPolynomial<BigRational> > ap; 067 Complex< GenPolynomial<BigRational> > bp; 068 Complex< GenPolynomial<BigRational> > cp; 069 Complex< GenPolynomial<BigRational> > dp; 070 Complex< GenPolynomial<BigRational> > ep; 071 072 073 int rl = 1; 074 int kl = 13; 075 int ll = 7; 076 int el = 3; 077 float q = 0.4f; 078 int il = 2; 079 long p = 1152921504606846883L; // 2^60-93; 080 081 @Override 082 protected void setUp() { 083 a = b = c = d = e = null; 084 ap = bp = cp = dp = ep = null; 085 BigInteger cfac = new BigInteger(1); 086 fac = new ComplexRing<BigInteger>( cfac ); 087 pfac = new GenPolynomialRing<BigRational>( new BigRational(1), 1 ); 088 GenPolynomial<BigRational> mo = pfac.random(kl,ll,el,q); 089 while ( mo.isConstant() ) { 090 mo = pfac.random(kl,ll,el,q); 091 } 092 mfac = new ComplexRing<GenPolynomial<BigRational>>( pfac ); 093 } 094 095 @Override 096 protected void tearDown() { 097 a = b = c = d = e = null; 098 ap = bp = cp = dp = ep = null; 099 fac = null; 100 pfac = null; 101 mfac = null; 102 } 103 104 105 /** 106 * Test constructor for integer. 107 * 108 */ 109 public void testIntConstruction() { 110 c = fac.getONE(); 111 //System.out.println("c = " + c); 112 assertTrue("isZERO( c )", !c.isZERO() ); 113 assertTrue("isONE( c )", c.isONE() ); 114 115 d = fac.getZERO(); 116 //System.out.println("d = " + d); 117 assertTrue("isZERO( d )", d.isZERO() ); 118 assertTrue("isONE( d )", !d.isONE() ); 119 } 120 121 122 /** 123 * Test constructor for polynomial. 124 * 125 */ 126 public void testPolyConstruction() { 127 cp = mfac.getONE(); 128 assertTrue("isZERO( cp )", !cp.isZERO() ); 129 assertTrue("isONE( cp )", cp.isONE() ); 130 131 dp = mfac.getZERO(); 132 assertTrue("isZERO( dp )", dp.isZERO() ); 133 assertTrue("isONE( dp )", !dp.isONE() ); 134 } 135 136 137 /** 138 * Test random integer. 139 * 140 */ 141 public void testIntRandom() { 142 for (int i = 0; i < 7; i++) { 143 a = fac.random(kl*(i+1)); 144 if ( a.isZERO() ) { 145 continue; 146 } 147 //a = fac.random(kl*(i+1), ll+2*i, el+i, q ); 148 //System.out.println("a = " + a); 149 assertTrue(" not isZERO( a"+i+" )", !a.isZERO() ); 150 assertTrue(" not isONE( a"+i+" )", !a.isONE() ); 151 } 152 } 153 154 155 /** 156 * Test random polynomial. 157 * 158 */ 159 public void testPolyRandom() { 160 for (int i = 0; i < 7; i++) { 161 ap = mfac.random(kl+i); 162 if ( ap.isZERO() ) { 163 continue; 164 } 165 assertTrue(" not isZERO( ap"+i+" )", !ap.isZERO() ); 166 assertTrue(" not isONE( ap"+i+" )", !ap.isONE() ); 167 } 168 } 169 170 171 /** 172 * Test integer addition. 173 * 174 */ 175 public void testIntAddition() { 176 177 a = fac.random(kl); 178 b = fac.random(kl); 179 180 c = a.sum(b); 181 d = c.subtract(b); 182 assertEquals("a+b-b = a",a,d); 183 184 c = a.sum(b); 185 d = b.sum(a); 186 assertEquals("a+b = b+a",c,d); 187 188 c = fac.random(kl); 189 d = c.sum( a.sum(b) ); 190 e = c.sum( a ).sum(b); 191 assertEquals("c+(a+b) = (c+a)+b",d,e); 192 193 194 c = a.sum( fac.getZERO() ); 195 d = a.subtract( fac.getZERO() ); 196 assertEquals("a+0 = a-0",c,d); 197 198 c = fac.getZERO().sum( a ); 199 d = fac.getZERO().subtract( a.negate() ); 200 assertEquals("0+a = 0+(-a)",c,d); 201 } 202 203 204 /** 205 * Test polynomial addition. 206 * 207 */ 208 public void testPolyAddition() { 209 210 ap = mfac.random(kl); 211 bp = mfac.random(kl); 212 //System.out.println("a = " + a); 213 //System.out.println("b = " + b); 214 215 cp = ap.sum(bp); 216 dp = cp.subtract(bp); 217 assertEquals("a+b-b = a",ap,dp); 218 219 cp = ap.sum(bp); 220 dp = bp.sum(ap); 221 //System.out.println("c = " + c); 222 //System.out.println("d = " + d); 223 224 assertEquals("a+b = b+a",cp,dp); 225 226 cp = mfac.random(kl); 227 dp = cp.sum( ap.sum(bp) ); 228 ep = cp.sum( ap ).sum(bp); 229 assertEquals("c+(a+b) = (c+a)+b",dp,ep); 230 231 232 cp = ap.sum( mfac.getZERO() ); 233 dp = ap.subtract( mfac.getZERO() ); 234 assertEquals("a+0 = a-0",cp,dp); 235 236 cp = mfac.getZERO().sum( ap ); 237 dp = mfac.getZERO().subtract( ap.negate() ); 238 assertEquals("0+a = 0+(-a)",cp,dp); 239 } 240 241 242 /** 243 * Test integer multiplication. 244 * 245 */ 246 public void testIntMultiplication() { 247 248 a = fac.random(kl); 249 if ( a.isZERO() ) { 250 return; 251 } 252 assertTrue("not isZERO( a )", !a.isZERO() ); 253 254 b = fac.random(kl); 255 if ( b.isZERO() ) { 256 return; 257 } 258 assertTrue("not isZERO( b )", !b.isZERO() ); 259 260 c = b.multiply(a); 261 d = a.multiply(b); 262 assertTrue("not isZERO( c )", !c.isZERO() ); 263 assertTrue("not isZERO( d )", !d.isZERO() ); 264 265 //System.out.println("a = " + a); 266 //System.out.println("b = " + b); 267 e = d.subtract(c); 268 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() ); 269 270 assertTrue("a*b = b*a", c.equals(d) ); 271 assertEquals("a*b = b*a",c,d); 272 273 c = fac.random(kl); 274 //System.out.println("c = " + c); 275 d = a.multiply( b.multiply(c) ); 276 e = (a.multiply(b)).multiply(c); 277 278 //System.out.println("d = " + d); 279 //System.out.println("e = " + e); 280 281 //System.out.println("d-e = " + d.subtract(c) ); 282 283 assertEquals("a(bc) = (ab)c",d,e); 284 assertTrue("a(bc) = (ab)c", d.equals(e) ); 285 286 c = a.multiply( fac.getONE() ); 287 d = fac.getONE().multiply( a ); 288 assertEquals("a*1 = 1*a",c,d); 289 290 if ( a.isUnit() ) { 291 c = a.inverse(); 292 d = c.multiply(a); 293 //System.out.println("a = " + a); 294 //System.out.println("c = " + c); 295 //System.out.println("d = " + d); 296 assertTrue("a*1/a = 1",d.isONE()); 297 } 298 } 299 300 301 /** 302 * Test polynomial multiplication. 303 * 304 */ 305 public void testPolyMultiplication() { 306 307 ap = mfac.random(kl); 308 if ( ap.isZERO() ) { 309 return; 310 } 311 assertTrue("not isZERO( a )", !ap.isZERO() ); 312 313 bp = mfac.random(kl); 314 if ( bp.isZERO() ) { 315 return; 316 } 317 assertTrue("not isZERO( b )", !bp.isZERO() ); 318 319 cp = bp.multiply(ap); 320 dp = ap.multiply(bp); 321 assertTrue("not isZERO( c )", !cp.isZERO() ); 322 assertTrue("not isZERO( d )", !dp.isZERO() ); 323 324 //System.out.println("a = " + a); 325 //System.out.println("b = " + b); 326 ep = dp.subtract(cp); 327 assertTrue("isZERO( a*b-b*a ) " + ep, ep.isZERO() ); 328 329 assertTrue("a*b = b*a", cp.equals(dp) ); 330 assertEquals("a*b = b*a",cp,dp); 331 332 cp = mfac.random(kl); 333 //System.out.println("c = " + c); 334 dp = ap.multiply( bp.multiply(cp) ); 335 ep = (ap.multiply(bp)).multiply(cp); 336 337 //System.out.println("d = " + d); 338 //System.out.println("e = " + e); 339 340 //System.out.println("d-e = " + d.subtract(c) ); 341 342 assertEquals("a(bc) = (ab)c",dp,ep); 343 assertTrue("a(bc) = (ab)c", dp.equals(ep) ); 344 345 cp = ap.multiply( mfac.getONE() ); 346 dp = mfac.getONE().multiply( ap ); 347 assertEquals("a*1 = 1*a",cp,dp); 348 349 if ( ap.isUnit() ) { 350 cp = ap.inverse(); 351 dp = cp.multiply(ap); 352 //System.out.println("a = " + a); 353 //System.out.println("c = " + c); 354 //System.out.println("d = " + d); 355 assertTrue("a*1/a = 1",dp.isONE()); 356 } 357 } 358 359 360 /** 361 * Test integer division. 362 * 363 */ 364 public void testIntDivision() { 365 366 a = fac.random(kl*2); 367 if ( a.isZERO() ) { 368 return; 369 } 370 assertTrue("not isZERO( a )", !a.isZERO() ); 371 372 b = fac.random(kl); 373 if ( b.isZERO() ) { 374 return; 375 } 376 assertTrue("not isZERO( b )", !b.isZERO() ); 377 //System.out.println("a = " + a); 378 //System.out.println("b = " + b); 379 380 c = a.divide(b); 381 //System.out.println("c = " + c); 382 d = a.remainder(b); 383 //System.out.println("d = " + d); 384 385 e = b.multiply(c).sum(d); 386 //System.out.println("e = " + e); 387 assertEquals("a = b (a/b) + a%b ", a, e ); 388 389 c = a.gcd(b); 390 d = a.divide(c); 391 e = b.divide(c); 392 //System.out.println("c = " + c); 393 //System.out.println("d = " + d); 394 //System.out.println("e = " + e); 395 396 d = c.multiply(d); 397 e = c.multiply(e); 398 //System.out.println("d = " + d); 399 //System.out.println("e = " + e); 400 401 assertEquals("a/gcd(a,b)*gcd(a,b) = a ", a, d ); 402 assertEquals("b/gcd(a,b)*gcd(a,b) = b ", b, e ); 403 404 Complex<BigInteger>[] gf = a.egcd(b); 405 c = gf[0]; 406 d = gf[1]; 407 e = gf[2]; 408 //System.out.println("c = " + c); 409 //System.out.println("d = " + d); 410 //System.out.println("e = " + e); 411 d = d.multiply(a); 412 e = e.multiply(b); 413 d = d.sum( e ); 414 //System.out.println("d = " + d); 415 assertEquals("d*a + e*b = c = gcd(a,b)", c, d ); 416 } 417 418 419 /** 420 * Test polynomial division. 421 * 422 */ 423 public void testPolyDivision() { 424 425 ap = mfac.random(kl); 426 if ( ap.isZERO() ) { 427 return; 428 } 429 assertTrue("not isZERO( ap )", !ap.isZERO() ); 430 431 bp = mfac.random(kl/2); 432 if ( bp.isZERO() ) { 433 return; 434 } 435 assertTrue("not isZERO( bp )", !bp.isZERO() ); 436 //System.out.println("ap = " + ap); 437 //System.out.println("bp = " + bp); 438 439 cp = ap.divide(bp); 440 //System.out.println("cp = " + cp); 441 dp = ap.remainder(bp); 442 //System.out.println("dp = " + dp); 443 444 ep = bp.multiply(cp).sum(dp); 445 //System.out.println("ep = " + ep); 446 assertEquals("ap = bp (ap/bp) + ap%bp ", ap, ep ); 447 448 // not applicable: 449 // cp = ap.gcd(bp); 450 // dp = ap.divide(cp); 451 // ep = bp.divide(cp); 452 // System.out.println("cp = " + cp); 453 // System.out.println("dp = " + dp); 454 // System.out.println("ep = " + ep); 455 456 // dp = cp.multiply(dp); 457 // ep = cp.multiply(ep); 458 // System.out.println("dp = " + dp); 459 // System.out.println("ep = " + ep); 460 461 // assertEquals("ap/gcd(ap,bp)*gcd(ap,bp) = ap ", ap, dp ); 462 // assertEquals("bp/gcd(ap,bp)*gcd(ap,bp) = bp ", bp, ep ); 463 } 464 465 }