我正在尝试实现RSA算法。我一直在阅读有关扩展欧几里德算法的文章,并试图在不同的网站上实现该代码。对于某些解密,它没有给我正确的结果,因此我一直在调试,并且注意到算法的不同实现产生不同的结果。第一个来自Brilliant.org,第二个来自https://www.rookieslab.com/posts/extended-euclid-algorithm-to-find-gcd-bezouts-coefficients-python-cpp-code。
def egcd(a, b):
x,y, u,v = 0,1, 1,0
while a != 0:
q, r = b//a, b%a
m, n = x-u*q, y-v*q
b,a, x,y, u,v = a,r, u,v, m,n
gcd = b
return gcd, x, y
def extended_euclid_gcd(a, b):
"""
Returns a list `result` of size 3 where:
Referring to the equation ax + by = gcd(a, b)
result[0] is gcd(a, b)
result[1] is x
result[2] is y
"""
s = 0; old_s = 1
t = 1; old_t = 0
r = b; old_r = a
while r != 0:
quotient = old_r/r
old_r, r = r, old_r - quotient*r
old_s, s = s, old_s - quotient*s
old_t, t = t, old_t - quotient*t
return old_r, old_s, old_t
对于a = 3,b = 25456(来自https://www.di-mgt.com.au/rsa_alg.html上稍微简单一些的示例),对于这两种实现,我分别得到以下结果:
gcd: 1 x: -8485 y: 1
gcd: 25456 x: 0 y: 1
为什么这些不同?为什么第二种实现方式的gcd根本不是1?后续问题是因为我试图按照链接上的示例进行操作,因此对x的取值为负。他们的答案是16971。我在这里https://math.stackexchange.com/questions/1001199/uniqueness-of-extended-euclidean-algorithm中看到,扩展的欧几里得算法找到了最接近原点的答案。有什么方法可以指定最接近原点的正数?
答案 0 :(得分:0)
在此处链接到“新秀实验室”的帖子的作者。
James K Polk是正确的,该代码确实是用Python 2编写的,并且与Python 3不兼容。
我们必须将quotient = old_r/r
更新为quotient = old_r//r
,以使其与Python 3兼容。
我将更新原始帖子以反映此发现。谢谢罗然。