一、分解N的方法
1.在线查询网站
factordb.comhttps://factordb.com/index.php
2.使用yafu工具分解
https://sourceforge.net/projects/yafu/
yafu使用方法:
#分解数字:
.\yafu-x64.exe factor(1213465437867)
#导入文件进行分解(注意文本结尾要换行,要不然不能用)
.\yafu-x64.exe "factor(@)" -batchfile Key.txt
(分解之后会自动把Key.txt删掉,Key.txt就是你的文件名)
3.p和q都为素数并且是上一个数和下一个数之间的关系的话可以使用费马分解
'''生成两个挨得近的素数p,q'''
p = getPrime(512)
q = gmpy2.next_prime(p)
n=p*q
print(p)
print(q)
print(n)
'''开始破解'''
temp=gmpy2.iroot(n,2)[0] #乘积开根号得到的结果一定在P和q之间
p=gmpy2.next_prime(temp)
q=n//p
print(p)
print(q)
接下来说说gmpy2.iroot()这个函数
它专门用于大数开根号,gmpy2.iroot(n,t),n是你要开的大数,t是你要开几次幂
要注意结果的形式:前面是开根号的结果,后面的true或false表示是否是整开的。
4.平方差遍历法
n=p*q
令p=a-b,q=a+b,那么n=a^2-b^2,即b^2=a^2-n.
再令a是n的"中间值"(),然后让a以步长为1自增遍历,直到pow(a,2)-n的结果可以正好开方为止。那个结果开方就是b。
原则上是可以爆出符合条件的所有解,即便解不是质数也可以得到结果.
'''生成两个挨得近的素数p,q'''
p = getPrime(512)
q = gmpy2.next_prime(p)
n=p*q
print(p)
print(q)
print(n)
print('开始破解')
'''开始破解'''
a=gmpy2.iroot(n,2)[0]
while 1: #破解出来一组就行了,一般也就一组,挨得很近的话很快就出来了,如果长时间还没出来就可以换方法了,不要指望着他遍历所有的,到死也弄不完。
B2=pow(a,2)-n
a+=1
if gmpy2.is_square(B2):
b=gmpy2.iroot(B2,2)[0]
p=a+b
q=a-b
print(p)
print(q)
break