Python 找到素数的概率(使用miller-rabin检验)

Python 找到素数的概率(使用miller-rabin检验),python,cryptography,primes,Python,Cryptography,Primes,我已经实现了Miller-Rabin素性测试,每个函数在隔离状态下似乎都正常工作。然而,当我试图通过生成70位的随机数来寻找素数时,我的程序在找到一个通过Miller-Rabin测试(10步)的数之前平均生成了100000多个数。这很奇怪,对于小于70位的随机奇数,素数的概率应该很高(根据Hadamard de la Vallée Poussin定理,大于1/50)。我的代码可能有什么问题?随机数生成器是否可能以极低的概率抛出素数?我想不是。。。欢迎任何帮助 随机导入 def米勒拉宾子弹(n,t

我已经实现了Miller-Rabin素性测试,每个函数在隔离状态下似乎都正常工作。然而,当我试图通过生成70位的随机数来寻找素数时,我的程序在找到一个通过Miller-Rabin测试(10步)的数之前平均生成了100000多个数。这很奇怪,对于小于70位的随机奇数,素数的概率应该很高(根据Hadamard de la Vallée Poussin定理,大于1/50)。我的代码可能有什么问题?随机数生成器是否可能以极低的概率抛出素数?我想不是。。。欢迎任何帮助

随机导入
def米勒拉宾子弹(n,t):
''运行miller-rabin原始正确性测试t次n''
#首先找到值r和s,使2^s*r=n-1
r=(n-1)/2
s=1
当r%2==0时:
s+=1
r/=2
#运行测试t次
对于范围(t)内的i:
a=random.randint(2,n-1)
y=幂_余数(a,r,n)
如果y!=1和y!=n-1:
#检查是否没有(a^r)^(2^j)=-1(模n)的j
j=0
而j0时:
如果k%2!=0:
r=(r*a)%n
a=(a*a)%n
k/=2
返回r
def随机奇数(n):
''生成最大n位的随机奇数''
a=随机。getrandbits(n)
如果%2==0:
a-=1
归还
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
t=10#每个试验次数的米勒-拉宾试验次数
位=70#随机数的位数
a=随机奇数(位)
计数=0
虽然不是米勒·拉宾(a,t):
计数+=1
如果计数%10000==0:
打印(计数)
a=随机奇数(位)
印刷品(a)

这在Python2而不是Python3中起作用的原因是这两种方法处理整数除法的方式不同。在Python2中,
3/2=1
,而在Python3中,
3/2=1.5

看起来您应该在Python3中强制使用整数除法(而不是浮点除法)。如果将代码更改为强制整数除法(
/
),如下所示:


无论使用哪种python版本,您都应该看到正确的行为。

python将您的
power\u余数
函数本机实现为
pow(基、指数、模)
。我已经运行过你的程序好几次了,在找到一个素数之前从未超过50次。我生成了10000个随机70位整数,并将miller_-rabin_轮的结果与我自己的iPrime函数进行了比较,没有发现任何差异。我不明白你为什么要花100000次迭代才能找到一个素数。是的,我知道,只是想从头开始实现它(而
幂余数
并不是什么大问题)。我发现这个问题只存在于Python3中,正如您所说,它在Python2下以预期的概率运行。如果我找到了问题,我会把它贴出来。嘿,塞拉斯顿,如果下面的答案为你解决了问题,你能把它标记为已回答吗?
#  First find the values r and s such that 2^s * r = n - 1
r = (n - 1) // 2
s = 1
while r % 2 == 0:
    s += 1
    r //= 2