素數相關演算法(二)

2021-09-30 02:13:17 字數 975 閱讀 1961

素數演算法(二)

上次討論了簡單的素數判定的演算法,不過這個演算法對於位數較大(一般小於108)的素數判定就顯得相當力不從心了。比如在素數目前最廣泛的應用領域-公共金鑰體系中,一般選擇的素數都是相當大的(通常在100位以上),如果採用上次的試除法來判定,那麼可能要窮盡你一生的時間都還不夠。所以在一般的應用領域,人們採用的是rabin-miller檢驗法。下面是該檢驗法的演算法:

首先選擇乙個代測的隨機數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,再測試。

經測試,這個演算法在sun的sparc ii工作站上實現:

2 .8秒產生乙個256位的素數

24.0秒產生乙個512位的素數

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

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

小演算法整理 素數相關演算法

素性測試演算法 判斷素數 判斷是否為素數 bool isprime int k return true 素數表的生成 一 列舉篩選法 const int maxn 101 表長 int prime maxn pnum 0 素數表,素數個數 bool p maxn p i true 表示i是素數 vo...

素數相關習題

素數定義 質數又稱素數。乙個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數 否則稱為合數 規定1既不是質數也不是合數 判斷乙個數n是不是素數,最簡單的方法就是直接遍歷,看看從2到n 1是否能夠整除n。如下 bool isprime int n return true 因為如果能找...

素數相關問題

判斷素數 判斷乙個數是不是素數 最常用解法 sqrt n 1 int prime intn 2 13return1 14 15 找規律優化版,更快 1 int prime intn 2 14return1 15 16 篩選素數 判斷某個範圍內所有數是不是素數,或找出所有素數。其實用判斷素數迴圈一遍也...