Anda mungkin juga ingin melihat modul gmpy . Ini adalah antarmuka antara Python dan pustaka multi-presisi GMP. gmpy menyediakan fungsi invert yang melakukan apa yang Anda butuhkan:
>>> import gmpy
>>> gmpy.invert(1234567, 1000000007)
mpz(989145189)
Jawaban yang diperbarui
Seperti dicatat oleh @hyh, gmpy.invert()
mengembalikan 0 jika invers tidak ada. Itu cocok dengan perilaku mpz_invert()
fungsi GMP . gmpy.divm(a, b, m)
memberikan solusi umum untuk 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()
akan mengembalikan solusi saat gcd(b,m) == 1
dan memunculkan pengecualian saat pembalikan perkalian tidak ada.
Penafian: Saya adalah pengelola pustaka gmpy saat ini.
Jawaban yang diperbarui 2
gmpy2 sekarang memunculkan pengecualian dengan benar saat inversi tidak ada:
>>> import gmpy2
>>> gmpy2.invert(0,5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: invert() no inverse exists
pow
fungsi untuk ini:y = pow(x, -1, p)
. Lihat bugs.python.org/issue36027 . Hanya butuh 8,5 tahun dari pertanyaan yang diajukan hingga solusi muncul di perpustakaan standar!