在Python中正确分割然后正确修改的问题

时间:2013-04-24 02:09:10

标签: python rsa sieve primality-test

我正在尝试为我正在编写的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工作。

提前致谢。

2 个答案:

答案 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}}因子,则nn % i == 0n0一致。

答案 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