BigIntegerTest.java revision 81ccea015ba3d2a2da1c641b14dd3713c6b40a76
181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes/*
281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *  this work for additional information regarding copyright ownership.
581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *  (the "License"); you may not use this file except in compliance with
781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *  the License.  You may obtain a copy of the License at
881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *
981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
1081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *
1181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
1281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
1381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *  See the License for the specific language governing permissions and
1581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes *  limitations under the License.
1681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes */
1781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
1881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughespackage tests.api.java.math;
1981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
2081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughesimport java.math.BigInteger;
2181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughesimport java.util.Random;
2281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
2381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughespublic class BigIntegerTest extends junit.framework.TestCase {
2481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
2581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger minusTwo = new BigInteger("-2", 10);
2681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
2781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger minusOne = new BigInteger("-1", 10);
2881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
2981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger zero = new BigInteger("0", 10);
3081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
3181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger one = new BigInteger("1", 10);
3281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
3381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger two = new BigInteger("2", 10);
3481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
3581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger ten = new BigInteger("10", 10);
3681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
3781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger sixteen = new BigInteger("16", 10);
3881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
3981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger oneThousand = new BigInteger("1000", 10);
4081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
4181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger aZillion = new BigInteger(
4281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			"100000000000000000000000000000000000000000000000000", 10);
4381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
4481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger twoToTheTen = new BigInteger("1024", 10);
4581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
4681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger twoToTheSeventy = two.pow(70);
4781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
4881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	Random rand = new Random();
4981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
5081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger bi;
5181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
5281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger bi1;
5381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
5481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger bi2;
5581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
5681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger bi3;
5781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
5881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger bi11;
5981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
6081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger bi22;
6181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
6281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger bi33;
6381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
6481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger bi12;
6581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
6681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger bi23;
6781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
6881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger bi13;
6981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
7081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger largePos;
7181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
7281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger smallPos;
7381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
7481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger largeNeg;
7581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
7681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger smallNeg;
7781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
7881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	BigInteger[][] booleanPairs;
7981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
8081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
8181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#BigInteger(int, java.util.Random)
8281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
8381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_ConstructorILjava_util_Random() {
8481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        // regression test for HARMONY-1047
8581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
8681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			new BigInteger(Integer.MAX_VALUE, (Random)null);
8781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			fail("NegativeArraySizeException expected");
8881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (NegativeArraySizeException e) {
8981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            // PASSED
9081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
9181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
9281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi = new BigInteger(70, rand);
9381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi2 = new BigInteger(70, rand);
9481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Random number is negative", bi.compareTo(zero) >= 0);
9581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Random number is too big",
9681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				bi.compareTo(twoToTheSeventy) < 0);
9781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue(
9881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				"Two random numbers in a row are the same (might not be a bug but it very likely is)",
9981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				!bi.equals(bi2));
10081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Not zero", new BigInteger(0, rand).equals(BigInteger.ZERO));
10181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
10281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
10381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
10481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#BigInteger(int, int, java.util.Random)
10581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
10681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_ConstructorIILjava_util_Random() {
10781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi = new BigInteger(10, 5, rand);
10881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi2 = new BigInteger(10, 5, rand);
10981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Random number one is negative", bi.compareTo(zero) >= 0);
11081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Random number one is too big",
11181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				bi.compareTo(twoToTheTen) < 0);
11281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Random number two is negative", bi2.compareTo(zero) >= 0);
11381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Random number two is too big",
11481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				bi2.compareTo(twoToTheTen) < 0);
11581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
11681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		Random rand = new Random();
11781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger bi;
11881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		int certainty[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				Integer.MIN_VALUE, Integer.MIN_VALUE + 1, -2, -1 };
12081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (int i = 2; i <= 20; i++) {
12181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            for (int c = 0; c < certainty.length; c++) {
12281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				bi = new BigInteger(i, c, rand); // Create BigInteger
12381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				assertTrue("Bit length incorrect", bi.bitLength() == i);
12481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			}
12581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        }
12681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
12781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
12881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
12981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#BigInteger(byte[])
13081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
13181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_Constructor$B() {
13281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		byte[] myByteArray;
13381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		myByteArray = new byte[] { (byte) 0x00, (byte) 0xFF, (byte) 0xFE };
13481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi = new BigInteger(myByteArray);
13581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect value for pos number", bi.equals(BigInteger.ZERO
13681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.setBit(16).subtract(two)));
13781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		myByteArray = new byte[] { (byte) 0xFF, (byte) 0xFE };
13881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi = new BigInteger(myByteArray);
13981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect value for neg number", bi.equals(minusTwo));
14081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
14181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
14281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
14381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#BigInteger(int, byte[])
14481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
14581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_ConstructorI$B() {
14681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		byte[] myByteArray;
14781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		myByteArray = new byte[] { (byte) 0xFF, (byte) 0xFE };
14881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi = new BigInteger(1, myByteArray);
14981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect value for pos number", bi.equals(BigInteger.ZERO
15081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.setBit(16).subtract(two)));
15181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi = new BigInteger(-1, myByteArray);
15281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect value for neg number", bi.equals(BigInteger.ZERO
15381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.setBit(16).subtract(two).negate()));
15481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		myByteArray = new byte[] { (byte) 0, (byte) 0 };
15581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi = new BigInteger(0, myByteArray);
15681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect value for zero", bi.equals(zero));
15781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		myByteArray = new byte[] { (byte) 1 };
15881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
15981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			new BigInteger(0, myByteArray);
16081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("Failed to throw NumberFormatException");
16181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (NumberFormatException e) {
16281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			// correct
16381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
16481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
16581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
16681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
16781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#BigInteger(java.lang.String)
16881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
16981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_constructor_String_empty() {
17081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
17181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			new BigInteger("");
17281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("Expected NumberFormatException for new BigInteger(\"\")");
17381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (NumberFormatException e) {
17481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
17581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
17681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
17781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
17881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#toByteArray()
17981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
18081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_toByteArray() {
18181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		byte[] myByteArray, anotherByteArray;
18281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		myByteArray = new byte[] { 97, 33, 120, 124, 50, 2, 0, 0, 0, 12, 124,
18381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				42 };
18481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		anotherByteArray = new BigInteger(myByteArray).toByteArray();
18581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect byte array returned",
18681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				myByteArray.length == anotherByteArray.length);
18781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (int counter = myByteArray.length - 1; counter >= 0; counter--) {
18881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("Incorrect values in returned byte array",
18981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					myByteArray[counter] == anotherByteArray[counter]);
19081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
19181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
19281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
19381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
19481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#isProbablePrime(int)
19581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
19681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_isProbablePrimeI() {
19781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		int fails = 0;
19881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi = new BigInteger(20, 20, rand);
19981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		if (!bi.isProbablePrime(17)) {
20081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fails++;
20181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        }
20281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi = new BigInteger("4", 10);
20381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		if (bi.isProbablePrime(17)) {
20481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("isProbablePrime failed for: " + bi);
20581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        }
20681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi = BigInteger.valueOf(17L * 13L);
20781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		if (bi.isProbablePrime(17)) {
20881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("isProbablePrime failed for: " + bi);
20981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        }
21081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (long a = 2; a < 1000; a++) {
21181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            if (isPrime(a)) {
21281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                assertTrue("false negative on prime number <1000", BigInteger
21381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes						.valueOf(a).isProbablePrime(5));
21481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            } else if (BigInteger.valueOf(a).isProbablePrime(17)) {
21581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				System.out.println("isProbablePrime failed for: " + a);
21681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				fails++;
21781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			}
21881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        }
21981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (int a = 0; a < 1000; a++) {
22081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			bi = BigInteger.valueOf(rand.nextInt(1000000)).multiply(
22181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					BigInteger.valueOf(rand.nextInt(1000000)));
22281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			if (bi.isProbablePrime(17)) {
22381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				System.out.println("isProbablePrime failed for: " + bi);
22481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				fails++;
22581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			}
22681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
22781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (int a = 0; a < 200; a++) {
22881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			bi = new BigInteger(70, rand).multiply(new BigInteger(70, rand));
22981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			if (bi.isProbablePrime(17)) {
23081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				System.out.println("isProbablePrime failed for: " + bi);
23181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				fails++;
23281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			}
23381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
23481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Too many false positives - may indicate a problem",
23581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				fails <= 1);
23681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
23781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
23881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
23981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#equals(java.lang.Object)
24081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
24181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_equalsLjava_lang_Object() {
24281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0=0", zero.equals(BigInteger.valueOf(0)));
24381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-123=-123", BigInteger.valueOf(-123).equals(
24481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				BigInteger.valueOf(-123)));
24581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0=1", !zero.equals(one));
24681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0=-1", !zero.equals(minusOne));
24781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1=-1", !one.equals(minusOne));
24881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("bi3=bi3", bi3.equals(bi3));
24981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("bi3=copy of bi3", bi3.equals(bi3.negate().negate()));
25081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("bi3=bi2", !bi3.equals(bi2));
25181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
25281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
25381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
25481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#compareTo(java.math.BigInteger)
25581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
25681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_compareToLjava_math_BigInteger() {
25781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Smaller number returned >= 0", one.compareTo(two) < 0);
25881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Larger number returned >= 0", two.compareTo(one) > 0);
25981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Equal numbers did not return 0", one.compareTo(one) == 0);
26081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Neg number messed things up",
26181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				two.negate().compareTo(one) < 0);
26281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
26381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
26481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
26581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#intValue()
26681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
26781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_intValue() {
26881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect intValue for 2**70",
26981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				twoToTheSeventy.intValue() == 0);
27081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect intValue for 2", two.intValue() == 2);
27181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
27281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
27381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
27481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#longValue()
27581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
27681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_longValue() {
27781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect longValue for 2**70",
27881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				twoToTheSeventy.longValue() == 0);
27981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect longValue for 2", two.longValue() == 2);
28081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
28181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
28281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
28381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#valueOf(long)
28481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
28581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_valueOfJ() {
28681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incurred number returned for 2", BigInteger.valueOf(2L)
28781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(two));
28881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incurred number returned for 200", BigInteger.valueOf(200L)
28981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(BigInteger.valueOf(139).add(BigInteger.valueOf(61))));
29081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
29181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
29281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
29381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#add(java.math.BigInteger)
29481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
29581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_addLjava_math_BigInteger() {
29681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect sum--wanted a zillion", aZillion.add(aZillion)
29781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.add(aZillion.negate()).equals(aZillion));
29881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0+0", zero.add(zero).equals(zero));
29981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0+1", zero.add(one).equals(one));
30081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1+0", one.add(zero).equals(one));
30181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1+1", one.add(one).equals(two));
30281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0+(-1)", zero.add(minusOne).equals(minusOne));
30381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("(-1)+0", minusOne.add(zero).equals(minusOne));
30481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("(-1)+(-1)", minusOne.add(minusOne).equals(minusTwo));
30581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1+(-1)", one.add(minusOne).equals(zero));
30681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("(-1)+1", minusOne.add(one).equals(zero));
30781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
30881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (int i = 0; i < 200; i++) {
30981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger midbit = zero.setBit(i);
31081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("add fails to carry on bit " + i, midbit.add(midbit)
31181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					.equals(zero.setBit(i + 1)));
31281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
31381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger bi2p3 = bi2.add(bi3);
31481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger bi3p2 = bi3.add(bi2);
31581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("bi2p3=bi3p2", bi2p3.equals(bi3p2));
31681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
31781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		// add large positive + small positive
31881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
31981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		// add large positive + small negative
32081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
32181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		// add large negative + small positive
32281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
32381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		// add large negative + small negative
32481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
32581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
32681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
32781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#negate()
32881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
32981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_negate() {
33081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Single negation of zero did not result in zero", zero
33181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.negate().equals(zero));
33281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Single negation resulted in original nonzero number",
33381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				!aZillion.negate().equals(aZillion));
33481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Double negation did not result in original number",
33581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				aZillion.negate().negate().equals(aZillion));
33681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
33781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0.neg", zero.negate().equals(zero));
33881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1.neg", one.negate().equals(minusOne));
33981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("2.neg", two.negate().equals(minusTwo));
34081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1.neg", minusOne.negate().equals(one));
34181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-2.neg", minusTwo.negate().equals(two));
34281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0x62EB40FEF85AA9EBL*2.neg", BigInteger.valueOf(
34381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				0x62EB40FEF85AA9EBL * 2).negate().equals(
34481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				BigInteger.valueOf(-0x62EB40FEF85AA9EBL * 2)));
34581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (int i = 0; i < 200; i++) {
34681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger midbit = zero.setBit(i);
34781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger negate = midbit.negate();
34881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("negate negate", negate.negate().equals(midbit));
34981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("neg fails on bit " + i, midbit.negate().add(midbit)
35081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					.equals(zero));
35181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
35281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
35381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
35481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
35581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#signum()
35681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
35781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_signum() {
35881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Wrong positive signum", two.signum() == 1);
35981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Wrong zero signum", zero.signum() == 0);
36081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Wrong neg zero signum", zero.negate().signum() == 0);
36181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Wrong neg signum", two.negate().signum() == -1);
36281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
36381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
36481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
36581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#abs()
36681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
36781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_abs() {
36881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Invalid number returned for zillion", aZillion.negate()
36981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.abs().equals(aZillion.abs()));
37081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Invalid number returned for zero neg", zero.negate().abs()
37181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(zero));
37281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Invalid number returned for zero", zero.abs().equals(zero));
37381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Invalid number returned for two", two.negate().abs()
37481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(two));
37581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
37681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
37781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
37881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#pow(int)
37981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
38081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_powI() {
38181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect exponent returned for 2**10", two.pow(10).equals(
38281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				twoToTheTen));
38381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect exponent returned for 2**70", two.pow(30)
38481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.multiply(two.pow(40)).equals(twoToTheSeventy));
38581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect exponent returned for 10**50", ten.pow(50)
38681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(aZillion));
38781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
38881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
38981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
39081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#modInverse(java.math.BigInteger)
39181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
39281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_modInverseLjava_math_BigInteger() {
39381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger a = zero, mod, inv;
39481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (int j = 3; j < 50; j++) {
39581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			mod = BigInteger.valueOf(j);
39681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			for (int i = -j + 1; i < j; i++) {
39781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                try {
39881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					a = BigInteger.valueOf(i);
39981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					inv = a.modInverse(mod);
40081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					assertTrue("bad inverse: " + a + " inv mod " + mod
40181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							+ " equals " + inv, one.equals(a.multiply(inv).mod(
40281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							mod)));
40381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					assertTrue("inverse greater than modulo: " + a
40481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							+ " inv mod " + mod + " equals " + inv, inv
40581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							.compareTo(mod) < 0);
40681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					assertTrue("inverse less than zero: " + a + " inv mod "
40781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							+ mod + " equals " + inv, inv
40881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							.compareTo(BigInteger.ZERO) >= 0);
40981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				} catch (ArithmeticException e) {
41081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					assertTrue("should have found inverse for " + a + " mod "
41181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							+ mod, !one.equals(a.gcd(mod)));
41281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				}
41381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            }
41481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
41581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (int j = 1; j < 10; j++) {
41681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			mod = bi2.add(BigInteger.valueOf(j));
41781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			for (int i = 0; i < 20; i++) {
41881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                try {
41981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					a = bi3.add(BigInteger.valueOf(i));
42081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					inv = a.modInverse(mod);
42181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					assertTrue("bad inverse: " + a + " inv mod " + mod
42281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							+ " equals " + inv, one.equals(a.multiply(inv).mod(
42381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							mod)));
42481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					assertTrue("inverse greater than modulo: " + a
42581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							+ " inv mod " + mod + " equals " + inv, inv
42681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							.compareTo(mod) < 0);
42781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					assertTrue("inverse less than zero: " + a + " inv mod "
42881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							+ mod + " equals " + inv, inv
42981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							.compareTo(BigInteger.ZERO) >= 0);
43081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				} catch (ArithmeticException e) {
43181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					assertTrue("should have found inverse for " + a + " mod "
43281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes							+ mod, !one.equals(a.gcd(mod)));
43381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				}
43481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            }
43581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
43681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
43781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
43881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
43981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#shiftRight(int)
44081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
44181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_shiftRightI() {
44281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1 >> 0", BigInteger.valueOf(1).shiftRight(0).equals(
44381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				BigInteger.ONE));
44481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1 >> 1", BigInteger.valueOf(1).shiftRight(1).equals(
44581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				BigInteger.ZERO));
44681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1 >> 63", BigInteger.valueOf(1).shiftRight(63).equals(
44781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				BigInteger.ZERO));
44881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1 >> 64", BigInteger.valueOf(1).shiftRight(64).equals(
44981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				BigInteger.ZERO));
45081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1 >> 65", BigInteger.valueOf(1).shiftRight(65).equals(
45181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				BigInteger.ZERO));
45281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1 >> 1000", BigInteger.valueOf(1).shiftRight(1000).equals(
45381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				BigInteger.ZERO));
45481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1 >> 0", BigInteger.valueOf(-1).shiftRight(0).equals(
45581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				minusOne));
45681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1 >> 1", BigInteger.valueOf(-1).shiftRight(1).equals(
45781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				minusOne));
45881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1 >> 63", BigInteger.valueOf(-1).shiftRight(63).equals(
45981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				minusOne));
46081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1 >> 64", BigInteger.valueOf(-1).shiftRight(64).equals(
46181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				minusOne));
46281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1 >> 65", BigInteger.valueOf(-1).shiftRight(65).equals(
46381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				minusOne));
46481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1 >> 1000", BigInteger.valueOf(-1).shiftRight(1000)
46581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(minusOne));
46681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
46781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger a = BigInteger.ONE;
46881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger c = bi3;
46981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger E = bi3.negate();
47081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger e = E;
47181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (int i = 0; i < 200; i++) {
47281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger b = BigInteger.ZERO.setBit(i);
47381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("a==b", a.equals(b));
47481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			a = a.shiftLeft(1);
47581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("a non-neg", a.signum() >= 0);
47681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
47781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger d = bi3.shiftRight(i);
47881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("c==d", c.equals(d));
47981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			c = c.shiftRight(1);
48081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue(">>1 == /2", d.divide(two).equals(c));
48181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("c non-neg", c.signum() >= 0);
48281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
48381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger f = E.shiftRight(i);
48481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("e==f", e.equals(f));
48581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			e = e.shiftRight(1);
48681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue(">>1 == /2", f.subtract(one).divide(two).equals(e));
48781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("e negative", e.signum() == -1);
48881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
48981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("b >> i", b.shiftRight(i).equals(one));
49081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("b >> i+1", b.shiftRight(i + 1).equals(zero));
49181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("b >> i-1", b.shiftRight(i - 1).equals(two));
49281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
49381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
49481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
49581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
49681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#shiftLeft(int)
49781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
49881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_shiftLeftI() {
49981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1 << 0", one.shiftLeft(0).equals(one));
50081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1 << 1", one.shiftLeft(1).equals(two));
50181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1 << 63", one.shiftLeft(63).equals(
50281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				new BigInteger("8000000000000000", 16)));
50381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1 << 64", one.shiftLeft(64).equals(
50481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				new BigInteger("10000000000000000", 16)));
50581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1 << 65", one.shiftLeft(65).equals(
50681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				new BigInteger("20000000000000000", 16)));
50781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1 << 0", minusOne.shiftLeft(0).equals(minusOne));
50881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1 << 1", minusOne.shiftLeft(1).equals(minusTwo));
50981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1 << 63", minusOne.shiftLeft(63).equals(
51081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				new BigInteger("-9223372036854775808")));
51181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1 << 64", minusOne.shiftLeft(64).equals(
51281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				new BigInteger("-18446744073709551616")));
51381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1 << 65", minusOne.shiftLeft(65).equals(
51481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				new BigInteger("-36893488147419103232")));
51581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
51681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger a = bi3;
51781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger c = minusOne;
51881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (int i = 0; i < 200; i++) {
51981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger b = bi3.shiftLeft(i);
52081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("a==b", a.equals(b));
52181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("a >> i == bi3", a.shiftRight(i).equals(bi3));
52281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			a = a.shiftLeft(1);
52381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("<<1 == *2", b.multiply(two).equals(a));
52481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("a non-neg", a.signum() >= 0);
52581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("a.bitCount==b.bitCount", a.bitCount() == b.bitCount());
52681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
52781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger d = minusOne.shiftLeft(i);
52881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("c==d", c.equals(d));
52981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			c = c.shiftLeft(1);
53081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("<<1 == *2 negative", d.multiply(two).equals(c));
53181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("c negative", c.signum() == -1);
53281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("d >> i == minusOne", d.shiftRight(i).equals(minusOne));
53381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
53481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
53581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
53681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
53781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#multiply(java.math.BigInteger)
53881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
53981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_multiplyLjava_math_BigInteger() {
54081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("Incorrect sum--wanted three zillion", aZillion
54181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.add(aZillion).add(aZillion).equals(
54281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes						aZillion.multiply(new BigInteger("3", 10))));
54381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
54481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0*0", zero.multiply(zero).equals(zero));
54581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0*1", zero.multiply(one).equals(zero));
54681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1*0", one.multiply(zero).equals(zero));
54781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1*1", one.multiply(one).equals(one));
54881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0*(-1)", zero.multiply(minusOne).equals(zero));
54981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("(-1)*0", minusOne.multiply(zero).equals(zero));
55081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("(-1)*(-1)", minusOne.multiply(minusOne).equals(one));
55181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1*(-1)", one.multiply(minusOne).equals(minusOne));
55281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("(-1)*1", minusOne.multiply(one).equals(minusOne));
55381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
55481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllMults(bi1, bi1, bi11);
55581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllMults(bi2, bi2, bi22);
55681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllMults(bi3, bi3, bi33);
55781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllMults(bi1, bi2, bi12);
55881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllMults(bi1, bi3, bi13);
55981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllMults(bi2, bi3, bi23);
56081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
56181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
56281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
56381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#divide(java.math.BigInteger)
56481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
56581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_divideLjava_math_BigInteger() {
56681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(bi33, bi3);
56781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(bi22, bi2);
56881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(bi11, bi1);
56981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(bi13, bi1);
57081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(bi13, bi3);
57181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(bi12, bi1);
57281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(bi12, bi2);
57381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(bi23, bi2);
57481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(bi23, bi3);
57581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(largePos, bi1);
57681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(largePos, bi2);
57781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(largePos, bi3);
57881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(largeNeg, bi1);
57981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(largeNeg, bi2);
58081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(largeNeg, bi3);
58181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(largeNeg, largePos);
58281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(largePos, largeNeg);
58381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(bi3, bi3);
58481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(bi2, bi2);
58581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(bi1, bi1);
58681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testDivRanges(bi1);
58781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testDivRanges(bi2);
58881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testDivRanges(bi3);
58981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testDivRanges(smallPos);
59081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testDivRanges(largePos);
59181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testDivRanges(new BigInteger("62EB40FEF85AA9EB", 16));
59281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testAllDivs(BigInteger.valueOf(0xCC0225953CL), BigInteger
59381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.valueOf(0x1B937B765L));
59481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
59581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
59681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			largePos.divide(zero);
59781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
59881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
59981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
60081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
60181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
60281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			bi1.divide(zero);
60381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
60481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
60581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
60681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
60781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
60881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			bi3.negate().divide(zero);
60981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
61081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
61181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
61281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
61381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
61481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			zero.divide(zero);
61581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
61681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
61781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
61881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
61981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
62081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
62181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#remainder(java.math.BigInteger)
62281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
62381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_remainderLjava_math_BigInteger() {
62481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
62581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			largePos.remainder(zero);
62681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
62781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
62881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
62981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
63081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
63181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			bi1.remainder(zero);
63281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
63381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
63481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
63581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
63681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
63781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			bi3.negate().remainder(zero);
63881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
63981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
64081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
64181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
64281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
64381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			zero.remainder(zero);
64481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
64581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
64681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
64781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
64881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
64981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
65081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#mod(java.math.BigInteger)
65181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
65281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_modLjava_math_BigInteger() {
65381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
65481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			largePos.mod(zero);
65581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
65681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
65781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
65881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
65981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
66081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			bi1.mod(zero);
66181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
66281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
66381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
66481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
66581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
66681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			bi3.negate().mod(zero);
66781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
66881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
66981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
67081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
67181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
67281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			zero.mod(zero);
67381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
67481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
67581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
67681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
67781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
67881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
67981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#divideAndRemainder(java.math.BigInteger)
68081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
68181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_divideAndRemainderLjava_math_BigInteger() {
68281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
68381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			largePos.divideAndRemainder(zero);
68481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
68581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
68681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
68781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
68881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
68981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			bi1.divideAndRemainder(zero);
69081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
69181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
69281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
69381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
69481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
69581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			bi3.negate().divideAndRemainder(zero);
69681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
69781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
69881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
69981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
70081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
70181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			zero.divideAndRemainder(zero);
70281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("ArithmeticException expected");
70381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
70481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
70581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
70681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
70781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
70881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#BigInteger(java.lang.String)
70981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
71081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_ConstructorLjava_lang_String() {
71181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(0)", new BigInteger("0").equals(BigInteger.valueOf(0)));
71281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(1)", new BigInteger("1").equals(BigInteger.valueOf(1)));
71381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(12345678901234)", new BigInteger("12345678901234")
71481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(BigInteger.valueOf(12345678901234L)));
71581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(-1)", new BigInteger("-1").equals(BigInteger
71681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.valueOf(-1)));
71781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(-12345678901234)", new BigInteger("-12345678901234")
71881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(BigInteger.valueOf(-12345678901234L)));
71981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
72081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
72181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
72281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#BigInteger(java.lang.String, int)
72381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
72481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_ConstructorLjava_lang_StringI() {
72581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(0,16)", new BigInteger("0", 16).equals(BigInteger
72681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.valueOf(0)));
72781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(1,16)", new BigInteger("1", 16).equals(BigInteger
72881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.valueOf(1)));
72981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(ABF345678901234,16)", new BigInteger("ABF345678901234",
73081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				16).equals(BigInteger.valueOf(0xABF345678901234L)));
73181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(abf345678901234,16)", new BigInteger("abf345678901234",
73281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				16).equals(BigInteger.valueOf(0xABF345678901234L)));
73381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(-1,16)", new BigInteger("-1", 16).equals(BigInteger
73481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.valueOf(-1)));
73581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(-ABF345678901234,16)", new BigInteger(
73681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				"-ABF345678901234", 16).equals(BigInteger
73781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.valueOf(-0xABF345678901234L)));
73881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(-abf345678901234,16)", new BigInteger(
73981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				"-abf345678901234", 16).equals(BigInteger
74081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.valueOf(-0xABF345678901234L)));
74181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("new(-101010101,2)", new BigInteger("-101010101", 2)
74281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(BigInteger.valueOf(-341)));
74381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
74481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
74581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
74681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#toString()
74781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
74881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_toString() {
74981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0.toString", "0".equals(BigInteger.valueOf(0).toString()));
75081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1.toString", "1".equals(BigInteger.valueOf(1).toString()));
75181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("12345678901234.toString", "12345678901234"
75281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(BigInteger.valueOf(12345678901234L).toString()));
75381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1.toString", "-1"
75481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(BigInteger.valueOf(-1).toString()));
75581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-12345678901234.toString", "-12345678901234"
75681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(BigInteger.valueOf(-12345678901234L).toString()));
75781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
75881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
75981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
76081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#toString(int)
76181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
76281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_toStringI() {
76381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("0.toString(16)", "0".equals(BigInteger.valueOf(0).toString(
76481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				16)));
76581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("1.toString(16)", "1".equals(BigInteger.valueOf(1).toString(
76681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				16)));
76781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("ABF345678901234.toString(16)", "abf345678901234"
76881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(BigInteger.valueOf(0xABF345678901234L).toString(16)));
76981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-1.toString(16)", "-1".equals(BigInteger.valueOf(-1)
77081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.toString(16)));
77181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-ABF345678901234.toString(16)", "-abf345678901234"
77281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(BigInteger.valueOf(-0xABF345678901234L).toString(16)));
77381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-101010101.toString(2)", "-101010101".equals(BigInteger
77481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.valueOf(-341).toString(2)));
77581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
77681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
77781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
77881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#and(java.math.BigInteger)
77981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
78081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_andLjava_math_BigInteger() {
78181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (BigInteger[] element : booleanPairs) {
78281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger i1 = element[0], i2 = element[1];
78381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger res = i1.and(i2);
78481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("symmetry of and", res.equals(i2.and(i1)));
78581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			int len = Math.max(i1.bitLength(), i2.bitLength()) + 66;
78681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			for (int i = 0; i < len; i++) {
78781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                assertTrue("and", (i1.testBit(i) && i2.testBit(i)) == res
78881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes						.testBit(i));
78981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            }
79081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
79181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
79281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
79381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
79481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#or(java.math.BigInteger)
79581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
79681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_orLjava_math_BigInteger() {
79781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (BigInteger[] element : booleanPairs) {
79881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger i1 = element[0], i2 = element[1];
79981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger res = i1.or(i2);
80081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("symmetry of or", res.equals(i2.or(i1)));
80181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			int len = Math.max(i1.bitLength(), i2.bitLength()) + 66;
80281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			for (int i = 0; i < len; i++) {
80381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                assertTrue("or", (i1.testBit(i) || i2.testBit(i)) == res
80481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes						.testBit(i));
80581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            }
80681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
80781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
80881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
80981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
81081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#xor(java.math.BigInteger)
81181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
81281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_xorLjava_math_BigInteger() {
81381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (BigInteger[] element : booleanPairs) {
81481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger i1 = element[0], i2 = element[1];
81581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger res = i1.xor(i2);
81681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("symmetry of xor", res.equals(i2.xor(i1)));
81781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			int len = Math.max(i1.bitLength(), i2.bitLength()) + 66;
81881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			for (int i = 0; i < len; i++) {
81981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                assertTrue("xor", (i1.testBit(i) ^ i2.testBit(i)) == res
82081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes						.testBit(i));
82181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            }
82281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
82381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
82481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
82581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
82681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#not()
82781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
82881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_not() {
82981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (BigInteger[] element : booleanPairs) {
83081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger i1 = element[0];
83181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger res = i1.not();
83281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			int len = i1.bitLength() + 66;
83381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			for (int i = 0; i < len; i++) {
83481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                assertTrue("not", !i1.testBit(i) == res.testBit(i));
83581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            }
83681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
83781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
83881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
83981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	/**
84081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 * @tests java.math.BigInteger#andNot(java.math.BigInteger)
84181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	 */
84281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	public void test_andNotLjava_math_BigInteger() {
84381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (BigInteger[] element : booleanPairs) {
84481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger i1 = element[0], i2 = element[1];
84581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger res = i1.andNot(i2);
84681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			int len = Math.max(i1.bitLength(), i2.bitLength()) + 66;
84781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			for (int i = 0; i < len; i++) {
84881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                assertTrue("andNot", (i1.testBit(i) && !i2.testBit(i)) == res
84981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes						.testBit(i));
85081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            }
85181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			// asymmetrical
85281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			i1 = element[1];
85381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			i2 = element[0];
85481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			res = i1.andNot(i2);
85581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			for (int i = 0; i < len; i++) {
85681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                assertTrue("andNot reversed",
85781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes						(i1.testBit(i) && !i2.testBit(i)) == res.testBit(i));
85881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            }
85981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
86081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        //regression for HARMONY-4653
86181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        try{
86281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            BigInteger.ZERO.andNot(null);
86381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            fail("should throw NPE");
86481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        }catch(Exception e){
86581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            //expected
86681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        }
86781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        BigInteger bi = new BigInteger(0, new byte[]{});
86881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        assertEquals(BigInteger.ZERO, bi.andNot(BigInteger.ZERO));
86981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
87081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
87181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
87281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes     public void testClone() {
87381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        // Regression test for HARMONY-1770
87481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        MyBigInteger myBigInteger = new MyBigInteger("12345");
87581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        myBigInteger = (MyBigInteger) myBigInteger.clone();
87681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes    }
87781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
87881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes    static class MyBigInteger extends BigInteger implements Cloneable {
87981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        public MyBigInteger(String val) {
88081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            super(val);
88181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        }
88281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        public Object clone() {
88381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            try {
88481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                return super.clone();
88581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            } catch (CloneNotSupportedException e) {
88681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                return null;
88781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            }
88881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        }
88981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes    }
89081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
89181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	@Override
89281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes    protected void setUp() {
89381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi1 = new BigInteger("2436798324768978", 16);
89481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi2 = new BigInteger("4576829475724387584378543764555", 16);
89581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi3 = new BigInteger("43987298363278574365732645872643587624387563245",
89681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				16);
89781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
89881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi33 = new BigInteger(
89981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				"10730846694701319120609898625733976090865327544790136667944805934175543888691400559249041094474885347922769807001",
90081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				10);
90181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi22 = new BigInteger(
90281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				"33301606932171509517158059487795669025817912852219962782230629632224456249",
90381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				10);
90481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi11 = new BigInteger("6809003003832961306048761258711296064", 10);
90581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi23 = new BigInteger(
90681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				"597791300268191573513888045771594235932809890963138840086083595706565695943160293610527214057",
90781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				10);
90881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi13 = new BigInteger(
90981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				"270307912162948508387666703213038600031041043966215279482940731158968434008",
91081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				10);
91181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		bi12 = new BigInteger(
91281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				"15058244971895641717453176477697767050482947161656458456", 10);
91381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
91481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		largePos = new BigInteger(
91581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				"834759814379857314986743298675687569845986736578576375675678998612743867438632986243982098437620983476924376",
91681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				16);
91781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		smallPos = new BigInteger("48753269875973284765874598630960986276", 16);
91881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		largeNeg = new BigInteger(
91981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				"-878824397432651481891353247987891423768534321387864361143548364457698487264387568743568743265873246576467643756437657436587436",
92081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				16);
92181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		smallNeg = new BigInteger("-567863254343798609857456273458769843", 16);
92281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		booleanPairs = new BigInteger[][] { { largePos, smallPos },
92381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				{ largePos, smallNeg }, { largeNeg, smallPos },
92481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				{ largeNeg, smallNeg } };
92581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
92681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
92781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	private void testDiv(BigInteger i1, BigInteger i2) {
92881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger q = i1.divide(i2);
92981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger r = i1.remainder(i2);
93081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger[] temp = i1.divideAndRemainder(i2);
93181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
93281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("divide and divideAndRemainder do not agree", q
93381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(temp[0]));
93481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("remainder and divideAndRemainder do not agree", r
93581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.equals(temp[1]));
93681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("signum and equals(zero) do not agree on quotient", q
93781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.signum() != 0
93881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				|| q.equals(zero));
93981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("signum and equals(zero) do not agree on remainder", r
94081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.signum() != 0
94181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				|| r.equals(zero));
94281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("wrong sign on quotient", q.signum() == 0
94381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				|| q.signum() == i1.signum() * i2.signum());
94481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("wrong sign on remainder", r.signum() == 0
94581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				|| r.signum() == i1.signum());
94681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("remainder out of range", r.abs().compareTo(i2.abs()) < 0);
94781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("quotient too small", q.abs().add(one).multiply(i2.abs())
94881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.compareTo(i1.abs()) > 0);
94981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("quotient too large", q.abs().multiply(i2.abs()).compareTo(
95081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				i1.abs()) <= 0);
95181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger p = q.multiply(i2);
95281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger a = p.add(r);
95381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("(a/b)*b+(a%b) != a", a.equals(i1));
95481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		try {
95581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger mod = i1.mod(i2);
95681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("mod is negative", mod.signum() >= 0);
95781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("mod out of range", mod.abs().compareTo(i2.abs()) < 0);
95881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("positive remainder == mod", r.signum() < 0
95981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					|| r.equals(mod));
96081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("negative remainder == mod - divisor", r.signum() >= 0
96181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes					|| r.equals(mod.subtract(i2)));
96281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		} catch (ArithmeticException e) {
96381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			assertTrue("mod fails on negative divisor only", i2.signum() <= 0);
96481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
96581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
96681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
96781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	private void testDivRanges(BigInteger i) {
96881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		BigInteger bound = i.multiply(two);
96981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (BigInteger j = bound.negate(); j.compareTo(bound) <= 0; j = j
97081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes				.add(i)) {
97181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger innerbound = j.add(two);
97281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			BigInteger k = j.subtract(two);
97381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes			for (; k.compareTo(innerbound) <= 0; k = k.add(one)) {
97481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                testDiv(k, i);
97581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            }
97681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		}
97781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
97881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
97981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	private boolean isPrime(long b) {
98081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		if (b == 2) {
98181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            return true;
98281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        }
98381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		// check for div by 2
98481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		if ((b & 1L) == 0) {
98581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            return false;
98681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        }
98781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		long maxlen = ((long) Math.sqrt(b)) + 2;
98881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		for (long x = 3; x < maxlen; x += 2) {
98981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            if (b % x == 0) {
99081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes                return false;
99181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes            }
99281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes        }
99381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		return true;
99481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
99581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
99681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	private void testAllMults(BigInteger i1, BigInteger i2, BigInteger ans) {
99781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("i1*i2=ans", i1.multiply(i2).equals(ans));
99881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("i2*i1=ans", i2.multiply(i1).equals(ans));
99981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-i1*i2=-ans", i1.negate().multiply(i2).equals(ans.negate()));
100081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-i2*i1=-ans", i2.negate().multiply(i1).equals(ans.negate()));
100181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("i1*-i2=-ans", i1.multiply(i2.negate()).equals(ans.negate()));
100281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("i2*-i1=-ans", i2.multiply(i1.negate()).equals(ans.negate()));
100381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-i1*-i2=ans", i1.negate().multiply(i2.negate()).equals(ans));
100481ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		assertTrue("-i2*-i1=ans", i2.negate().multiply(i1.negate()).equals(ans));
100581ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
100681ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes
100781ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	private void testAllDivs(BigInteger i1, BigInteger i2) {
100881ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testDiv(i1, i2);
100981ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testDiv(i1.negate(), i2);
101081ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testDiv(i1, i2.negate());
101181ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes		testDiv(i1.negate(), i2.negate());
101281ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes	}
101381ccea015ba3d2a2da1c641b14dd3713c6b40a76Elliott Hughes}
1014