คุณอาจต้องการดูโมดูลgmpy เป็นอินเทอร์เฟซระหว่าง Python และไลบรารีความแม่นยำหลาย GMP gmpy มีฟังก์ชัน invert ที่ตอบสนองสิ่งที่คุณต้องการ:
>>> 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 ปีจากคำถามที่ถูกถามไปยังโซลูชันที่ปรากฏในห้องสมุดมาตรฐาน!