加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Lucas-Lehmer素性测试的快速按位模数

发布时间:2020-12-20 13:22:33 所属栏目:Python 来源:网络整理
导读:Lucas-Lehmer primality test测试素数以确定它们是否也是 Mersenne primes.其中一个瓶颈是计算(s ** 2 – 2)%(2 ** p – 1)时的模数运算. 使用按位运算可以大大加快速度(参见L-L链接),这是迄今为止最好的: def mod(n,p): """ Returns the value of (s**2 -
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次迭代此模数运算,每次迭代都呈指数增长,因此需要进行优化.

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

解决方法

我能找到的最好的改进是从模数函数中完全去除Mp =(1

Mp:而不是n.bit_length()> p:还节省了一些时间.

)-1,并在开始l-l测试的迭代之前在l-l函数中预先计算它.使用while>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读