Bạn cũng có thể muốn nhìn vào mô-đun gmpy . Nó là một giao diện giữa Python và thư viện đa độ chính xác GMP. gmpy cung cấp một hàm đảo ngược thực hiện chính xác những gì bạn cần:
>>> import gmpy
>>> gmpy.invert(1234567, 1000000007)
mpz(989145189)
Cập nhật câu trả lời
Như đã lưu ý bởi @hyh, giá trị gmpy.invert()
trả về 0 nếu nghịch đảo không tồn tại. Điều đó phù hợp với hành vi của mpz_invert()
chức năng của GMP . gmpy.divm(a, b, m)
cung cấp một giải pháp chung cho 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()
sẽ trả về một nghiệm khi gcd(b,m) == 1
và đưa ra một ngoại lệ khi nghịch đảo nhân không tồn tại.
Tuyên bố từ chối trách nhiệm: Tôi là người bảo trì hiện tại của thư viện gmpy.
Cập nhật câu trả lời 2
gmpy2 bây giờ nâng đúng một ngoại lệ khi nghịch đảo không tồn tại:
>>> import gmpy2
>>> gmpy2.invert(0,5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: invert() no inverse exists
pow
chức năng cho việc này:y = pow(x, -1, p)
. Xem bug.python.org/issue36027 . Chỉ mất 8,5 năm kể từ khi câu hỏi được hỏi đến một giải pháp xuất hiện trong thư viện chuẩn!