Vous pouvez également consulter le module gmpy . C'est une interface entre Python et la bibliothèque multi-précision 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 mise à jour
Comme indiqué par @hyh, le gmpy.invert()
renvoie 0 si l'inverse n'existe pas. Cela correspond au comportement de la mpz_invert()
fonction de GMP . gmpy.divm(a, b, m)
fournit une solution générale à 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()
retournera une solution quand gcd(b,m) == 1
et lèvera une exception lorsque l'inverse multiplicatif n'existe pas.
Clause de non-responsabilité: je suis le mainteneur actuel de la bibliothèque gmpy.
Réponse mise à jour 2
gmpy2 lève désormais 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
pow
fonction pour cela:y = pow(x, -1, p)
. Voir bugs.python.org/issue36027 . Il n'a fallu que 8,5 ans entre la question posée et l'apparition d'une solution dans la bibliothèque standard!