Я пытаюсь реализовать алгоритм 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, что расширенный евклидов алгоритм использует ответ, ближайший к источнику. Есть ли способ указать ближайший к источнику и положительный?