Es posible que también desee ver el módulo gmpy . Es una interfaz entre Python y la biblioteca de precisión múltiple GMP. gmpy proporciona una función de inversión que hace exactamente lo que necesita:
>>> import gmpy
>>> gmpy.invert(1234567, 1000000007)
mpz(989145189)
Respuesta actualizada
Como señaló @hyh, gmpy.invert()
devuelve 0 si no existe el inverso. Eso coincide con el comportamiento de la mpz_invert()
función de GMP . gmpy.divm(a, b, m)
proporciona una solución general a 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()
devolverá una solución cuando gcd(b,m) == 1
y genere una excepción cuando el inverso multiplicativo no exista.
Descargo de responsabilidad: soy el mantenedor actual de la biblioteca gmpy.
Respuesta actualizada 2
gmpy2 ahora genera correctamente una excepción cuando la inversa no existe:
>>> import gmpy2
>>> gmpy2.invert(0,5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: invert() no inverse exists
pow
función de esto:y = pow(x, -1, p)
. Consulte bugs.python.org/issue36027 . ¡Solo pasaron 8.5 años desde que se hizo la pregunta hasta que apareció una solución en la biblioteca estándar!