Вы также можете посмотреть на модуль gmpy . Это интерфейс между Python и библиотекой множественной точности GMP. gmpy предоставляет функцию инвертирования, которая делает именно то, что вам нужно:
>>> import gmpy
>>> gmpy.invert(1234567, 1000000007)
mpz(989145189)
Обновленный ответ
Как отмечает @hyh, gmpy.invert()
возвращает 0, если обратное не существует. Это соответствует поведению функции mpz_invert()
GMP. gmpy.divm(a, b, m)
предоставляет общее решение для a=bx (mod m)
.
>>> gmpy.divm(1, 1234567, 1000000007)
mpz(989145189)
>>> gmpy.divm(1, 0, 5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: not invertible
>>> gmpy.divm(1, 4, 8)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: not invertible
>>> gmpy.divm(1, 4, 9)
mpz(7)
divm()
вернет решение при gcd(b,m) == 1
и вызовет исключение, когда мультипликативного обратного не существует.
Отказ от ответственности: я в настоящее время поддерживаю библиотеку gmpy.
Обновленный ответ 2
gmpy2 теперь корректно вызывает исключение, когда обратное не существует:
>>> import gmpy2
>>> gmpy2.invert(0,5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: invert() no inverse exists