"""
主要用于素数检测
f_n_1()函数用来分解n − 1为 2^r*d,奇数为d
Multimod()函数用来快速幂分解
Miller_Rabin(n,k)函数调用前两个函数实现Miller_Rabin算法具体步骤
n代表判别,k代表出错概率
返回True即是素数(结果为素数的出错概率为(1/4)**k)
"""from random import randint
deff_n_1(n):
r=0if n%2==0:
n=n/2
r+=1return[r,n]defmultimod(a,k,n):#快速幂取模
ans=1while(k!=0):if k%2==1:#奇数
ans=(ans%n)*(a%n)%n
a=(a%n)*(a%n)%n
k=k//2#整除2return ans
defMiller_Rabin(n, iter_num):# 2 is primeif n ==2:returnTrue# if n is even or less than 2, then n is not a primeif n&1==0or n<2:returnFalse# n-1 = (2^s)m
m,s = n -1,0while m&1==0:
m = m>>1
s +=1# M-R testfor _ inrange(iter_num):
b = multimod(randint(2,n-1), m, n)if b==1or b== n-1:continuefor __ inrange(s-1):
b = multimod(b,2, n)if b == n-1:breakelse:returnFalsereturnTrue
素数生成示例
# 生产大素数defg_p():
p = randint(2**64,2**65)while Miller_Rabin(p,8)!=True:if(p%2)==1:
p+=2else:
p=p+1# p,'出错概率为',1/(4**4))return p
Multimod()函数原理"""f_n_1()函数用来分解n − 1为 2^r*d,奇数为dMultimod()函数用来快速幂分解Miller_Rabin(n,k)函数调用前两个函数实现Miller_Rabin算法具体步骤n代表判别,k代表出错概率返回True即是素数(结果为素数的出错概率为(1/4)**k)"""from random import randintdef f_n_1(n): r=0 if n%2==0: n=n/2 r