如何產生素數

2021-04-07 07:02:57 字數 1533 閱讀 2660

solovag-strasson

robert solovag和volker strasson開發了一種概率的基本測試演算法。這個演算法使用了雅可比函式來測試p是否為素數:

(1) 選擇乙個小於p的隨機數a。

(2) 如果g_c_d(a,p)<>1,那麼p通不過測試,它是合數。

(3) 計算j=a^(p-1)/2 mod p。

(4) 計算雅可比符號j(a,p)。

(5) 如果j<>j(a,p),那麼p肯定不是素數。

(6) 如果j=j(a,p),那麼p不是素數的可能性值多是50%

數a被稱為乙個證據,如果a不能確定p,p肯定不是素數。如果p是合數。隨機數a是證據的概率不小於50%。對a選擇t個不同的隨機值,重複t次這種測試。p通過所有t次測試後,它是合數的可能性不超過1/2^t。

lehmann

另一種更簡單的測試是由lehmann獨自研究的。下面是它的測試演算法:

(1) 選擇乙個小於p的隨機數a。

(2) 計算a^(p-1)/2 mod p

(3) 如果a^(p-1)/2<>1或-1(mod p),那麼p肯定不是素數。

(4) 如果a^(p-1)/2=1或-1(mod p),那麼p不是素數的可能性值多是50%

同樣,重複t次,那麼p可能是素數所冒的錯誤風險不超過1/2^t。

rabin-miller

這是個很容易且廣泛使用的簡單演算法,它基於gary miller的部分象法,有michael rabin發展。事實上,這是在nist的dss建議中推薦的演算法的乙個簡化版。 

首先選擇乙個代測的隨機數p,計算b,b是2整除p-1的次數。然後計算m,使得n=1+(2^b)m。

(1) 選擇乙個小於p的隨機數a。

(2) 設j=0且z=a^m mod p

(3) 如果z=1或z=p-1,那麼p通過測試,可能使素數

(4) 如果j>0且z=1, 那麼p不是素數

(5) 設j=j+1。如果jp-1,設z=z^2 mod p,然後回到(4)。如果z=p-1,那麼p通過測試,可能為素數。

(6) 如果j=b 且z<>p-1,不是素數

這個測試較前乙個速度快。數a被當成證據的概率為75%。這意味著當迭代次數為t時,它產生乙個假的素數所花費的時間不超過1/4^t。實際上,對大多數隨機數,幾乎99.99%肯定a是證據。

實際考慮:

在實際演算法,產生素數是很快的。

(1) 產生乙個n-位的隨機數p

(2) 設高位和低位為1(設高位是為了保證位數,設低位是為了保證位奇數)

(3) 檢查以確保p不能被任何小素數整除:如3,5,7,11等等。有效的方法是測試小於2000的素數。使用字輪方法更快

(4) 對某隨機數a執行rabin-miller檢測,如果p通過,則另外產生乙個隨機數a,在測試。選取較小的a值,以保證速度。做5次 rabin-miller測試如果p在其中失敗,從新產生p,再測試。

在sparc ii上實現: 2 .8秒產生乙個256位的素數

24.0秒產生乙個512位的素數

2分鐘產生乙個768位的素數

5.1分鐘產生乙個1024位的素數

產生素數的演算法

solovag strasson robert solovag和volker strasson開發了一種概率的基本測試演算法。這個演算法使用了雅可比函式來測試p是否為素數 1 選擇乙個小於p的隨機數a。2 如果 a,p 1,那麼 p 通不過測試,它是合數。3 計算j a p 1 2 mod p。4 ...

判斷素數與產生素數表(質數)

素數在小學數學也叫質數 方法 所謂素數是指除了1和它本身以外,不能被任何整數整除的數,例如17就是素數,因為它不能被2 16的任一整數整除。因此判斷乙個整數m是否是素數,只需把m被2 m 1之間的每乙個整數去除,如果都不能被整除,那麼m就是乙個素數。另外判斷方法還可以簡化。m不必唄2 m 1之間的每...

如何求素數

1。自然數是0,1,2 2。素數是2,3,5 不包括1的只能背1和它本身整除的自然數 public class test s i system.out.println 第 i 個素數是 n return s public static void main string args 求10000以內的所...