2009-11-26 86 views
7

我想生成一個隨機的BigInteger類型的素數,即在我提供的最小值和最大值之間。Java BigInteger素數

我知道BigInteger.probablePrime(int比特長度,隨機),但我不知道如何甚至如果比特長度轉換爲輸出素數的最大/最小值。

感謝, Steven1350

回答

2

BigInteger.probablePrime(bitLength, random)是否會返回指定位長度的(可能的)黃金。這意味着最大值爲2^bitlength-1,最小值爲2 ^(bitlength-1)。儘管我討厭它作爲答案,但除非你想開始研究數論,否則這可能是你最好的選擇。

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

+0

有趣。從Doc中,「返回的BI是複合的概率<2^-100」,確實不太可能!你會偶然知道這種方法的複雜性嗎? – 2011-02-18 17:20:52

+0

而不是用位長調用probalePrime範圍調用可以在範圍內創建一個隨機的大整數並調用nextProbablePrime。這會更快地生成素數,因爲它會多次調用problePrime。當然,你必須解決的問題是你的範圍的最大值大於最大值。 – 2012-09-22 11:03:04

3

jprete的回答是好的,如果你比最大值/最小值是不是接近1

如果你有一個狹窄的範圍內,最好的辦法是可能只是做類似如下:

// 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); 

density of primes整體上相當高,它的log(x)基本上是1,所以你不應該重複太多次才能找到素數。 (例如:對於數字大約爲10 ,平均每52個整數中有一個是一個素數,上面的代碼只對每6個數字中有2個有影響,所以你最終會平均循環17次次數約爲10 。)

只要確保您有一個良好的素性測試,並且Java BigInteger有一個。

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

編輯:另見US patent #7149763(OMFG !!!)

+1

你需要添加min2到x? – jprete 2009-11-26 02:07:29

+0

謝謝,我忘記了那個 – 2009-11-26 02:15:50

+0

呃...你可能想要翻轉while-loop終止...之前錯過了那個。除此之外,我認爲你很清楚。 – jprete 2009-11-26 02:31:17