Ви також можете подивитися модуль gmpy . Це інтерфейс між Python та багатоточною бібліотекою GMP. gmpy забезпечує функцію інвертування, яка виконує саме те, що вам потрібно:
>>> import gmpy
>>> gmpy.invert(1234567, 1000000007)
mpz(989145189)
Оновлена відповідь
Як зазначає @hyh, gmpy.invert()повертає 0, якщо обернено не існує. Це відповідає поведінці функції GMP mpz_invert(). 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
powфункції для цього:y = pow(x, -1, p). Див. Bugs.python.org/issue36027 . Минуло лише 8,5 років від запитання до рішення, яке з'явилося в стандартній бібліотеці!