001 /* 002 * $Id: BigIntegerTest.java 3255 2010-08-08 20:46:37Z kredel $ 003 */ 004 005 package edu.jas.arith; 006 007 008 import java.util.Iterator; 009 010 //import edu.jas.arith.BigInteger; 011 012 import junit.framework.Test; 013 import junit.framework.TestCase; 014 import junit.framework.TestSuite; 015 016 /** 017 * BigInteger tests with JUnit. 018 * @author Heinz Kredel. 019 */ 020 021 public class BigIntegerTest extends TestCase { 022 023 /** 024 * main 025 */ 026 public static void main (String[] args) { 027 junit.textui.TestRunner.run( suite() ); 028 } 029 030 /** 031 * Constructs a <CODE>BigIntegerTest</CODE> object. 032 * @param name String. 033 */ 034 public BigIntegerTest(String name) { 035 super(name); 036 } 037 038 /** 039 * suite. 040 */ 041 public static Test suite() { 042 TestSuite suite= new TestSuite(BigIntegerTest.class); 043 return suite; 044 } 045 046 private final static int bitlen = 100; 047 048 BigInteger a; 049 BigInteger b; 050 BigInteger c; 051 BigInteger d; 052 BigInteger e; 053 054 protected void setUp() { 055 a = b = c = d = e = null; 056 } 057 058 protected void tearDown() { 059 a = b = c = d = e = null; 060 } 061 062 063 /** 064 * Test static initialization and constants. 065 */ 066 public void testConstants() { 067 a = BigInteger.ZERO; 068 b = BigInteger.ONE; 069 c = BigInteger.IDIF(b,b); 070 071 assertEquals("1-1 = 0",c,a); 072 assertTrue("1-1 = 0",c.isZERO()); 073 assertTrue("1 = 1", b.isONE() ); 074 } 075 076 077 /** 078 * Test constructor and toString. 079 */ 080 public void testConstructor() { 081 a = new BigInteger( "34" ); 082 b = new BigInteger( "34" ); 083 084 assertEquals("34 = 34",a,b); 085 086 a = new BigInteger( "-4" ); 087 b = new BigInteger( "-4" ); 088 089 assertEquals("-4 = -4",a,b); 090 091 String s = "1111111111111111111111111111111111111111111"; 092 a = new BigInteger( s ); 093 String t = a.toString(); 094 095 assertEquals("stringConstr = toString",s,t); 096 097 a = new BigInteger( 1 ); 098 b = new BigInteger( -1 ); 099 c = BigInteger.ISUM(b,a); 100 101 assertTrue("1 = 1", a.isONE() ); 102 assertEquals("1+(-1) = 0",c,BigInteger.ZERO); 103 } 104 105 106 /** 107 * Test random integer. 108 */ 109 public void testRandom() { 110 a = BigInteger.IRAND( 500 ); 111 b = new BigInteger( "" + a ); 112 c = BigInteger.IDIF(b,a); 113 114 assertEquals("a-b = 0",c,BigInteger.ZERO); 115 116 d = new BigInteger( b.getVal() ); 117 assertEquals("sign(a-a) = 0", 0, b.compareTo(d) ); 118 } 119 120 121 /** 122 * Test addition. 123 */ 124 public void testAddition() { 125 a = BigInteger.IRAND( bitlen ); 126 b = BigInteger.ISUM(a,a); 127 c = BigInteger.IDIF(b,a); 128 129 assertEquals("a+a-a = a",c,a); 130 assertEquals("a+a-a = a", 0, c.compareTo(a) ); 131 132 d = BigInteger.ISUM( a, BigInteger.ZERO ); 133 assertEquals("a+0 = a",d,a); 134 d = BigInteger.IDIF( a, BigInteger.ZERO ); 135 assertEquals("a-0 = a",d,a); 136 d = BigInteger.IDIF( a, a ); 137 assertEquals("a-a = 0", d, BigInteger.ZERO ); 138 139 } 140 141 142 /** 143 * Test multiplication. 144 */ 145 public void testMultiplication() { 146 a = BigInteger.IRAND( bitlen ); 147 b = BigInteger.IPROD( a, a ); 148 c = BigInteger.IQ( b, a ); 149 150 assertEquals("a*a/a = a",c,a); 151 assertEquals("a*a/a = a",0,BigInteger.ICOMP(c,a)); 152 153 d = BigInteger.IPROD( a, BigInteger.ONE ); 154 assertEquals("a*1 = a",d,a); 155 d = BigInteger.IQ( a, BigInteger.ONE ); 156 assertEquals("a/1 = a",d,a); 157 158 a = BigInteger.IRAND( bitlen*2 ); 159 b = BigInteger.IRAND( bitlen ); 160 BigInteger[] qr = BigInteger.IQR( a, b ); 161 c = BigInteger.IPROD( qr[0], b ); 162 c = BigInteger.ISUM( c, qr[1] ); 163 assertEquals("a = q*b+r)",a,c); 164 } 165 166 167 /** 168 * Test distributive law. 169 */ 170 public void testDistributive() { 171 BigInteger fac = new BigInteger(); 172 173 a = fac.random( bitlen ); 174 b = fac.random( bitlen ); 175 c = fac.random( bitlen ); 176 177 d = a.multiply( b.sum(c) ); 178 e = a.multiply( b ).sum( a.multiply(c) ); 179 180 assertEquals("a(b+c) = ab+ac",d,e); 181 } 182 183 184 /** 185 * Test gcd. 186 */ 187 public void testGcd() { 188 a = BigInteger.IRAND( bitlen ); 189 b = BigInteger.IRAND( bitlen ); 190 c = BigInteger.IGCD( a, b ); // ~1 191 192 BigInteger[] qr = BigInteger.IQR( a, c ); 193 d = BigInteger.IPROD( qr[0], c ); 194 assertEquals("a = gcd(a,b)*q1",a,d); 195 assertEquals("a/gcd(a,b) = q*x + 0", qr[1], BigInteger.ZERO ); 196 197 qr = BigInteger.IQR( b, c ); 198 d = BigInteger.IPROD( qr[0], c ); 199 assertEquals("b = gcd(a,b)*q1",b,d); 200 assertEquals("b/gcd(a,b) = q*x + 0", qr[1], BigInteger.ZERO ); 201 202 203 c = BigInteger.IRAND( bitlen*4 ); 204 a = BigInteger.IPROD( a, c ); 205 b = BigInteger.IPROD( b, c ); 206 c = BigInteger.IGCD( a, b ); // = c 207 208 qr = BigInteger.IQR( a, c ); 209 d = BigInteger.IPROD( qr[0], c ); 210 assertEquals("a = gcd(a,b)*q1",a,d); 211 assertEquals("a/gcd(a,b) = q*x + 0", qr[1], BigInteger.ZERO ); 212 213 qr = BigInteger.IQR( b, c ); 214 d = BigInteger.IPROD( qr[0], c ); 215 assertEquals("b = gcd(a,b)*q1",b,d); 216 assertEquals("b/gcd(a,b) = q*x + 0", qr[1], BigInteger.ZERO ); 217 218 } 219 220 221 /** 222 * Test iterator. 223 */ 224 public void testIterator() { 225 int t = 0; 226 BigInteger bi = new BigInteger(); 227 bi.setAllIterator(); 228 BigInteger j = null, ten = null; 229 for ( BigInteger i : bi ) { 230 t++; 231 //System.out.println("i = " + i); 232 if ( t >= 20 ) { 233 j = i; 234 break; 235 } 236 } 237 ten = new BigInteger(10); 238 assertTrue("j == 10 ", j.equals(ten) ); 239 } 240 241 242 /** 243 * Test non-negative iterator. 244 */ 245 public void testNNIterator() { 246 int t = 0; 247 BigInteger bi = new BigInteger(); 248 bi.setNonNegativeIterator(); 249 BigInteger j = null, ten = null; 250 Iterator<BigInteger> iter = bi.iterator(); 251 while ( iter.hasNext() ) { 252 BigInteger i = iter.next(); 253 t++; 254 //System.out.println("i = " + i); 255 if ( t > 20 ) { 256 j = i; 257 break; 258 } 259 } 260 ten = new BigInteger(20); 261 assertTrue("j == 10 ", j.equals(ten) ); 262 } 263 264 }