Sie sollten sich auch die gmpy Modul. Es ist eine Schnittstelle zwischen Python und der GMP-Bibliothek für Mehrfachpräzision. gmpy bietet eine Invertierungsfunktion, die genau das tut, was Sie brauchen:
>>> import gmpy
>>> gmpy.invert(1234567, 1000000007)
mpz(989145189)
Aktualisierte Antwort
Wie von @hyh angemerkt, ist die gmpy.invert()
gibt 0 zurück, wenn die Umkehrung nicht existiert. Das entspricht dem Verhalten von GMP's mpz_invert()
Funktion. gmpy.divm(a, b, m)
bietet eine allgemeine Lösung für 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()
wird eine Lösung zurückgeben, wenn gcd(b,m) == 1
und löst eine Ausnahme aus, wenn die multiplikative Umkehrung nicht existiert.
Haftungsausschluss: Ich bin der aktuelle Betreuer der gmpy-Bibliothek.
Aktualisierte Antwort 2
gmpy2 löst nun korrekt eine Ausnahme aus, wenn die Inverse nicht existiert:
>>> import gmpy2
>>> gmpy2.invert(0,5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: invert() no inverse exists