Miller Rabin演算法 Python實現

2021-10-06 03:07:44 字數 3729 閱讀 4554

用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...