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

该博客介绍了如何使用Python生成1024位和512位的大素数对,这些素数满足特定条件。作者首先通过生成伪素数并使用Miller-Rabin检测算法判断是否为素数,然后通过循环在附近的奇数中寻找真正的素数。最后,通过特定的方法生成满足条件的素数对。
摘要由CSDN通过智能技术生成

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) ,则

a

p

a^p

ap ≡ a(mod p) 或

a

p

1

a^{p-1}

ap−1 ≡ 1(mod p)

a

p

a^p

ap ≡ a(mod p) 为 同余符号,表示

a

p

a^p

ap mod p = a,也可以理解为

a

p

a^p

ap- a可以被 p整除 ,还可以理解为

a

p

a^p

ap与 a 除以p的余数相等, 除以同余式 a ≡ a (mod p)后得常用结论:

a

p

1

a^{p -1}

ap−1 ≡ 1(mod p)

根据定理,我们可以随机选取一个数a,然后计算

a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值