test/java/math/BigInteger/BigIntegerTest.java

Print this page
rev 11823 : 8078672: Print and allow setting by Java property seeds used to initialize Random instances in java.lang numerics tests
Summary: Add ability to initial the random number generator from the system property "seed" and print to STDOUT the seed value actually used.
Reviewed-by: XXX

*** 21,32 **** * questions. */ /* * @test ! * @library .. ! * @bug 4181191 4161971 4227146 4194389 4823171 4624738 4812225 4837946 4026465 8074460 * @summary tests methods in BigInteger (use -Dseed=X to set PRNG seed) * @run main/timeout=400 BigIntegerTest * @author madbot * @key randomness */ --- 21,34 ---- * questions. */ /* * @test ! * @library /lib/testlibrary/ ! * @build jdk.testlibrary.* ! * @run main BigIntegerTest ! * @bug 4181191 4161971 4227146 4194389 4823171 4624738 4812225 4837946 4026465 8074460 8078672 * @summary tests methods in BigInteger (use -Dseed=X to set PRNG seed) * @run main/timeout=400 BigIntegerTest * @author madbot * @key randomness */
*** 35,44 **** --- 37,47 ---- import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.math.BigInteger; + import java.util.Random; /** * This is a simple test class created to ensure that the results * generated by BigInteger adhere to certain identities. Passing * this test is a strong assurance that the BigInteger operations
*** 85,95 **** // #bits for testing Toom-Cook squaring static final int ORDER_TOOM_COOK_SQUARE = 7000; static final int SIZE = 1000; // numbers per batch ! private static RandomSeed rndSeed = new RandomSeed(false); static boolean failure = false; public static void constructor() { int failCount = 0; --- 88,98 ---- // #bits for testing Toom-Cook squaring static final int ORDER_TOOM_COOK_SQUARE = 7000; static final int SIZE = 1000; // numbers per batch ! private static Random random = RandomFactory.getRandom(); static boolean failure = false; public static void constructor() { int failCount = 0;
*** 97,107 **** // --- guard condition tests for array indexing --- int arrayLength = 23; int halfLength = arrayLength/2; byte[] array = new byte[arrayLength]; ! rndSeed.getRandom().nextBytes(array); int[][] offLen = new int[][] { // offset, length, num exceptions {-1, arrayLength, 1}, // negative offset {0, arrayLength, 0}, // OK {1, arrayLength, 1}, // length overflow --- 100,110 ---- // --- guard condition tests for array indexing --- int arrayLength = 23; int halfLength = arrayLength/2; byte[] array = new byte[arrayLength]; ! random.nextBytes(array); int[][] offLen = new int[][] { // offset, length, num exceptions {-1, arrayLength, 1}, // negative offset {0, arrayLength, 0}, // OK {1, arrayLength, 1}, // length overflow
*** 161,171 **** failCount++; } } byte[] magNonZeroLength = new byte[42]; ! rndSeed.getRandom().nextBytes(magNonZeroLength); for (int signum = -1; signum <= 1; signum++) { BigInteger bi = new BigInteger(signum, magNonZeroLength, 0, 0); if (bi.compareTo(BigInteger.ZERO) != 0) { System.err.println("C: Zero length BigInteger != 0 for signum " + signum); failCount++; --- 164,174 ---- failCount++; } } byte[] magNonZeroLength = new byte[42]; ! random.nextBytes(magNonZeroLength); for (int signum = -1; signum <= 1; signum++) { BigInteger bi = new BigInteger(signum, magNonZeroLength, 0, 0); if (bi.compareTo(BigInteger.ZERO) != 0) { System.err.println("C: Zero length BigInteger != 0 for signum " + signum); failCount++;
*** 174,201 **** // --- tests for accurate creation of non-zero BigIntegers --- for (int i = 0; i < SIZE; i++) { // create reference value via a different code path from those tested ! BigInteger reference = new BigInteger(2 + rndSeed.getRandom().nextInt(336), 4, rndSeed.getRandom()); byte[] refArray = reference.toByteArray(); int refLen = refArray.length; ! int factor = rndSeed.getRandom().nextInt(5); ! int objLen = refArray.length + factor*rndSeed.getRandom().nextInt(refArray.length) + 1; ! int offset = rndSeed.getRandom().nextInt(objLen - refLen); byte[] objArray = new byte[objLen]; System.arraycopy(refArray, 0, objArray, offset, refLen); BigInteger twosComp = new BigInteger(objArray, offset, refLen); if (twosComp.compareTo(reference) != 0) { System.err.println("Two's-complement BigInteger not equal for offset " + offset + " and length " + refLen); failCount++; } ! boolean isNegative = rndSeed.getRandom().nextBoolean(); BigInteger signMag = new BigInteger(isNegative ? -1 : 1, objArray, offset, refLen); if (signMag.compareTo(isNegative ? reference.negate() : reference) != 0) { System.err.println("Sign-magnitude BigInteger not equal for offset " + offset + " and length " + refLen); failCount++; --- 177,204 ---- // --- tests for accurate creation of non-zero BigIntegers --- for (int i = 0; i < SIZE; i++) { // create reference value via a different code path from those tested ! BigInteger reference = new BigInteger(2 + random.nextInt(336), 4, random); byte[] refArray = reference.toByteArray(); int refLen = refArray.length; ! int factor = random.nextInt(5); ! int objLen = refArray.length + factor*random.nextInt(refArray.length) + 1; ! int offset = random.nextInt(objLen - refLen); byte[] objArray = new byte[objLen]; System.arraycopy(refArray, 0, objArray, offset, refLen); BigInteger twosComp = new BigInteger(objArray, offset, refLen); if (twosComp.compareTo(reference) != 0) { System.err.println("Two's-complement BigInteger not equal for offset " + offset + " and length " + refLen); failCount++; } ! boolean isNegative = random.nextBoolean(); BigInteger signMag = new BigInteger(isNegative ? -1 : 1, objArray, offset, refLen); if (signMag.compareTo(isNegative ? reference.negate() : reference) != 0) { System.err.println("Sign-magnitude BigInteger not equal for offset " + offset + " and length " + refLen); failCount++;
*** 208,218 **** public static void pow(int order) { int failCount1 = 0; for (int i=0; i<SIZE; i++) { // Test identity x^power == x*x*x ... *x ! int power = rndSeed.getRandom().nextInt(6) + 2; BigInteger x = fetchNumber(order); BigInteger y = x.pow(power); BigInteger z = x; for (int j=1; j<power; j++) --- 211,221 ---- public static void pow(int order) { int failCount1 = 0; for (int i=0; i<SIZE; i++) { // Test identity x^power == x*x*x ... *x ! int power = random.nextInt(6) + 2; BigInteger x = fetchNumber(order); BigInteger y = x.pow(power); BigInteger z = x; for (int j=1; j<power; j++)
*** 309,324 **** BigInteger base = BigInteger.ONE.shiftLeft(BITS_KARATSUBA - 32 - 1); for (int i=0; i<SIZE; i++) { BigInteger x = fetchNumber(BITS_KARATSUBA - 32 - 1); BigInteger u = base.add(x); ! int a = 1 + rndSeed.getRandom().nextInt(31); BigInteger w = u.shiftLeft(a); BigInteger y = fetchNumber(BITS_KARATSUBA - 32 - 1); BigInteger v = base.add(y); ! int b = 1 + rndSeed.getRandom().nextInt(32); BigInteger z = v.shiftLeft(b); BigInteger multiplyResult = u.multiply(v).shiftLeft(a + b); BigInteger karatsubaMultiplyResult = w.multiply(z); --- 312,327 ---- BigInteger base = BigInteger.ONE.shiftLeft(BITS_KARATSUBA - 32 - 1); for (int i=0; i<SIZE; i++) { BigInteger x = fetchNumber(BITS_KARATSUBA - 32 - 1); BigInteger u = base.add(x); ! int a = 1 + random.nextInt(31); BigInteger w = u.shiftLeft(a); BigInteger y = fetchNumber(BITS_KARATSUBA - 32 - 1); BigInteger v = base.add(y); ! int b = 1 + random.nextInt(32); BigInteger z = v.shiftLeft(b); BigInteger multiplyResult = u.multiply(v).shiftLeft(a + b); BigInteger karatsubaMultiplyResult = w.multiply(z);
*** 363,373 **** BigInteger base = BigInteger.ONE.shiftLeft(BITS_KARATSUBA_SQUARE - 32 - 1); for (int i=0; i<SIZE; i++) { BigInteger x = fetchNumber(BITS_KARATSUBA_SQUARE - 32 - 1); BigInteger u = base.add(x); ! int a = 1 + rndSeed.getRandom().nextInt(31); BigInteger w = u.shiftLeft(a); BigInteger squareResult = u.multiply(u).shiftLeft(2*a); BigInteger karatsubaSquareResult = w.multiply(w); --- 366,376 ---- BigInteger base = BigInteger.ONE.shiftLeft(BITS_KARATSUBA_SQUARE - 32 - 1); for (int i=0; i<SIZE; i++) { BigInteger x = fetchNumber(BITS_KARATSUBA_SQUARE - 32 - 1); BigInteger u = base.add(x); ! int a = 1 + random.nextInt(31); BigInteger w = u.shiftLeft(a); BigInteger squareResult = u.multiply(u).shiftLeft(2*a); BigInteger karatsubaSquareResult = w.multiply(w);
*** 381,391 **** failCount = 0; base = base.shiftLeft(BITS_TOOM_COOK_SQUARE - BITS_KARATSUBA_SQUARE); for (int i=0; i<SIZE; i++) { BigInteger x = fetchNumber(BITS_TOOM_COOK_SQUARE - 32 - 1); BigInteger u = base.add(x); ! int a = 1 + rndSeed.getRandom().nextInt(31); BigInteger w = u.shiftLeft(a); BigInteger squareResult = u.multiply(u).shiftLeft(2*a); BigInteger toomCookSquareResult = w.multiply(w); --- 384,394 ---- failCount = 0; base = base.shiftLeft(BITS_TOOM_COOK_SQUARE - BITS_KARATSUBA_SQUARE); for (int i=0; i<SIZE; i++) { BigInteger x = fetchNumber(BITS_TOOM_COOK_SQUARE - 32 - 1); BigInteger u = base.add(x); ! int a = 1 + random.nextInt(31); BigInteger w = u.shiftLeft(a); BigInteger squareResult = u.multiply(u).shiftLeft(2*a); BigInteger toomCookSquareResult = w.multiply(w);
*** 415,438 **** public static void divideLarge() { int failCount = 0; BigInteger base = BigInteger.ONE.shiftLeft(BITS_BURNIKEL_ZIEGLER + BITS_BURNIKEL_ZIEGLER_OFFSET - 33); for (int i=0; i<SIZE; i++) { ! BigInteger addend = new BigInteger(BITS_BURNIKEL_ZIEGLER + BITS_BURNIKEL_ZIEGLER_OFFSET - 34, rndSeed.getRandom()); BigInteger v = base.add(addend); ! BigInteger u = v.multiply(BigInteger.valueOf(2 + rndSeed.getRandom().nextInt(Short.MAX_VALUE - 1))); ! if(rndSeed.getRandom().nextBoolean()) { u = u.negate(); } ! if(rndSeed.getRandom().nextBoolean()) { v = v.negate(); } ! int a = BITS_BURNIKEL_ZIEGLER_OFFSET + rndSeed.getRandom().nextInt(16); ! int b = 1 + rndSeed.getRandom().nextInt(16); BigInteger w = u.multiply(BigInteger.ONE.shiftLeft(a)); BigInteger z = v.multiply(BigInteger.ONE.shiftLeft(b)); BigInteger[] divideResult = u.divideAndRemainder(v); divideResult[0] = divideResult[0].multiply(BigInteger.ONE.shiftLeft(a - b)); --- 418,441 ---- public static void divideLarge() { int failCount = 0; BigInteger base = BigInteger.ONE.shiftLeft(BITS_BURNIKEL_ZIEGLER + BITS_BURNIKEL_ZIEGLER_OFFSET - 33); for (int i=0; i<SIZE; i++) { ! BigInteger addend = new BigInteger(BITS_BURNIKEL_ZIEGLER + BITS_BURNIKEL_ZIEGLER_OFFSET - 34, random); BigInteger v = base.add(addend); ! BigInteger u = v.multiply(BigInteger.valueOf(2 + random.nextInt(Short.MAX_VALUE - 1))); ! if(random.nextBoolean()) { u = u.negate(); } ! if(random.nextBoolean()) { v = v.negate(); } ! int a = BITS_BURNIKEL_ZIEGLER_OFFSET + random.nextInt(16); ! int b = 1 + random.nextInt(16); BigInteger w = u.multiply(BigInteger.ONE.shiftLeft(a)); BigInteger z = v.multiply(BigInteger.ONE.shiftLeft(b)); BigInteger[] divideResult = u.divideAndRemainder(v); divideResult[0] = divideResult[0].multiply(BigInteger.ONE.shiftLeft(a - b));
*** 450,460 **** public static void bitCount() { int failCount = 0; for (int i=0; i<SIZE*10; i++) { ! int x = rndSeed.getRandom().nextInt(); BigInteger bigX = BigInteger.valueOf((long)x); int bit = (x < 0 ? 0 : 1); int tmp = x, bitCount = 0; for (int j=0; j<32; j++) { bitCount += ((tmp & 1) == bit ? 1 : 0); --- 453,463 ---- public static void bitCount() { int failCount = 0; for (int i=0; i<SIZE*10; i++) { ! int x = random.nextInt(); BigInteger bigX = BigInteger.valueOf((long)x); int bit = (x < 0 ? 0 : 1); int tmp = x, bitCount = 0; for (int j=0; j<32; j++) { bitCount += ((tmp & 1) == bit ? 1 : 0);
*** 471,481 **** public static void bitLength() { int failCount = 0; for (int i=0; i<SIZE*10; i++) { ! int x = rndSeed.getRandom().nextInt(); BigInteger bigX = BigInteger.valueOf((long)x); int signBit = (x < 0 ? 0x80000000 : 0); int tmp = x, bitLength, j; for (j=0; j<32 && (tmp & 0x80000000)==signBit; j++) tmp <<= 1; --- 474,484 ---- public static void bitLength() { int failCount = 0; for (int i=0; i<SIZE*10; i++) { ! int x = random.nextInt(); BigInteger bigX = BigInteger.valueOf((long)x); int signBit = (x < 0 ? 0x80000000 : 0); int tmp = x, bitLength, j; for (j=0; j<32 && (tmp & 0x80000000)==signBit; j++) tmp <<= 1;
*** 575,585 **** int failCount2 = 0; int failCount3 = 0; for (int i=0; i<100; i++) { BigInteger x = fetchNumber(order); ! int n = Math.abs(rndSeed.getRandom().nextInt()%200); if (!x.shiftLeft(n).equals (x.multiply(BigInteger.valueOf(2L).pow(n)))) failCount1++; --- 578,588 ---- int failCount2 = 0; int failCount3 = 0; for (int i=0; i<100; i++) { BigInteger x = fetchNumber(order); ! int n = Math.abs(random.nextInt()%200); if (!x.shiftLeft(n).equals (x.multiply(BigInteger.valueOf(2L).pow(n)))) failCount1++;
*** 642,653 **** public static void stringConv() { int failCount = 0; // Generic string conversion. for (int i=0; i<100; i++) { ! byte xBytes[] = new byte[Math.abs(rndSeed.getRandom().nextInt())%100+1]; ! rndSeed.getRandom().nextBytes(xBytes); BigInteger x = new BigInteger(xBytes); for (int radix=Character.MIN_RADIX; radix < Character.MAX_RADIX; radix++) { String result = x.toString(radix); BigInteger test = new BigInteger(result, radix); --- 645,656 ---- public static void stringConv() { int failCount = 0; // Generic string conversion. for (int i=0; i<100; i++) { ! byte xBytes[] = new byte[Math.abs(random.nextInt())%100+1]; ! random.nextBytes(xBytes); BigInteger x = new BigInteger(xBytes); for (int radix=Character.MIN_RADIX; radix < Character.MAX_RADIX; radix++) { String result = x.toString(radix); BigInteger test = new BigInteger(result, radix);
*** 667,677 **** int upper = factor * BITS_SCHOENHAGE_BASE + 33; int lower = upper - 35; for (int bits = upper; bits >= lower; bits--) { for (int i = 0; i < 50; i++) { ! BigInteger x = BigInteger.ONE.shiftLeft(bits - 1).or(new BigInteger(bits - 2, rndSeed.getRandom())); for (int radix = Character.MIN_RADIX; radix < Character.MAX_RADIX; radix++) { String result = x.toString(radix); BigInteger test = new BigInteger(result, radix); if (!test.equals(x)) { --- 670,680 ---- int upper = factor * BITS_SCHOENHAGE_BASE + 33; int lower = upper - 35; for (int bits = upper; bits >= lower; bits--) { for (int i = 0; i < 50; i++) { ! BigInteger x = BigInteger.ONE.shiftLeft(bits - 1).or(new BigInteger(bits - 2, random)); for (int radix = Character.MIN_RADIX; radix < Character.MAX_RADIX; radix++) { String result = x.toString(radix); BigInteger test = new BigInteger(result, radix); if (!test.equals(x)) {
*** 764,776 **** // and modulus must be a prime or pseudoprime (Carmichael number) public static void modExp2(int order) { int failCount = 0; for (int i=0; i<10; i++) { ! BigInteger m = new BigInteger(100, 5, rndSeed.getRandom()); while(m.compareTo(BigInteger.ONE) != 1) ! m = new BigInteger(100, 5, rndSeed.getRandom()); BigInteger exp = m.subtract(BigInteger.ONE); BigInteger base = fetchNumber(order).abs(); while(base.compareTo(m) != -1) base = fetchNumber(order).abs(); while(base.equals(BigInteger.ZERO)) --- 767,779 ---- // and modulus must be a prime or pseudoprime (Carmichael number) public static void modExp2(int order) { int failCount = 0; for (int i=0; i<10; i++) { ! BigInteger m = new BigInteger(100, 5, random); while(m.compareTo(BigInteger.ONE) != 1) ! m = new BigInteger(100, 5, random); BigInteger exp = m.subtract(BigInteger.ONE); BigInteger base = fetchNumber(order).abs(); while(base.compareTo(m) != -1) base = fetchNumber(order).abs(); while(base.equals(BigInteger.ZERO))
*** 826,836 **** BigInteger p1, p2, c1; int failCount = 0; // Test consistency for(int i=0; i<10; i++) { ! p1 = BigInteger.probablePrime(100, rndSeed.getRandom()); if (!p1.isProbablePrime(100)) { System.err.println("Consistency "+p1.toString(16)); failCount++; } } --- 829,839 ---- BigInteger p1, p2, c1; int failCount = 0; // Test consistency for(int i=0; i<10; i++) { ! p1 = BigInteger.probablePrime(100, random); if (!p1.isProbablePrime(100)) { System.err.println("Consistency "+p1.toString(16)); failCount++; } }
*** 867,877 **** // Test some computed Carmichael numbers. // Numbers of the form (6k+1)(12k+1)(18k+1) are Carmichael numbers if // each of the factors is prime int found = 0; ! BigInteger f1 = new BigInteger(40, 100, rndSeed.getRandom()); while (found < NUM_CARMICHAELS_TO_TEST) { BigInteger k = null; BigInteger f2, f3; f1 = f1.nextProbablePrime(); BigInteger[] result = f1.subtract(ONE).divideAndRemainder(SIX); --- 870,880 ---- // Test some computed Carmichael numbers. // Numbers of the form (6k+1)(12k+1)(18k+1) are Carmichael numbers if // each of the factors is prime int found = 0; ! BigInteger f1 = new BigInteger(40, 100, random); while (found < NUM_CARMICHAELS_TO_TEST) { BigInteger k = null; BigInteger f2, f3; f1 = f1.nextProbablePrime(); BigInteger[] result = f1.subtract(ONE).divideAndRemainder(SIX);
*** 894,915 **** f1 = f1.add(TWO); } // Test some composites that are products of 2 primes for (int i=0; i<50; i++) { ! p1 = BigInteger.probablePrime(100, rndSeed.getRandom()); ! p2 = BigInteger.probablePrime(100, rndSeed.getRandom()); c1 = p1.multiply(p2); if (c1.isProbablePrime(100)) { System.err.println("Composite failed "+c1.toString(16)); failCount++; } } for (int i=0; i<4; i++) { ! p1 = BigInteger.probablePrime(600, rndSeed.getRandom()); ! p2 = BigInteger.probablePrime(600, rndSeed.getRandom()); c1 = p1.multiply(p2); if (c1.isProbablePrime(100)) { System.err.println("Composite failed "+c1.toString(16)); failCount++; } --- 897,918 ---- f1 = f1.add(TWO); } // Test some composites that are products of 2 primes for (int i=0; i<50; i++) { ! p1 = BigInteger.probablePrime(100, random); ! p2 = BigInteger.probablePrime(100, random); c1 = p1.multiply(p2); if (c1.isProbablePrime(100)) { System.err.println("Composite failed "+c1.toString(16)); failCount++; } } for (int i=0; i<4; i++) { ! p1 = BigInteger.probablePrime(600, random); ! p2 = BigInteger.probablePrime(600, random); c1 = p1.multiply(p2); if (c1.isProbablePrime(100)) { System.err.println("Composite failed "+c1.toString(16)); failCount++; }
*** 960,970 **** } // Next, pick some large primes, use nextProbablePrime to find the // next one, and make sure there are no primes in between for (int i=0; i<100; i+=10) { ! p1 = BigInteger.probablePrime(50 + i, rndSeed.getRandom()); p2 = p1.add(ONE); p3 = p1.nextProbablePrime(); while(p2.compareTo(p3) < 0) { if (p2.isProbablePrime(100)){ System.err.println("nextProbablePrime failed"); --- 963,973 ---- } // Next, pick some large primes, use nextProbablePrime to find the // next one, and make sure there are no primes in between for (int i=0; i<100; i+=10) { ! p1 = BigInteger.probablePrime(50 + i, random); p2 = p1.add(ONE); p3 = p1.nextProbablePrime(); while(p2.compareTo(p3) < 0) { if (p2.isProbablePrime(100)){ System.err.println("nextProbablePrime failed");
*** 1025,1035 **** } f.delete(); } for(int i=0; i<10; i++) { ! BigInteger b1 = fetchNumber(rndSeed.getRandom().nextInt(100)); BigInteger b2 = null; File f = new File("serialtest"); try (FileOutputStream fos = new FileOutputStream(f)) { try (ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(b1); --- 1028,1038 ---- } f.delete(); } for(int i=0; i<10; i++) { ! BigInteger b1 = fetchNumber(random.nextInt(100)); BigInteger b2 = null; File f = new File("serialtest"); try (FileOutputStream fos = new FileOutputStream(f)) { try (ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(b1);
*** 1059,1070 **** * used for call parameters 1, 2, and 3. The SIZE is interpreted as * the maximum number of decimal digits that the parameters will have. * */ public static void main(String[] args) throws Exception { - System.out.println("Random number generator seed = " + rndSeed.getSeed()); - // Some variables for sizing test numbers in bits int order1 = ORDER_MEDIUM; int order2 = ORDER_SMALL; int order3 = ORDER_KARATSUBA; int order4 = ORDER_TOOM_COOK; --- 1062,1071 ----
*** 1132,1143 **** * numbers, empty BigIntegers, etc. * * If order is less than 2, order is changed to 2. */ private static BigInteger fetchNumber(int order) { ! boolean negative = rndSeed.getRandom().nextBoolean(); ! int numType = rndSeed.getRandom().nextInt(7); BigInteger result = null; if (order < 2) order = 2; switch (numType) { case 0: // Empty --- 1133,1144 ---- * numbers, empty BigIntegers, etc. * * If order is less than 2, order is changed to 2. */ private static BigInteger fetchNumber(int order) { ! boolean negative = random.nextBoolean(); ! int numType = random.nextInt(7); BigInteger result = null; if (order < 2) order = 2; switch (numType) { case 0: // Empty
*** 1157,1194 **** fullBits[0] &= (1 << (8-excessBits)) - 1; result = new BigInteger(1, fullBits); break; case 3: // One bit in number ! result = BigInteger.ONE.shiftLeft(rndSeed.getRandom().nextInt(order)); break; case 4: // Random bit density byte[] val = new byte[(order+7)/8]; ! int iterations = rndSeed.getRandom().nextInt(order); for (int i=0; i<iterations; i++) { ! int bitIdx = rndSeed.getRandom().nextInt(order); val[bitIdx/8] |= 1 << (bitIdx%8); } result = new BigInteger(1, val); break; case 5: // Runs of consecutive ones and zeros result = ZERO; int remaining = order; ! int bit = rndSeed.getRandom().nextInt(2); while (remaining > 0) { ! int runLength = Math.min(remaining, rndSeed.getRandom().nextInt(order)); result = result.shiftLeft(runLength); if (bit > 0) result = result.add(ONE.shiftLeft(runLength).subtract(ONE)); remaining -= runLength; bit = 1 - bit; } break; default: // random bits ! result = new BigInteger(order, rndSeed.getRandom()); } if (negative) result = result.negate(); --- 1158,1195 ---- fullBits[0] &= (1 << (8-excessBits)) - 1; result = new BigInteger(1, fullBits); break; case 3: // One bit in number ! result = BigInteger.ONE.shiftLeft(random.nextInt(order)); break; case 4: // Random bit density byte[] val = new byte[(order+7)/8]; ! int iterations = random.nextInt(order); for (int i=0; i<iterations; i++) { ! int bitIdx = random.nextInt(order); val[bitIdx/8] |= 1 << (bitIdx%8); } result = new BigInteger(1, val); break; case 5: // Runs of consecutive ones and zeros result = ZERO; int remaining = order; ! int bit = random.nextInt(2); while (remaining > 0) { ! int runLength = Math.min(remaining, random.nextInt(order)); result = result.shiftLeft(runLength); if (bit > 0) result = result.add(ONE.shiftLeft(runLength).subtract(ONE)); remaining -= runLength; bit = 1 - bit; } break; default: // random bits ! result = new BigInteger(order, random); } if (negative) result = result.negate();