Ayrıca gmpy modülüne de bakmak isteyebilirsiniz . Python ve GMP çok hassas kitaplığı arasında bir arayüzdür. gmpy, tam olarak ihtiyacınız olanı yapan bir ters çevirme işlevi sağlar:
>>> import gmpy
>>> gmpy.invert(1234567, 1000000007)
mpz(989145189)
Güncellenen cevap
@Hyh tarafından belirtildiği gibi gmpy.invert(), tersi yoksa 0 döndürür. Bu, GMP'nin mpz_invert()işlevinin davranışıyla eşleşir . gmpy.divm(a, b, m)genel bir çözüm sağlar 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()gcd(b,m) == 1çarpımsal tersi olmadığında bir çözüm döndürür ve bir istisna oluşturur.
Sorumluluk reddi: Gmpy kitaplığının şu anda bakıcısıyım.
Güncellenmiş cevap 2
gmpy2 artık tersi olmadığında düzgün bir şekilde bir istisna oluşturur:
>>> import gmpy2
>>> gmpy2.invert(0,5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: invert() no inverse exists
powbunun için işlevi:y = pow(x, -1, p). Bugs.python.org/issue36027 adresine bakın . Sorunun sorulmasından standart kitaplıkta görünen bir çözüme kadar sadece 8,5 yıl sürdü!