Hello,

First, I want to thank the creators of the classpath project for the wonderful
work.

I stumbled over the following code block in the class java.math.BigInteger and
it is not clear to me how it works:


 public BigInteger(int bitLength, int certainty, Random rnd)
 237:   {
 238:     this(bitLength, rnd);
 239:
 240:     // Keep going until we find a probable prime.
 241:     BigInteger result;
 242:     while (true)
 243:       {
 244:         // ...but first ensure that BI has bitLength bits
 245:         result = setBit(bitLength - 1);
 246:         this.ival = result.ival;
 247:         this.words = result.words;
 248:     if (isProbablePrime(certainty))
 249:       return;
 250:
 251:     init(bitLength, rnd);
 252:       }
 253:   }


I suppose the contract says that the returned number is prime with given
probability 1 - 1/2^certainty, but if the routine isProbablePrime(certainty)
does only test with the given certainty this might not work. The reason is
that the failure probability is not independent from the number of previous
trials. If we ignore the prime number theorem for a while and assume that
primes are very rare, lets say there density is much lower than 1/2^certainty,
then the loop is likely to run until the test returns a wrong result and we
almost never generate a prime number!

Of course the prime number theorem tells us that the above algorithm will
work somehow, but unless further comments can clarify what the routine
actually does, I suggest to increase the certainty by one before entering
the loop (see Gathen/Gerhard "Modern Computer Algebra").

Cheers,
Oliver

Reply via email to