Potresti anche voler guardare il modulo gmpy . È un'interfaccia tra Python e la libreria GMP a precisione multipla. gmpy fornisce una funzione di inversione che fa esattamente ciò di cui hai bisogno:
>>> import gmpy
>>> gmpy.invert(1234567, 1000000007)
mpz(989145189)
Risposta aggiornata
Come notato da @hyh, gmpy.invert()
restituisce 0 se l'inverso non esiste. Ciò corrisponde al comportamento della mpz_invert()
funzione GMP . gmpy.divm(a, b, m)
fornisce una soluzione generale 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()
restituirà una soluzione quando gcd(b,m) == 1
e solleverà un'eccezione quando l'inverso moltiplicativo non esiste.
Disclaimer: sono l'attuale manutentore della libreria gmpy.
Risposta aggiornata 2
gmpy2 ora solleva correttamente un'eccezione quando l'inverso non esiste:
>>> import gmpy2
>>> gmpy2.invert(0,5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: invert() no inverse exists
pow
funzione per questo:y = pow(x, -1, p)
. Vedi bugs.python.org/issue36027 . Sono passati solo 8,5 anni dalla domanda posta a una soluzione che appariva nella libreria standard!