我正在尝试为我正在编写的RSA实现进行素性测试。我主要使用Rabin-Miller,但是我确实有一个Eratosthenes筛子,制定了一千个以下所有素数的列表,用于快速测试,以确定候选人是否有其中一个作为主要因素。
相关功能是:
def comp_test(to_test, primeList):
for i in primeList:
if (to_test / float(i)) % 1 == 0:
return False
return True
其中primeList是Sieve生成的素数列表。这完全可以达到2 ^ 55左右的to_test值,但超过这一点
(to_test / float(i)) % 1
语句总是评估为0.0,即使我把它交给了拉宾 - 米勒确定为素数的to_test。我不确定这可能是什么。我不清楚Python如何处理非常大的数字,但据我所知,2 ^ 55似乎不会是任何类型的溢出边界。使用Sieve功能的速度要快得多,并且为我需要的2048位实现生成密钥需要一段时间,所以即使这是一个练习,我也希望看看我是否能让Sieve工作。
提前致谢。
答案 0 :(得分:2)
Python只处理浮点数(大约16个小数位)的53位精度,因此使用大的浮点数将无法正常工作。
使用模运算符:
>>> (2**80 / float(3)) % 1 # Doesn't work
0.0
>>> 2**80 % 3 # Works
1L
>>> 2**80 % 2 # Works
0L
它也比分裂快得多:
>>> %timeit (2**40 / float(2)) == 0
1000000 loops, best of 3: 224 ns per loop
>>> %timeit 2**40 % 2 == 0
10000000 loops, best of 3: 53.5 ns per loop
如果i
是[{1}}因子,则n
(n % i == 0
与n
模0
一致。
答案 1 :(得分:0)
我建议您使用GMP来满足您的大量需求。
以下是我过去在Python中完成的一些与素数相关的项目:
http://stromberg.dnsalias.org/svn/primes-below
http://stromberg.dnsalias.org/svn/big-prime
http://stromberg.dnsalias.org/svn/huge-prime
http://stromberg.dnsalias.org/svn/sieve