Apakah beberapa modul Python standar berisi fungsi untuk menghitung invers perkalian modular dari sebuah bilangan, yaitu bilangan y = invmod(x, p)
seperti itu x*y == 1 (mod p)
? Google sepertinya tidak memberikan petunjuk bagus tentang ini.
Tentu saja, seseorang dapat membuat 10-liner buatan sendiri dari algoritma Euclidean yang diperluas , tetapi mengapa menemukan kembali roda.
Misalnya, Java BigInteger
memiliki modInverse
metode. Bukankah Python memiliki sesuatu yang serupa?
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!Jawaban:
Mungkin seseorang akan menganggap ini berguna (dari wikibook ):
sumber
sympy
,x, _, g = sympy.numbers.igcdex(a, m)
lakukan triknya.Jika modulus Anda adalah bilangan prima (Anda menyebutnya
p
) maka Anda dapat menghitung:Atau dengan Python:
Berikut adalah seseorang yang telah menerapkan beberapa kemampuan teori bilangan dengan Python: http://www.math.umbc.edu/~campbell/Computers/Python/numbthy.html
Berikut adalah contoh yang dilakukan saat diminta:
sumber
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:
Jawaban yang diperbarui
Seperti dicatat oleh @hyh,
gmpy.invert()
mengembalikan 0 jika invers tidak ada. Itu cocok dengan perilakumpz_invert()
fungsi GMP .gmpy.divm(a, b, m)
memberikan solusi umum untuka=bx (mod m)
.divm()
akan mengembalikan solusi saatgcd(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:
sumber
gmpy.invert(0,5) = mpz(0)
alih-alih memunculkan kesalahan ...gmpy
paket ini ? (yaitu beberapa fungsi yang memiliki nilai yang sama tetapi lebih cepat dari(a * b)% p
?)(a * b) % p
dalam suatu fungsi tidak lebih cepat dari sekedar mengevaluasi(a * b) % p
dengan Python. Overhead untuk panggilan fungsi lebih besar daripada biaya evaluasi ekspresi. Lihat code.google.com/p/gmpy/issues/detail?id=61 untuk detail selengkapnya.Pada 3.8 pythons pow () fungsi dapat mengambil modulus dan integer negatif. Lihat disini . Kasus mereka tentang cara menggunakannya adalah
sumber
Berikut adalah satu baris untuk CodeFights ; ini adalah salah satu solusi terpendek:
Ini akan kembali
-1
jikaA
tidak memiliki pembalikan perkaliann
.Pemakaian:
Solusinya menggunakan Algoritma Euclidean yang Diperluas .
sumber
Sympy , modul python untuk matematika simbolik, memiliki fungsi invers modular bawaan jika Anda tidak ingin mengimplementasikannya sendiri (atau jika Anda sudah menggunakan Sympy):
Ini sepertinya tidak didokumentasikan di situs web Sympy, tetapi inilah docstringnya: Sympy mod_inverse docstring di Github
sumber
Ini kode saya, mungkin ceroboh tetapi tampaknya tetap berfungsi untuk saya.
sumber
Kode di atas tidak akan berjalan di python3 dan kurang efisien dibandingkan dengan varian GCD. Namun, kode ini sangat transparan. Ini memicu saya untuk membuat versi yang lebih ringkas:
sumber
n == 7
. Tetapi sebaliknya, ini hampir setara dengan "algoritme" ini:for i in range(2, n): if i * a % n == 1: return i
Berikut adalah 1-liner ringkas yang melakukannya, tanpa menggunakan library eksternal apa pun.
Perhatikan bahwa ini benar-benar hanya egcd, disederhanakan untuk mengembalikan hanya koefisien tunggal yang menarik.
sumber
Untuk mengetahui pembalikan perkalian modular saya sarankan menggunakan Algoritma Euclidean yang Diperluas seperti ini:
sumber
a = prevX - quotient * X
seharusnyaX = prevX - quotient * X
, dan seharusnya kembaliprevX
. FWIW, implementasi ini mirip dengan yang ada di link Qaz di komentar jawaban Märt Bakhoff.Saya mencoba solusi yang berbeda dari utas ini dan pada akhirnya saya menggunakan yang ini:
Modular_inverse dengan Python
sumber
return
di egcd diindendasikan dengan cara yang salahYah, saya tidak memiliki fungsi di python tetapi saya memiliki fungsi di C yang dapat Anda ubah dengan mudah ke python, di bawah fungsi c, algoritma euclidian diperpanjang digunakan untuk menghitung mod terbalik.
Fungsi Python
Referensi fungsi C di atas diambil dari link program C berikut untuk mencari Pembalikan Perkalian Modular dari dua Bilangan Prima Relatif
sumber
dari kode sumber implementasi cpython :
menurut komentar di atas kode ini, ia dapat mengembalikan nilai negatif kecil, jadi Anda berpotensi memeriksa apakah negatif dan menambahkan n ketika negatif sebelum mengembalikan b.
sumber
Banyak dari tautan di atas yang rusak seperti pada 1/23/2017. Saya menemukan implementasi ini: https://courses.csail.mit.edu/6.857/2016/files/ffield.py
sumber