0

I need to have random Big Integers for checking if number is prime (there is a method that does that), but this numbers must start from 264. There is an answer in stack overflow how to random BigIntegers from x to y, but i don't know how to put 264 in this method. Is there any way?

BigInteger randomNumber;
do {
    randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);

I expect the output to be from 18 446 744 073 709 551 616‬ to any bigger available.

azurefrog
  • 10,785
  • 7
  • 42
  • 56

4 Answers4

1

First you create the number 2^64 with a byte array of the length 9:

byte[] bytes = new byte[8+1];
bytes[0] = 1; // 0x01 0x00 0x00 0x00 .... 0x00
BigInteger base = new BigInteger(bytes);

And then you can add any random BigInteger you like with the BigInteger(int, Random); constructor.

BigInteger r = new BigInteger(32, new Random());
System.out.println(base);
System.out.println(r);
System.out.println(base.add(r));

This will generate an outlike like this:

18446744073709551616
1629299848
18446744075338851464
Progman
  • 16,827
  • 6
  • 33
  • 48
0

first randomize the digits, then randomly generate each digit and append them together

public static BigInteger randomBigInteger () {
  Random r = ...;
  var digits = r.randomInt(65 - 2) + 2;
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i < digits.length; i++) {
    sb.append(r.randomInt(10));
  }
  return new BigInteger(sb.toString());
}
ControlAltDel
  • 33,923
  • 10
  • 53
  • 80
0

You meant raise to the power of?

BigInteger randomNumber;
do {
    randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);

How to generate a random BigInteger value in Java?

The constructor public BigInteger(int numberOfBits, Random rnd) creates a positive BigInteger greater equal 0 and less equal 2^numberOfBits - 1.

ensure a randomNumber greater than 2^64 by adding 2^64 + 1

randomNumber.add( BigInteger.valueOf( 2 ).pow( 64 ).add( BigInteger.ONE ) );
Kaplan
  • 2,572
  • 13
  • 14
0

One easy way is to simply generate random numbers from 0 to 2maxbits-64 - 1, set the low-order bit to 1, and then shift left by 64.


    do {
        randomNumber = new BigInteger(upperLimit.bitLength()-64, randomSource).or(BigInteger.ONE);
        randomNumber = randomNumber.shiftLeft(64);
    } while (randomNumber.compareTo(upperLimit) >= 0);
President James K. Polk
  • 40,516
  • 21
  • 95
  • 125