Обратное число к а по модулю m

Обратное число Даны два целых числа m и a. Если не существует обратного числа к a по модулю m, то выведите число −1, а если существует, то выведите это число (ответ должен лежать в границах от 0 до m−1).

Входные данные В единственной строке входных данных даны два целых числа 1

Выходные данные Выведите ответ на задачу.

Примеры Ввод 179 57 Вывод 22

b = 0 
a = list(map(int, input().split())) 
b = pow(a[1], a[0] - 2, a[0]) 
if pow(a[1], a[0] - 2, a[0]) == 0: 
    print(-1) 
else: 
    print(b)

Ответы (2 шт):

Автор решения: MBo

Решение с использованием расширенного алгоритма Евклида. Способ через степень требует вычисления функции Эйлера. e-maxx

def gcdExtended(a, b):
    if a == 0 :
        return b,0,1
    gcd,x1,y1 = gcdExtended(b%a, a)
    x = y1 - (b//a) * x1
    y = x1
    return gcd,x,y

m, a = map(int, input().split())
gcd, x, y = gcdExtended(a, m)
if gcd == 1:
    print((x % m + m) % m)
else:
    print(-1)
→ Ссылка
Автор решения: Eduard

Код из ответа можно улучшить, потому что:

(x % m + m) % m = x % m

обозначим y = x % m, тогда y = y + m (mod m),

Заметим, что 0 <= y < m, а неотрицательные числа меньшие m всегда дают в остатке сами себя,
то есть y % m = y, из этого мы и получаем равенство выше.

→ Ссылка