python - 用于 Lucas-Lehmer 素数测试的更快的按位模数

标签 python optimization bit-manipulation primes modulo

Lucas-Lehmer primality test测试质数以确定它们是否也是 Mersenne primes .瓶颈之一是计算 (s**2 − 2) % (2**p - 1) 时的模运算。

使用按位运算可以大大加快速度(参见 L-L 链接),目前为止我最好的是:

def mod(n,p):
    """ Returns the value of (s**2 - 2) % (2**p -1)"""
    Mp = (1<<p) - 1
    while n.bit_length() > p: # For Python < 2.7 use len(bin(n)) - 2 > p
        n = (n & Mp) + (n >> p)
    if n == Mp:
        return 0
    else:
        return n

一个简单的测试用例是 p 有 5-9 个数字,s 有 10,000 多个数字(或更多;它们是什么并不重要)。解决方案可以通过 mod((s**2 - 2), p) == (s**2 - 2) % (2**p -1) 进行测试。请记住,在 L-L 测试中需要此模运算的 p - 2 次迭代,每次迭代都以指数方式增加 s,因此需要优化。

有没有办法使用纯 Python(包括 Python 3)进一步加快速度?有没有更好的办法?

最佳答案

我能找到的最好的改进是删除 Mp = (1<<p) - 1完全来自模函数,并在开始 L-L 测试的迭代之前在 L-L 函数中预先计算它。使用 while n > Mp:而不是 while n.bit_length() > p:也节省了一些时间。

关于python - 用于 Lucas-Lehmer 素数测试的更快的按位模数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5393420/

相关文章:

python - 解析 nmap 结果

caching - Intel Xeon CPU 如何写入内存?

c++ - 在 C++ 中加速算法

Python - 函数乘法的积分

python - Python 中的列表排序(转置)

python smc-api 将主机附加到组

android - Android 中的 Activity 太多?

c++ - 如何制作具有自定义移位值的模板

java - Java 中的位操作 - 2 的补码和翻转位

c++ - 右移位的奇怪行为