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以內的所...