001 002 /* 003 * $Id: ProductTest.java 3368 2010-10-24 13:53:32Z kredel $ 004 */ 005 006 package edu.jas.arith; 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.structure.RingFactory; 019 020 021 /** 022 * Product test with JUnit. 023 * @author Heinz Kredel. 024 */ 025 026 public class ProductTest extends TestCase { 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 * Constructs a <CODE>ProductTest</CODE> object. 038 * @param name String. 039 */ 040 public ProductTest(String name) { 041 super(name); 042 } 043 044 /** 045 * suite. 046 */ 047 public static Test suite() { 048 TestSuite suite= new TestSuite(ProductTest.class); 049 return suite; 050 } 051 052 ProductRing<BigRational> fac; 053 ModIntegerRing pfac; 054 ProductRing<ModInteger> mfac; 055 ProductRing<BigInteger> ifac; 056 057 Product< BigRational > a; 058 Product< BigRational > b; 059 Product< BigRational > c; 060 Product< BigRational > d; 061 Product< BigRational > e; 062 Product< BigRational > f; 063 064 Product< ModInteger > ap; 065 Product< ModInteger > bp; 066 Product< ModInteger > cp; 067 Product< ModInteger > dp; 068 Product< ModInteger > ep; 069 Product< ModInteger > fp; 070 071 Product< BigInteger > ai; 072 Product< BigInteger > bi; 073 Product< BigInteger > ci; 074 Product< BigInteger > di; 075 Product< BigInteger > ei; 076 Product< BigInteger > fi; 077 078 079 int pl = 5; 080 int rl = 1; 081 int kl = 13; 082 int ll = 7; 083 int el = 3; 084 float q = 0.9f; 085 int il = 2; 086 //long p = 1152921504606846883L; // 2^60-93; 087 088 protected void setUp() { 089 a = b = c = d = e = null; 090 ap = bp = cp = dp = ep = null; 091 ai = bi = ci = di = ei = null; 092 BigRational cfac = new BigRational(2,3); 093 fac = new ProductRing<BigRational>( cfac, pl ); 094 List<RingFactory<ModInteger>> lpfac 095 = new ArrayList<RingFactory<ModInteger>>(); 096 pfac = new ModIntegerRing( 2 ); 097 lpfac.add(pfac); 098 pfac = new ModIntegerRing( 3 ); 099 lpfac.add(pfac); 100 pfac = new ModIntegerRing( 5 ); 101 lpfac.add(pfac); 102 pfac = new ModIntegerRing( 7 ); 103 lpfac.add(pfac); 104 mfac = new ProductRing<ModInteger>( lpfac ); 105 BigInteger cifac = new BigInteger(3); 106 ifac = new ProductRing<BigInteger>( cifac, pl ); 107 } 108 109 protected void tearDown() { 110 a = b = c = d = e = null; 111 ap = bp = cp = dp = ep = null; 112 ai = bi = ci = di = ei = null; 113 fac = null; 114 pfac = null; 115 mfac = null; 116 ifac = null; 117 } 118 119 120 /** 121 * Test constructor for rational. 122 * 123 */ 124 public void testRatConstruction() { 125 c = fac.getONE(); 126 //System.out.println("c = " + c); 127 assertTrue("isZERO( c )", !c.isZERO() ); 128 assertTrue("isONE( c )", c.isONE() ); 129 130 d = fac.getZERO(); 131 //System.out.println("d = " + d); 132 assertTrue("isZERO( d )", d.isZERO() ); 133 assertTrue("isONE( d )", !d.isONE() ); 134 } 135 136 137 /** 138 * Test constructor for modular. 139 * 140 */ 141 public void testModConstruction() { 142 cp = mfac.getONE(); 143 //System.out.println("cp = " + cp); 144 assertTrue("isZERO( cp )", !cp.isZERO() ); 145 assertTrue("isONE( cp )", cp.isONE() ); 146 147 dp = mfac.getZERO(); 148 //System.out.println("dp = " + dp); 149 assertTrue("isZERO( dp )", dp.isZERO() ); 150 assertTrue("isONE( dp )", !dp.isONE() ); 151 } 152 153 154 /** 155 * Test random rational. 156 * 157 */ 158 public void testRatRandom() { 159 for (int i = 0; i < 7; i++) { 160 a = fac.random(kl*(i+1)); 161 if ( a.isZERO() ) { 162 continue; 163 } 164 assertTrue(" not isZERO( a"+i+" )", !a.isZERO() ); 165 assertTrue(" not isONE( a"+i+" )", !a.isONE() ); 166 a = fac.random( kl, q ); 167 if ( a.isZERO() ) { 168 continue; 169 } 170 //System.out.println("a = " + a); 171 assertTrue(" not isZERO( a"+i+" )", !a.isZERO() ); 172 assertTrue(" not isONE( a"+i+" )", !a.isONE() ); 173 } 174 } 175 176 177 /** 178 * Test random modular. 179 * 180 */ 181 public void testModRandom() { 182 for (int i = 0; i < 7; i++) { 183 ap = mfac.random(kl,q); 184 if ( ap.isZERO() || ap.isONE() ) { 185 continue; 186 } 187 //System.out.println("ap = " + ap); 188 assertTrue(" not isZERO( ap"+i+" )", !ap.isZERO() ); 189 assertTrue(" not isONE( ap"+i+" )", !ap.isONE() ); 190 } 191 } 192 193 194 /** 195 * Test rational addition. 196 * 197 */ 198 public void testRatAddition() { 199 200 a = fac.random(kl,q); 201 b = fac.random(kl,q); 202 203 c = a.sum(b); 204 d = c.subtract(b); 205 assertEquals("a+b-b = a",a,d); 206 207 //System.out.println("a = " + a); 208 //System.out.println("b = " + b); 209 //System.out.println("c = " + c); 210 //System.out.println("d = " + d); 211 212 c = a.sum(b); 213 d = b.sum(a); 214 assertEquals("a+b = b+a",c,d); 215 216 //System.out.println("c = " + c); 217 //System.out.println("d = " + d); 218 219 c = fac.random(kl,q); 220 d = c.sum( a.sum(b) ); 221 e = c.sum( a ).sum(b); 222 assertEquals("c+(a+b) = (c+a)+b",d,e); 223 224 //System.out.println("c = " + c); 225 //System.out.println("d = " + d); 226 //System.out.println("e = " + e); 227 228 c = a.sum( fac.getZERO() ); 229 d = a.subtract( fac.getZERO() ); 230 assertEquals("a+0 = a-0",c,d); 231 232 //System.out.println("c = " + c); 233 //System.out.println("d = " + d); 234 235 c = fac.getZERO().sum( a ); 236 d = fac.getZERO().subtract( a.negate() ); 237 assertEquals("0+a = 0+(-a)",c,d); 238 239 //System.out.println("c = " + c); 240 //System.out.println("d = " + d); 241 } 242 243 244 /** 245 * Test integer addition. 246 * 247 */ 248 public void testIntAddition() { 249 250 ai = ifac.random(kl,q); 251 bi = ifac.random(kl,q); 252 253 ci = ai.sum(bi); 254 di = ci.subtract(bi); 255 assertEquals("a+b-b = a",ai,di); 256 257 //System.out.println("a = " + a); 258 //System.out.println("b = " + b); 259 //System.out.println("c = " + c); 260 //System.out.println("d = " + d); 261 262 ci = ai.sum(bi); 263 di = bi.sum(ai); 264 assertEquals("a+b = b+a",ci,di); 265 266 //System.out.println("c = " + c); 267 //System.out.println("d = " + d); 268 269 ci = ifac.random(kl,q); 270 di = ci.sum( ai.sum(bi) ); 271 ei = ci.sum( ai ).sum(bi); 272 assertEquals("c+(a+b) = (c+a)+b",di,ei); 273 274 //System.out.println("c = " + c); 275 //System.out.println("d = " + d); 276 //System.out.println("e = " + e); 277 278 ci = ai.sum( ifac.getZERO() ); 279 di = ai.subtract( ifac.getZERO() ); 280 assertEquals("a+0 = a-0",ci,di); 281 282 //System.out.println("c = " + c); 283 //System.out.println("d = " + d); 284 285 ci = ifac.getZERO().sum( ai ); 286 di = ifac.getZERO().subtract( ai.negate() ); 287 assertEquals("0+a = 0+(-a)",ci,di); 288 289 //System.out.println("c = " + c); 290 //System.out.println("d = " + d); 291 } 292 293 294 /** 295 * Test modular addition. 296 * 297 */ 298 public void testModAddition() { 299 300 ap = mfac.random(kl,q); 301 bp = mfac.random(kl,q); 302 //System.out.println("a = " + a); 303 //System.out.println("b = " + b); 304 305 cp = ap.sum(bp); 306 dp = cp.subtract(bp); 307 assertEquals("a+b-b = a",ap,dp); 308 309 cp = ap.sum(bp); 310 dp = bp.sum(ap); 311 //System.out.println("c = " + c); 312 //System.out.println("d = " + d); 313 314 assertEquals("a+b = b+a",cp,dp); 315 316 cp = mfac.random(kl,q); 317 dp = cp.sum( ap.sum(bp) ); 318 ep = cp.sum( ap ).sum(bp); 319 assertEquals("c+(a+b) = (c+a)+b",dp,ep); 320 321 322 cp = ap.sum( mfac.getZERO() ); 323 dp = ap.subtract( mfac.getZERO() ); 324 assertEquals("a+0 = a-0",cp,dp); 325 326 cp = mfac.getZERO().sum( ap ); 327 dp = mfac.getZERO().subtract( ap.negate() ); 328 assertEquals("0+a = 0+(-a)",cp,dp); 329 } 330 331 332 /** 333 * Test rational multiplication. 334 * 335 */ 336 public void testRatMultiplication() { 337 338 a = fac.random(kl); 339 if ( a.isZERO() ) { 340 return; 341 } 342 assertTrue("not isZERO( a )", !a.isZERO() ); 343 344 b = fac.random(kl,q); 345 if ( b.isZERO() ) { 346 return; 347 } 348 assertTrue("not isZERO( b )", !b.isZERO() ); 349 350 c = b.multiply(a); 351 d = a.multiply(b); 352 //assertTrue("not isZERO( c )", !c.isZERO() ); 353 //assertTrue("not isZERO( d )", !d.isZERO() ); 354 355 //System.out.println("a = " + a); 356 //System.out.println("b = " + b); 357 e = d.subtract(c); 358 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() ); 359 360 assertTrue("a*b = b*a", c.equals(d) ); 361 assertEquals("a*b = b*a",c,d); 362 363 c = fac.random(kl,q); 364 //System.out.println("c = " + c); 365 d = a.multiply( b.multiply(c) ); 366 e = (a.multiply(b)).multiply(c); 367 368 //System.out.println("d = " + d); 369 //System.out.println("e = " + e); 370 //System.out.println("d-e = " + d.subtract(c) ); 371 372 assertEquals("a(bc) = (ab)c",d,e); 373 assertTrue("a(bc) = (ab)c", d.equals(e) ); 374 375 c = a.divide(b); 376 d = a.remainder(b); 377 e = c.multiply(b).sum(d); 378 f = a.multiply( e.idempotent() ); 379 380 //System.out.println("c = " + c); 381 //System.out.println("d = " + d); 382 //System.out.println("e = " + e); 383 //System.out.println("f = " + f); 384 assertEquals("a = (a/b)c+d ",e,f); 385 386 c = a.multiply( fac.getONE() ); 387 d = fac.getONE().multiply( a ); 388 assertEquals("a*1 = 1*a",c,d); 389 390 b = a.idempotent(); 391 c = a.idemComplement(); 392 d = b.multiply(c); 393 assertEquals("idem(a)*idemComp(a) = 0",d,fac.getZERO()); 394 d = b.sum(c); 395 assertEquals("idem(a)+idemComp(a) = 1",d,fac.getONE()); 396 397 if ( a.isUnit() ) { 398 c = a.inverse(); 399 d = c.multiply(a); 400 e = a.idempotent(); 401 //System.out.println("a = " + a); 402 //System.out.println("c = " + c); 403 //System.out.println("d = " + d); 404 //System.out.println("e = " + e); 405 assertEquals("a*1/a = 1",e,d); 406 } 407 } 408 409 410 /** 411 * Test integer multiplication. 412 * 413 */ 414 public void testIntMultiplication() { 415 416 ai = ifac.random(kl); 417 while ( ai.isZERO() ) { 418 ai = ifac.random(kl); 419 } 420 assertTrue("not isZERO( a )", !ai.isZERO() ); 421 422 bi = ifac.random(kl,q); 423 if ( bi.isZERO() ) { 424 bi = ifac.random(kl,q); 425 } 426 assertTrue("not isZERO( b )", !bi.isZERO() ); 427 428 ci = bi.multiply(ai); 429 di = ai.multiply(bi); 430 //assertTrue("not isZERO( c )", !c.isZERO() ); 431 //assertTrue("not isZERO( d )", !d.isZERO() ); 432 433 //System.out.println("a = " + ai); 434 //System.out.println("b = " + bi); 435 ei = di.subtract(ci); 436 assertTrue("isZERO( a*b-b*a ) " + ei, ei.isZERO() ); 437 438 assertTrue("a*b = b*a", ci.equals(di) ); 439 assertEquals("a*b = b*a",ci,di); 440 441 ci = ifac.random(kl,q); 442 //System.out.println("c = " + ci); 443 di = ai.multiply( bi.multiply(ci) ); 444 ei = (ai.multiply(bi)).multiply(ci); 445 446 //System.out.println("d = " + di); 447 //System.out.println("e = " + ei); 448 //System.out.println("d-e = " + di.subtract(ci) ); 449 450 assertEquals("a(bc) = (ab)c",di,ei); 451 assertTrue("a(bc) = (ab)c", di.equals(ei) ); 452 453 ci = ai.divide(bi); 454 di = ai.remainder(bi); 455 ei = ci.multiply(bi).sum(di); 456 fi = ai.multiply( ei.idempotent() ); 457 458 //System.out.println("c = " + ci); 459 //System.out.println("d = " + di); 460 //System.out.println("e = " + ei); 461 //System.out.println("f = " + fi); 462 assertEquals("a = (a/b)c+d ",ei,fi); 463 464 465 ci = ai.gcd(bi); 466 di = ai.remainder(ci); 467 ei = bi.remainder(ci); 468 469 //System.out.println("c = " + ci); 470 //System.out.println("d = " + di); 471 //System.out.println("e = " + ei); 472 assertTrue("gcd(a,b) | a ",di.isZERO()); 473 assertTrue("gcd(a,b) | b ",ei.isZERO()); 474 475 476 Product< BigInteger >[] gcd; 477 gcd = ai.egcd(bi); 478 ci = gcd[0]; 479 di = ai.remainder(ci); 480 ei = bi.remainder(ci); 481 482 //System.out.println(); 483 //System.out.println("c = " + ci); 484 //System.out.println("d = " + di); 485 //System.out.println("e = " + ei); 486 assertTrue("gcd(a,b) | a ",di.isZERO()); 487 assertTrue("gcd(a,b) | b ",ei.isZERO()); 488 489 di = ai.multiply(gcd[1]); 490 ei = bi.multiply(gcd[2]); 491 fi = di.sum(ei); 492 493 //System.out.println("c = " + ci); 494 //System.out.println("c1= " + gcd[1]); 495 //System.out.println("c2= " + gcd[2]); 496 //System.out.println("d = " + di); 497 //System.out.println("e = " + ei); 498 //System.out.println("f = " + fi); 499 assertEquals("gcd(a,b) = c1*a + c2*b ",ci,fi); 500 501 ci = ai.multiply( ifac.getONE() ); 502 di = ifac.getONE().multiply( ai ); 503 assertEquals("a*1 = 1*a",ci,di); 504 505 bi = ai.idempotent(); 506 ci = ai.idemComplement(); 507 di = bi.multiply(ci); 508 assertEquals("idem(a)*idemComp(a) = 0",di,ifac.getZERO()); 509 di = bi.sum(ci); 510 assertEquals("idem(a)+idemComp(a) = 1",di,ifac.getONE()); 511 512 if ( ai.isUnit() ) { 513 ci = ai.inverse(); 514 di = ci.multiply(ai); 515 ei = ai.idempotent(); 516 //System.out.println("a = " + a); 517 //System.out.println("c = " + c); 518 //System.out.println("d = " + d); 519 //System.out.println("e = " + e); 520 assertEquals("a*1/a = 1",ei,di); 521 } 522 } 523 524 525 /** 526 * Test modular multiplication. 527 * 528 */ 529 public void testModMultiplication() { 530 531 ap = mfac.random(kl,q); 532 if ( ap.isZERO() ) { 533 return; 534 } 535 assertTrue("not isZERO( a )", !ap.isZERO() ); 536 537 bp = mfac.random(kl,q); 538 if ( bp.isZERO() ) { 539 return; 540 } 541 assertTrue("not isZERO( b )", !bp.isZERO() ); 542 543 cp = bp.multiply(ap); 544 dp = ap.multiply(bp); 545 //assertTrue("not isZERO( c )", !cp.isZERO() ); 546 //assertTrue("not isZERO( d )", !dp.isZERO() ); 547 548 //System.out.println("a = " + a); 549 //System.out.println("b = " + b); 550 ep = dp.subtract(cp); 551 assertTrue("isZERO( a*b-b*a ) " + ep, ep.isZERO() ); 552 553 assertTrue("a*b = b*a", cp.equals(dp) ); 554 assertEquals("a*b = b*a",cp,dp); 555 556 cp = mfac.random(kl,q); 557 //System.out.println("c = " + c); 558 dp = ap.multiply( bp.multiply(cp) ); 559 ep = (ap.multiply(bp)).multiply(cp); 560 561 //System.out.println("d = " + d); 562 //System.out.println("e = " + e); 563 564 //System.out.println("d-e = " + d.subtract(c) ); 565 566 assertEquals("a(bc) = (ab)c",dp,ep); 567 assertTrue("a(bc) = (ab)c", dp.equals(ep) ); 568 569 cp = ap.divide(bp); 570 dp = ap.remainder(bp); 571 ep = cp.multiply(bp).sum(dp); 572 fp = ap.multiply( ep.idempotent() ); 573 574 //System.out.println("cp = " + cp); 575 //System.out.println("dp = " + dp); 576 //System.out.println("ep = " + ep); 577 //System.out.println("fp = " + fp); 578 assertEquals("a = (a/b)c+d ",ep,fp); 579 580 581 cp = ap.multiply( mfac.getONE() ); 582 dp = mfac.getONE().multiply( ap ); 583 assertEquals("a*1 = 1*a",cp,dp); 584 585 bp = ap.idempotent(); 586 cp = ap.idemComplement(); 587 dp = bp.multiply(cp); 588 assertEquals("idem(a)*idemComp(a) = 0",dp,mfac.getZERO()); 589 dp = bp.sum(cp); 590 assertEquals("idem(a)+idemComp(a) = 1",dp,mfac.getONE()); 591 592 if ( ap.isUnit() ) { 593 cp = ap.inverse(); 594 dp = cp.multiply(ap); 595 ep = ap.idempotent(); 596 //System.out.println("ap = " + ap); 597 //System.out.println("cp = " + cp); 598 //System.out.println("dp = " + dp); 599 //System.out.println("ep = " + ep); 600 assertEquals("a*1/a = 1",ep,dp); 601 } 602 } 603 604 605 }