Нахождение положительных целых чисел s,t таких, что sa tb = 1 в евклидовом алгоритме с Python

#python #algorithm

Вопрос:

моя цель состоит в том,чтобы работать в обратном направлении в алгоритме Евклида, чтобы найти такие положительные целые числа s, t, и именно с этой частью я борюсь. Я уже смог настроить алгоритм Евклида, но работать в обратном направлении мне очень сложно.

Идея заключается в следующем: мы вычисляем наибольший общий коэффициент из любых двух целых чисел, затем мы работаем в обратном направлении, здесь я продемонстрирую пример.

гхф(101, 7)

Разделите 7 на 101:

 101 - 7 * 14 = 3
 

Разделите 3 на 7:

 7 - 3 * 2 = 1
 

Разделите 1 на 3

 3 - 1 * 3 = 0
 

Теперь мы работаем в обратном направлении…

 1 = 7 - 3 * 2

1 = 7 - (101 - 7 * 14)*2

1 = 7 - 101 * 2   7 * 14 * 2

1 = 7 * 29 - 101 * 2
 

Так что, в частности, эти положительные целые числа s,t равны 29, 2.

Вот мой код до сих пор, проблема с кодом заключается в том, что для обратной реализации я прямо борюсь с тем, как заставить его дать мне такой результат.

Приведенный ниже код должен давать целое число s, такое, что s = 31, что равно (2 * 109 — 7 * 31). Однако это не так, поскольку оно неполное. Буду признателен за любой совет.

И да, нам нужны эти ценности s, t, вот и вся причина, по которой мы это делаем.

     def div(a, b):
        q, r = divmod(a, b)
        return q, r
    
    
    list_a = []
    list_b = []
    
    c, d = 109, 7
    q, r = div(c, d)
    list_a.append((c, q, r))
    list_a.append((c, q, r))  # Needed copy..
    
    print(f"{c} - {d}*{q} = {r}")
    
    c, d = 7, 4
    q, r = div(c, d)
    list_a.append((c, q, r))
    print(f"{c} - {d}*{q} = {r}")
    
    c, d = 4, 3
    q, r = div(c, d)
    list_a.append((c, q, r))
    print(f"{c} - {d}*{q} = {r}")
    
    c, d = 3, 1
    q, r = div(c, d)
    list_a.append((c, q, r))
    print(f"{c} - {d}*{q} = {r}")
    
    del list_a[-1]
    print(list_a)
    
    x, y, z = (
        list_a[-1][0],
        list_a[-2][2],
        list_a[-1][1],
    )
    
    for k in range(1, len(list_a)):
        x, y, z = (
            list_a[-k][0],
            list_a[-k - 1][2],
            list_a[-k][1],
        )
        if x == list_a[-k][2]:
            print("hmm")
            pass
            # Assign x as list_a[-k][0] - list_a[-k][1]
        if y == list_a[-k][2]:
            print("ymm")
            pass
            # Assign y as list_a[-k][0] - list_a[-k][1]
        print("%d - %d * %d" % (x, y, z))
 

Комментарии:

1. en.wikipedia.org/wiki/Extended_Euclidean_algorithm обсуждает это и предоставляет псевдокод.