Vous pouvez également consulter le site gmpy module. Il s'agit d'une interface entre Python et la bibliothèque de précision multiple GMP. gmpy fournit une fonction d'inversion qui fait exactement ce dont vous avez besoin :
>>> import gmpy
>>> gmpy.invert(1234567, 1000000007)
mpz(989145189)
Réponse actualisée
Comme l'a noté @hyh , le gmpy.invert()
renvoie 0 si l'inverse n'existe pas. Cela correspond au comportement de la fonction mpz_invert()
fonction. gmpy.divm(a, b, m)
fournit une solution générale au problème de la 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()
renverra une solution lorsque gcd(b,m) == 1
et soulève une exception si l'inverse multiplicatif n'existe pas.
Avertissement : je suis le mainteneur actuel de la bibliothèque gmpy.
Mise à jour de la réponse 2
gmpy2 lève maintenant correctement une exception lorsque l'inverse n'existe pas :
>>> import gmpy2
>>> gmpy2.invert(0,5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: invert() no inverse exists