當前位置:首頁 » 操作系統 » 米勒拉賓演算法

米勒拉賓演算法

發布時間: 2022-05-24 01:35:56

① 急急急 求大神幫忙 用vc++ 生成1024位大素數 用到米勒拉賓素性測試

首先如果搞密碼學的編程推薦你看本書《程序員密碼學》裡面講的是現在密碼學的實現再次,解決生成大素數的這個問題思路是這樣的:隨機生成一個很大的數,用的演算法判斷這個數是不是素數如果不是繼續生成另一個大素數再判斷直到找到一個大素數也就是說核心是素性檢驗演算法這種演算法不少有fermat素性檢驗Miller-Rabin素性檢驗還有好幾種但是沒數學基礎的話是搞不懂的如果深入了解的話參照一本書《信息安全數學基礎》其中有一章都是講素性檢驗的問題的推薦樓主採用fermat素性檢驗最簡單但是個不確定演算法因為有fermat欺騙但是概率極低極低可以用/view/831881.htm

② 關於素數檢驗的米勒拉賓演算法的C++實現

Miller-Rabin演算法是基於費馬定理的:
如果n為質數,(a,n)=1 那麼 a^(n-1)=1 (mod n)

Miller-Rabin演算法就是費馬定理反向的使用:
如果有足夠多的a,(a,n)=1 使a^(n-1)=1 (mod n)都成立
那麼n為質數

但是並不是一個完美的演算法,
如果以2,3,5,7為底,在2.5*10^13以內只有3215031751這一個數是判斷錯誤的
因為A^B可以在logB的時間復雜度內運算完
所以Miller-Rabin演算法的復雜度O(logn)比起樸素O(sqrt(n))快上了非常多

程序:(你可以讓p數組隨機,不一定要用2,3,5,7為底)
const
p:array[1..4] of integer=(2,3,5,7);
var
n,i:longint;
f:boolean;

function exp(a,b:longint):longint; //計算a^b除以n的余數
var
t:qword;
begin
if b=0 then exit(1);
if b=1 then exit(a mod n);
t:=sqr(exp(a,b div 2)) mod n;
if b mod 2=1 then t:=t*a mod n;
end;

begin
readln(n);
f:=true;
for i:=1 to 4 do
if exp(p[i],n-1)<>1 then
begin
f:=false;
break;
end;
if f then writeln('YES') else writeln('NO');
end.

其中,需要自行判斷n為1,2,3,5,7的情況(一開始加個if就行)

這個程序能處理出longint內所有>7的素數

③ 素數是什麼

素數又叫質數(prime number),有無限個。質數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。

質數具有許多獨特的性質:

(1)質數p的約數只有兩個:1和p。

(2)初等數學基本定理:任一大於1的自然數,要麼本身是質數,要麼可以分解為幾個質數之積,且這種分解是唯一的。

(3)質數的個數是無限的。

(4)質數的個數公式

(3)米勒拉賓演算法擴展閱讀:

逆素數:

順著讀與逆著讀都是素數的數。如1949與9491,3011與1103,1453與3541等。無重逆素數是數字都不重復的逆素數。如13與31,17與71,37與73,79與97,107與701等。

循環下降素數與循環上升素數:

按1——9這9個數碼反序或正序相連而成的素數(9和1相接)。如:43,1987,76543,23,23456789,1234567891。現在找到的最大一個是28位的數:1234567891234567891234567891。

由一些特殊數碼組成的數:

如31,331,3331,33331,333331,3333331,以及33333331都是素數,但下一個333333331卻是一個合數。特別著名的是全由1組成的素數。把由連續n個1組成的數記為Rn,則R2=11是一個素數,後來發現R19、R23、R317都是素數。

素數研究是數論中最古老、也是最基本的部分,其中集中了看上去極為簡單、卻幾十年甚至幾百年都難以解決的大量問題。除了"哥德巴赫猜想"等幾個著名問題外,還有許多問題至今未解決。

網路-質數

④ 輸出指定下限和數量的質數

輸出指定下限和數量的質數:如果j>i/2就說明i沒有除1和他本身之外的因數,因為大於i/2的數不可能是i的因數,那麼i就是質數,輸出i。

參考代碼如下:package test;public class Test {public static void main(String[] args) {int j;for (int i = 2; i <= 100; i++) // 1不是素數,所以直接從2開始循環{j = 2;while (i % j != 0)j++; // 測試2至i的數字是否能被i整除,如不能就自加if (j == i) // 當有被整除的數字時,判斷它是不是自身。

隨機素性測試的基本結構:

1、隨機選取一個數字a。

2、檢測某個包含a和輸入n的等式(與所使用的測試方法有關)。如果等式不成立,則n是合數,a作為n是合數的證據,測試完成。

3、從1步驟重復整個過程直到達到所設定的精確程度。

在幾次或多次測試之後,如果n沒有被判斷為合數,那麼我們可以說n可能是素數。

常見的檢測演算法:費馬素性檢驗(Fermat primality test),米勒拉賓測試(Miller–Rabin primality test) ,Solovay–Strassen測試,盧卡斯-萊默檢驗法(Lucas–Lehmer primality test)。




⑤ 如何知道一個很大的數是不是素數

高速判斷用 miller-rabin演算法或者 aks 演算法

1.約定

x%y為x取模y,即x除以y所得的余數,當x<y時,x%y=x,所有取模的運算對象都為整數。
x^y表示x的y次方。乘方運算的優先順序高於乘除和取模,加減的優先順序最低。
見到x^y/z這樣,就先算乘方,再算除法。
A/B,稱為A除以B,也稱為B除A。
若A%B=0,即稱為A可以被B整除,也稱B可以整除A。
A*B表示A乘以B或稱A乘B,B乘A,B乘以A……都一樣。

2.費馬小定理:

有N為任意正整數,P為素數,且N不能被P整除(顯然N和P互質),則有:N^P%P=N(即:N的P次方除以P的余數是N)。

但是我查了很多資料見到的公式都是這個樣子:

(N^(P-1))%P=1後來分析了一下,兩個式子其實是一樣的,可以互相變形得到。

原式可化為:(N^P-N)%P=0(即:N的P次方減N可以被P整除,因為由費馬小定理知道N的P次方除以P的余數是N)把N提出來一個,N^P就成了你N*(N^(P-1)),那麼(N^P-N)%P=0可化為:

(N*(N^(P-1)-1))%P=0
請注意上式,含義是:N*(N^(P-1)-1)可以被P整除

又因為N*(N^(P-1)-1)必能整除N(這不費話么!)
所以,N*(N^(P-1)-1)是N和P的公倍數,小學知識了^_^

又因為前提是N與P互質,而互質數的最小公倍數為它們的乘積,所以一定存在

正整數M使得等式成立:N*(N^(P-1)-1)=M*N*P
兩邊約去N,化簡之:N^(P-1)-1=M*P
因為M是整數,顯然:N^(P-1)-1)%P=0即:N^(P-1)%P=1

2.費馬小定理:

有N為任意正整數,P為素數,且N不能被P整除(顯然N和P互質),則有:N^P%P=N(即:N的P次方除以P的余數是N)。

但是我查了很多資料見到的公式都是這個樣子:

(N^(P-1))%P=1後來分析了一下,兩個式子其實是一樣的,可以互相變形得到。

原式可化為:(N^P-N)%P=0(即:N的P次方減N可以被P整除,因為由費馬小定理知道N的P次方除以P的余數是N)把N提出來一個,N^P就成了你N*(N^(P-1)),那麼(N^P-N)%P=0可化為:

(N*(N^(P-1)-1))%P=0
請注意上式,含義是:N*(N^(P-1)-1)可以被P整除

又因為N*(N^(P-1)-1)必能整除N(這不費話么!)
所以,N*(N^(P-1)-1)是N和P的公倍數,小學知識了^_^

又因為前提是N與P互質,而互質數的最小公倍數為它們的乘積,所以一定存在

正整數M使得等式成立:N*(N^(P-1)-1)=M*N*P
兩邊約去N,化簡之:N^(P-1)-1=M*P
因為M是整數,顯然:N^(P-1)-1)%P=0即:N^(P-1)%P=1

2.費馬小定理:

有N為任意正整數,P為素數,且N不能被P整除(顯然N和P互質),則有:N^P%P=N(即:N的P次方除以P的余數是N)。

但是我查了很多資料見到的公式都是這個樣子:

(N^(P-1))%P=1後來分析了一下,兩個式子其實是一樣的,可以互相變形得到。

原式可化為:(N^P-N)%P=0(即:N的P次方減N可以被P整除,因為由費馬小定理知道N的P次方除以P的余數是N)把N提出來一個,N^P就成了你N*(N^(P-1)),那麼(N^P-N)%P=0可化為:

(N*(N^(P-1)-1))%P=0
請注意上式,含義是:N*(N^(P-1)-1)可以被P整除

又因為N*(N^(P-1)-1)必能整除N(這不費話么!)
所以,N*(N^(P-1)-1)是N和P的公倍數,小學知識了^_^

又因為前提是N與P互質,而互質數的最小公倍數為它們的乘積,所以一定存在

正整數M使得等式成立:N*(N^(P-1)-1)=M*N*P
兩邊約去N,化簡之:N^(P-1)-1=M*P
因為M是整數,顯然:N^(P-1)-1)%P=0即:N^(P-1)%P=1

3.積模分解公式

先有一個引理,如果有:X%Z=0,即X能被Z整除,則有:(X+Y)%Z=Y%Z
設有X、Y和Z三個正整數,則必有:(X*Y)%Z=((X%Z)*(Y%Z))%Z

想了很長時間才證出來,要分情況討論才行:

1.當X和Y都比Z大時,必有整數A和B使下面的等式成立:
X=Z*I+A(1)
Y=Z*J+B(2)
不用多說了吧,這是除模運算的性質!
將(1)和(2)代入(X*Y)modZ得:((Z*I+A)(Z*J+B))%Z乘開,再把前三項的Z提一個出來,變形為:(Z*(Z*I*J+I*A+I*B)+A*B)%Z(3)

因為Z*(Z*I*J+I*A+I*B)是Z的整數倍……暈,又來了。
概據引理,(3)式可化簡為:(A*B)%Z又因為:A=X%Z,B=Y%Z,代入上面的式子,就成了原式了。

2.當X比Z大而Y比Z小時,一樣的轉化:
X=Z*I+A
代入(X*Y)%Z得:
(Z*I*Y+A*Y)%Z
根據引理,轉化得:(A*Y)%Z
因為A=X%Z,又因為Y=Y%Z,代入上式,即得到原式。
同理,當X比Z小而Y比Z大時,原式也成立。

3.當X比Z小,且Y也比Z小時,X=X%Z,Y=Y%Z,所以原式成立。
=====================================================

4.快速計算乘方的演算法

如計算2^13,則傳統做法需要進行12次乘法。

[cpp] view plainprint?
  1. /*計算n^p*/
  2. unsigned power(unsigned n,unsigned p)
  3. {
  4. for(int i=0;i<p;i++) n*=n;
  5. return n;
  6. }
/*計算n^p*/
unsignedpower(unsignedn,unsignedp)
{
for(inti=0;i<p;i++)n*=n;
returnn;
}

該死的乘法,是時候優化一下了!把2*2的結果保存起來看看,是不是成了:

4*4*4*4*4*4*2
再把4*4的結果保存起來:16*16*16*2
一共5次運算,分別是2*2、4*4和16*16*16*2

這樣分析,我們演算法因該是只需要計算一半都不到的乘法了。
為了講清這個演算法,再舉一個例子2^7:2*2*2*2*2*2*2
兩兩分開:(2*2)*(2*2)*(2*2)*2
如果用2*2來計算,那麼指數就可以除以2了,不過剩了一個,稍後再單獨乘上它。

再次兩兩分開,指數除以2: ((2*2)*(2*2))*(2*2)*2
實際上最後一個括弧里的2 * 2是這回又剩下的,那麼,稍後再單獨乘上它 現在指數已經為1了,可以計算最終結果了:16*4*2=128

⑥ 計算器中mr是什麼意思

MR素性檢測演算法

轉載地址:http://m.blog.csdn.net/blog/spirtsong/38273187

素數是除了自身和1以外,沒有其它素數因子的自然數。自從歐幾里得證明了有無窮個素數以後,人們就企圖尋找一個可以構造所有素數的公式,尋找判定一個自然數是不是素數的方法。因為素數的地位非常重要。

鑒別一個自然數是素數還是合數,這個問題在中世紀就引起人們注意,當時人們試圖尋找質數公式,到了高斯時代,基本上確認了簡單的質數公式是不存在的,因此,高斯認為對素性判定是一個相當困難的問題。從此以後,這個問題吸引了大批數學家。 素性判斷演算法可分為兩大類,確定性演算法及隨機演算法。前者可給出確定的結果但通常較慢,後者則反之。

這里主要講米勒拉賓演算法,最後提供c++實現代碼。

要測試是否為素數,首先將分解為。在每次測試開始時,先隨機選一個 介於的整數,之後如果對所有的,若且,則 N 是合數。否則,有的概率為素數。

Miller- Rabin演算法隨機生成底數a,進行多次調用函數進行測試,Miller-Rabin檢測也存在偽素數的問題,但是與費馬檢測不同,MR檢測的正確概率不 依賴被檢測數p,而僅依賴於檢測次數。已經證明,如果一個數p為合數,那麼Miller-Rabin檢測的證據數量不少於比其小的正整數的3/4,換言 之,k次檢測後得到錯誤結果的概率為(1/4)^k。我們在實際應用中一般可以測試15~20次。

在一次檢驗中,該演算法出錯的可能頂多是四分之一。如果我們獨立地和隨機地選擇a進行重復檢驗,一旦此演算法報告n是合數,我們就可以確信n肯定不是素數。但如果此演算法重復檢驗 25 次報告都報告說n可能是素數,則我們可以說n「幾乎肯定是素數」。因為這樣一個 25 次的檢驗過程給出關於它的輸入的錯誤信息的概率小於 (1/4)25。這種機會小於 1015分之一。即使我們以這樣一個過程驗證了十億個不同的素數,預料出錯的概率仍將小於百萬分之一。因此如果真出了錯,與其說此演算法重復地猜測錯,倒不如說由於 硬體的失靈或宇宙射線的原因,我們的計算機在它的計算中丟了一位。這樣的概率性演算法使我們對傳統的可靠性標准提出一個問號:我們是否真正需要有素性的嚴格 證明。(以上文字引用自 Donald E.Knuth 所著的《計算機程序設計藝術 第2卷 半數值演算法(第3版)》第 359 頁「4.5.4 分解素因子」中的「演算法P(概率素性檢驗)」後面的說明)

熱點內容
微信指紋支付多少錢要用密碼 發布:2024-10-26 20:56:04 瀏覽:807
flash游戲反編譯 發布:2024-10-26 20:43:59 瀏覽:710
java的hashmap緩存 發布:2024-10-26 20:33:07 瀏覽:116
紅米2存儲空間不足 發布:2024-10-26 20:33:05 瀏覽:297
java源碼pdf 發布:2024-10-26 20:22:45 瀏覽:804
中文安卓編程 發布:2024-10-26 20:18:27 瀏覽:821
sql傳遞參數 發布:2024-10-26 20:06:57 瀏覽:248
安卓手機去哪裡找游戲 發布:2024-10-26 20:03:24 瀏覽:913
安卓手機圖標誤刪如何恢復 發布:2024-10-26 19:38:34 瀏覽:917
彈跳的編程 發布:2024-10-26 19:37:28 瀏覽:455