关于费马素性测试的准确率

以下是实验用代码

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值