目前正在创建一个RSA脚本,在找到大数n的总数(等于2161435923146879872768)并运行gcd算法后,我总是回到5.0而不是预期的1.0,所以我可以运行其余的我的节目。
def gcd(a, b):
# Return GCD using Euclid's Algo.
while a != 0:
a, b = b % a, a
return b
def modinv(a, m):
# Returns modular inverse of a % m
if gcd(a, m) != 1:
return None
u1, u2, u3 = 1, 0, a
v1, v2, v3 = 0, 1, m
while v3 != 0:
q = u3 // v3
v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
return u1 % m
# p = 43603303097 and q = 49570463009
# e = 45445
totient_n = (p - 1) * (q - 1)
d = modinv(e, totient_n)
每次乘以p-1和q-1时,该值计算错误或舍入不正确(2161435923146879795200L或2.1614359231468798e + 21)。如何避免这种情况并获得1的正确gcd?