Vielleicht möchten Sie sich auch das gmpy- Modul ansehen . Es ist eine Schnittstelle zwischen Python und der GMP-Bibliothek mit mehrfacher Genauigkeit. gmpy bietet eine Invertierungsfunktion, die genau das tut, was Sie brauchen:
>>> import gmpy
>>> gmpy.invert(1234567, 1000000007)
mpz(989145189)
Antwort aktualisiert
Wie von @hyh angegeben, gmpy.invert()
gibt die 0 zurück, wenn die Umkehrung nicht existiert. Das entspricht dem Verhalten der GMP- 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()
gibt eine Lösung zurück, wenn gcd(b,m) == 1
und löst eine Ausnahme aus, wenn die multiplikative Inverse nicht existiert.
Haftungsausschluss: Ich bin der aktuelle Betreuer der gmpy-Bibliothek.
Aktualisierte Antwort 2
gmpy2 löst jetzt ordnungsgemäß eine Ausnahme aus, wenn die Umkehrung nicht vorhanden ist:
>>> import gmpy2
>>> gmpy2.invert(0,5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: invert() no inverse exists
pow
Funktion für Folgendes verwenden :y = pow(x, -1, p)
. Siehe bugs.python.org/issue36027 . Es dauerte nur 8,5 Jahre von der Frage bis zu einer Lösung in der Standardbibliothek!