用python實現了miller-rabin的素性檢驗演算法
import random
deflargeprime_generate
(bit=
1024):
print
("generating large prime......"
) i=
1while
(true):
num=random.randrange(2**
(bit-1)
,2**(bit)
)print
("第{}次隨機生成大整數:{}."
.format
(i,num))if
(isprime(num)):
print
("大整數:{}通過miller—rabin素性檢驗說明很有可能為素數."
.format
(num)
)return num
else
: i+=
1def
isprime
(testnum=
1000000000063):
smallprime=[2
,3,5
,7,11
,13,17
,19,23
,29,31
,37,41
,43,47
,53,59
,61,67
,71,73
,79,83
,89,97
,101
,103
,107
,109
,113
,127
,131
,137
,139
,233
,239
,241
,251
,257
,263
,269
,271
,277
,281
,283
,293
,307
,311
,313
,317
,331
,337
,347
,349
,353
,359
,367
,373
,379
,383
,389
,397
,401
,409
,419
,421
,431
,433
,439
,443
,449
,457
,461
,463
,467
,479
,487
,491
,499
,503
,509
,521
,523
,541
,547
,557
,563
,569
,571
,577
,587
,593
,599
,601
,607
,613
,617
,619
,631
,641
,643
,647
,653
,659
,661
,673
,677
,683
,691
,701
,709
,719
,727
,733
,739
,743
,751
,757
,761
,769
,773
,787
,797
,809
,811
,821
,823
,827
,829
,839
,853
,857
,859
,863
,877
,881
,883
,887
,907
,911
,919
,929
,937
,941
,947
,953
,967
,971
,977
,983
,991
,997]if
(testnum<2)
:return
false
if testnum in smallprime:
return
true
for prime in smallprime:
if(testnum%prime==0)
:return
false
return
(miller_rabin(testnum)
)def
miller_rabin
(testnum=
1000000000061):
safetime=
10#素性檢測次數
eulern=testnum-
1 oddq=
0 testnum2=
0#計算n-1=2^s*t
while
(eulern%2==
0): testnum2=testnum2+
1 eulern=eulern//
2#計算n-1=2^s*t
oddq=eulern#得到t
for trials in
range
(safetime)
: random_a=random.randrange(
2,testnum-1)
firsttest=
pow(random_a,oddq,testnum)
if(firsttest==
1or firsttest==testnum-1)
:continue
else
: nexttest=firsttest
for i in
range(1
,testnum2)
: nexttest=
(nexttest**2)
%testnum
if(nexttest==testnum-1)
:break
return
false
return
true
defgeneratelargeprime_basedonmr()
:while
(true):
try:
bit=
eval
(input
("請輸入需要產生的大整數字元位數:"))
largeprime_generate(bit)
break
except
:print
("!!!請輸入整數."
)if __name__==
"__main__"
: generatelargeprime_basedonmr(
)
Miller Rabin演算法詳解
目錄 基本引理 1,費馬定理 2,二次探測定理 作用 證明 實現 目錄 基本引理 1,費馬定理 2,二次探測定理 費馬定理的證明鏈結 二次探測定理的證明鏈結 有效的檢測大整數是否為素數。由費馬定理,可以排除大部分非素數的情況 滿足費馬定理是素數的必要條件 給出乙個奇素數n,顯然n 1為乙個偶數,存在...
數論 Miller Rabin演算法
在我們需要判斷乙個數是否是素數的時候,最容易想到的就是那個熟悉的o n 的演算法。那個演算法非常的簡單易懂,但如果我們仔細想想,當n這個數字很大的時候,這個演算法其實是不夠用的,時間複雜度會相對比較高。怎麼解決呢?我們先來了解一下 費馬小定理 假設我們有乙個素數p,且另乙個數a和p互素,就可以得到a...
Miller Rabin演算法詳解
原文 判斷乙個數是否是素數 如果p是素數,且整數a不是p的倍數有 a equiv 1 pmod p 費馬定理只是n是素數的必要條件。即費馬定理不成立,n一定是合數 費馬定理成立,n可能是素數。性質 1 p 1 個整數 a,2a,3a,p 1 a 中沒有乙個是 p 的倍數 性質 2 a,2a,3a,p...