簡體   English   中英

Java BigInteger素數

[英]Java BigInteger prime numbers

我正在嘗試生成BigInteger類型的隨機素數,即我提供的最小值和最大值之間。

我知道BigInteger.probablePrime(int bitlength,random),但我不確定比特長度是如何轉換為輸出素數的最大值/最小值。

謝謝,Steven1350

如果您的比率max / min不接近1,則jprete的答案很好。

如果你有一個狹窄的范圍,你最好的選擇可能只是做以下事情:

// this is pseudocode:
//
// round min down to multiple of 6, max up to multiple of 6
min6 = floor(min/6);
max6 = ceil(max/6);
maybePrimeModuli = [1,5];
do 
{
   b = generateRandom(maybePrimeModuli.length);
   // generate a random offset modulo 6 which could be prime
   x = 6*(min6 + generateRandom(max6-min6)) + b;
   // generate a random number which is congruent to b modulo 6
   // from 6*min6 to 6*max6-1
   // (of the form 6k+1 or 6k+5)

   // the other choices 6k, 6k+2, 6k+3, 6k+4 are composite 
} while not isProbablePrime(x);

素數密度總體上相當高,基本上是log(x)中的1,所以你不必重復太多次來找到素數。 (僅作為一個例子:對於10 23左右的數字,平均每52個整數中就有一個是素數。上面的代碼只有6個數字中的2個,所以你最終會平均循環17次數字大約10 23。

只要確保你有一個很好的素性測試,Java BigInteger就有一個。

作為讀者的練習,擴展上述功能,以便通過使用30k + x(模30,有22個總是復合的模數,只剩下8個可能是素數)或者210k,提前過濾出更多的復合數。 + x。

編輯:另見美國專利#7149763 (OMFG !!!)

BigInteger.probablePrime(bitLength, random)將返回指定位長度的(可能)素數。 這轉換為最大值2 ^比特長度-1和最小值2 ^(比特長度-1)。 盡管我討厭它作為答案,但它可能是你最好的選擇,除非你想開始鑽研數論。

你需要做的是找出你的范圍所要求的位長,然后將它們傳遞給probablePrime()直到你找回一個在正確范圍內的素數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM