python生成一组1024与512位数的大素数对

该博客介绍了如何使用Python生成1024位和512位的大素数对,主要涉及生成大素数的方法,包括基于Fermat定理和二次探测定理的Miller-Rabin检测。通过循环判断和随机调整,最终成功找到满足条件的素数对。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python生成一组二进制1024位和512位数的大质数对


前些天同学求助: 用python生成一组二进制1024位与512位数的大素数对,要求1024位的质数减一后可以整除512位数,经过两天鏖战后成功,在这里总结一下思路与代码。简单来讲,生成质数对首先要生成质数,之后再成对就ok了,下面分成两部分说明。


一. 生成大素数

解决这个问题首先需要生成大素数,一个二进制的1024位数大概相当于300位十进制位数,运用穷举法最多可能跑到1亿(9位十进制数)这种单位,300位的大数用我的电脑是不可能跑出来的,所以只能更换算法。

经过查阅,随着数的增大,质数的数量其实是在大幅增多的,而随机生成一个1024位二进制奇数很容易,只要能判断出来这个数是否是质数就可以了,如果不成立的话,在附近不断+2应该很快就能找到了一个质数。根据这个想法,生成大素数的算法分3部:

1.生成伪素数 (把未通过验证的奇数称为伪素数)
2.判断伪素数是否为素数
3.如果不成立,循环判断查找

1.生成伪素数

算法很简单,直接贴代码。

# 其实这个二级制奇数产生代码感觉很冗长,可以优化的很多,欢迎大神指教改进
def proBin(w):  # w表示希望产生位数
    list = []
    list.append(1)  #最高位定为1
    for i in range(w - 2):
        c = randint(0, 1)
        list.append(c)
    list.append(1)
    ls2 = [str(j) for j in list]
    ls3 = ''.join(ls2)
    b = int(ls3[0])
    for i2 in range(len(ls3) - 1):
        b = b << 1
        b = b + int(ls3[i2 + 1])
    d = long(b)
    return d

2.判断伪素数是否为素数

这一部分自己的代码编了好几种都跑不理想,想了很久没什么办法,求助度娘,了解素数测试算法后,最终选择了主流的Miller-Rabin检测。这里贴一段百度知道的简介:

Miller-Rabin检测基于概率测试算法,在构建密码安全体系中占有重要的地位

后面会对Miller-Rabin检测原理做深入介绍,如果不关心数学过程,可以跳过这一部分,直接看代码。

Miller-Rabin检测是Fermat算法加入二次探测定理的一种实现,它的理论基础是由Fermat定理引申而来,这里先介绍Fermat定理。

(1)Fermat 定理

Fermat 定理:p是一个质数(非2),a是任何整数(1≤ a≤n-1) ,则apa^pap ≡ a(mod p) 或 ap−1a^{p-1}ap1 ≡ 1(mod p)

apa^pap ≡ a(mod p) 为 同余符号,表示 apa^pap mod p = a,也可以理解为apa^pap- a可以被 p整除 ,还可以理解为apa^pap与 a 除以p的余数相等, 除以同余式 a ≡ a (mod p)后得常用结论:

ap−1a^{p -1}ap1 ≡ 1(mod p)

根据定理,我们可以随机选取一个数a,然后计算 aN−1a^{N - 1}aN1 mod N,观察结果是否为1,如果是1,需要进一步检测,如果不是1,则N一定不是质数。

Fermat定理实现: (这一段参考 blog 蛇小狼)
因为N是300位以上的数字,aN−1a^{N - 1}aN1 mod N并不容易计算,这里介绍一个模运算规则
aba^bab mod p = (a mod p)b{(a\text{ mod } p)} ^ b(a mod p)b mod p
因为a很小,N很大,所以计算aNa^{N}aNmod p可以通过递归降幂实现,如果N为偶数:
aNa^{N}aN

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值