接上一章,其实还有另一种方法分解p和q,因为根据条件可设:
p=11x+t
q=23x-m
p
∗
q
=
253
x
2
+
(
23
t
−
11
m
)
x
−
t
m
p*q=253x^2+(23t-11m)x-tm
p∗q=253x2+(23t−11m)x−tm
可以得一元二次方程:
253
x
2
+
(
23
t
−
11
m
)
x
+
(
−
t
m
−
n
)
=
0
253x^2+(23t-11m)x+(-tm-n)=0
253x2+(23t−11m)x+(−tm−n)=0
其中t和m均为一个2000以内的较小值,所以我可以用穷举的方法,逐一产生方程并求解,求得的解x即为第一个素数,p,q都是基于x生成的。
import math
import gmpy2
print("----计算一元二次方程的根----")
n= 7099293997597057840121358666833837753498838275854020154482887743106000287292796543920866875062689995360025217485874831332257233130287943206444475190268445255670322843664471682348256156185175655765790452094332875022809494407318056044647005041845654843080303742522260061500210481600297956451426162674923926908156645992521694195572818623774054219194331159529364179241757932761459930262573830738911713799216140111007655256112125121081747854267340976432923900792983659847629430766080521995039114172477341269935779097804051557556063477903826454634581880779164839924381664510909546228996769947966559112620828323435423467787739
a = 253
def judge_resutl(x,t,m):
judgeA=(x[1]==0)
judgeB = gmpy2.is_prime(x[0]*11+t)
judgeC = gmpy2.is_prime(x[0]*23-m)
return judgeA and judgeB and judgeC
for t in range(1,2000):
for m in range(1,2000):
b=23*t-11*m
c= -m*t-n
d=b**2-4*a*c
#print(d)
e=gmpy2.iroot(d, 2)
if e[1]==True:
#print(t,m)
x1 = divmod(-b+e[0],2*a)
x2 = divmod(-b-e[0],2*a)
if judge_resutl(x1,t,m):
print("p等于:",x1[0]*11+t)
print("q等于:",x1[0]*23-m)
break
if judge_resutl(x2,t,m):
print("p等于:",x2[0]*11+t)
print("q等于:",x2[0]*23-m)
else:
#print('tttt')
continue
break