以下是实验用代码
import random
def isprime(n,r=10):
k,p=0,n-1
while (p&1)==0:
p=p>>1
k+=1
for j in range(r):
a=random.randint(1,n-1)
b=pow(a,p,n)
flag=0
if b==1:
continue
for i in range(k):
if (b+1)%n==0:
flag=1
break
else:
b=(b*b)%n
if flag==1:
continue
else:
return False
return True
isprime函数是素性判定函数,以下是概率测试代码,测试该函数的准确率.
def test(r):
global isprime
n=0
i=2
while i<100000:
if isprime(i,r=r):
n=n+1
i=i+1
return n
i=1
print("准备...")
s=test(100)
while i<11:
print("测试"+str(i)+",误差"+str((test(i)-s)/s))
i=i+1
以及测试结果:
准备...
测试1,误差0.005942452043369475
测试2,误差0.0002085070892410342
测试3,误差0.0
测试4,误差0.0001042535446205171
测试5,误差0.0
测试6,误差0.0
测试7,误差0.0
测试8,误差0.0
测试9,误差0.0
测试10,误差0.0
由此可见,在100000以内迭代次数5与100的准确度相当.当然,如果用于rsa算法,为了符合标准任然建议用100.
性能:以上测试在Android上总用时约2秒.