Fermat素性檢測算法與python編程實現

最近在帶家教教學生信息安全數學基礎,給他佈置了Fermat素性檢測算法編程實現的大作業。怕他不會,在這裏寫下教程,希望他能看到。(原理與算法部分摘自信息安全數學基礎老師的課件)

原理

在這裏插入圖片描述
在這裏插入圖片描述

算法

在這裏插入圖片描述

python實現

from random import random

#利用輾轉相除法求最大公因數
def BFactor(a,b):
    #若b>a,則交換兩個數的值
    if(b>a):
        t=a
        a=b
        b=t
    r = b #初始化r
    while(r!=0):
        r = a%b #r爲a/b的餘數
        a = b
        b = r
    return a #得到最後的a爲(a,b)
            

n = int(input("請輸入需要檢測的整數n:"))
K = int(input("請輸入循環次數k:"))
k = 0
while(k<K):
    flag = False
    while(not flag):
        b = int(random()*(n-2)) #生成一個[2,n-2]之間的隨機整數
        if(b>=2 and b<=n-2):
            flag = 5
    factor = BFactor(b,n)#計算(b,n)
    r = (b**(n-1))%n #計算b^(n-1)modn
    print("k="+str(k+1)+"時,取b="+str(b),end=",")
    print("g=("+str(b)+","+str(n)+")="+str(factor),end=',')
    print("r="+str(b)+"^"+str(n-1)+"(mod "+str(n)+")="+str(r),end=',')
    if(factor >1): 
        print("故n="+str(n)+"爲合數")
        break
    elif(r!=1):
        print("故n="+str(n)+"爲合數")
        break
    else:        
        print("故n="+str(n)+"可能爲素數")
        k+=1
if(k==K):
    print("所以, n="+str(n)+"可能爲素數,n爲素數的概率爲"+str((1-1/(2**k))*100)+"%")```
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章