gmpy 모듈 을 살펴볼 수도 있습니다 . Python과 GMP 다중 정밀도 라이브러리 간의 인터페이스입니다. gmpy는 필요한 작업을 정확히 수행하는 반전 함수를 제공합니다.
>>> import gmpy
>>> gmpy.invert(1234567, 1000000007)
mpz(989145189)
업데이트 된 답변
@hyh에서 언급했듯이 gmpy.invert()
는 역이 존재하지 않으면 0을 반환합니다. 그것은 GMP의 mpz_invert()
기능 동작과 일치합니다 . gmpy.divm(a, b, m)
에 대한 일반적인 솔루션을 제공합니다 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
곱셈 역이 존재하지 않을 때 솔루션을 반환하고 예외를 발생시킵니다.
면책 조항 : 저는 gmpy 라이브러리의 현재 관리자입니다.
업데이트 된 답변 2
gmpy2는 이제 역이 존재하지 않을 때 예외를 올바르게 발생시킵니다.
>>> import gmpy2
>>> gmpy2.invert(0,5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: invert() no inverse exists
pow
함수 를 사용할 수 있습니다y = pow(x, -1, p)
. bugs.python.org/issue36027을 참조 하세요 . 표준 라이브러리에 나타나는 솔루션에 대한 질문으로부터 8.5 년이 걸렸습니다!