On Aug 26, 2013, at 3:15 PM, Paul Sandoz <paul.san...@oracle.com> wrote:
>> As discussed in the relevant threads in the original bug report, the
>> actual fix should be a very accurate replacement of SR with some other
>> faster and reliable RNG to avoid the inherent scalability bottlenecks.
>> 
> 
> I don't know about the PRNG requirements for Miller-Rabin but the changes to 
> TLR in review might be a possible substitute for SR in this case, since TLR 
> will be updated to use the same PRNG algorithm as SplittableRandom, which 
> passes DieHarder tests.  Otherwise, i think we may just be stuck with SR.
> 

FYI the updates to ThreadLocalRandom are now in tl, so it is possible to more 
easily investigate whether this can substitute SecureRandom.

<ponder>

IIUC the Miller-Rabin algorithm seems almost embarrassingly parallel.

One could write a Spliterator in combination with SplittableRandom to generate 
an appropriate source of BigInteger instances hooked up to a stream:

  Stream<BigInteger> s = BigInteger.randomStream(pp.bitLength(), n);
  return s.filter(b -> b.compareTo(ONE) > 0 && b.compareTo(pp) < 0).map(b -> 
test(b, pp)).allMatch(r -> r == true);

I suppose in some respects it is unfortunate to have to write a Spliterator 
instead of piggybacking off IntStream.range(0, n) and associating with 
functions to create a SplittableRandom and split based on how the range is 
split.

Another way could be to write a Spliterator for a source of depth and 
SplittablleRandom, then hook that up to flatMap:

  Stream<Pair<Integer, SplittableRandom>> s = ...;  
  return s.flatMap((d, sr) -> bigInts(sr, pp.bitLength(), n / (1 << d)).map(b 
-> test(b, pp)).allMatch(r -> r == true);

</ponder>

Paul.

Reply via email to