Diberi dua angka positif x
dan n
dengan x<2^n
, tulis fungsi sesingkat mungkin untuk dihitung x^-1 mod 2^n
. Dengan kata lain, temukan y
itu x*y=1 mod 2^n
.
Fungsi Anda harus menyelesaikan setidaknya dalam waktu yang wajar n=64
, sehingga pencarian lengkap tidak akan berfungsi.
Jika kebalikannya tidak ada, Anda harus menunjukkan itu kepada penelepon entah bagaimana (melemparkan pengecualian, mengembalikan nilai sentinel, dll).
Jika Anda bertanya-tanya harus mulai dari mana, coba Algoritma Euclidean Diperpanjang .
Jawaban:
Python
9589c
adalah fungsi anda. Mengembalikan 0 jika tidak ada terbalik (yaitu ketika x genap).sumber
Python, 29 byte
Ini mengembalikan 0 bahkan x . Ia menggunakan teorema Euler, dengan pengamatan bahwa 2 ^ n - 1 dapat habis dibagi 2 ^ ( n - 1) - 1, melalui eksponensial modular cepat built-in Python. Ini cukup cepat untuk n hingga 7000 atau lebih, di mana ia mulai mengambil lebih dari sekitar satu detik.
sumber
Mathematica - 22
f[x,n]
kembaliy
denganx*y=1 mod 2^n
, jika tidakx is not invertible modulo 2^n
sumber
GolfScript (23 karakter)
Hasil sentinel untuk invers yang tidak ada adalah
0
.Ini adalah aplikasi sederhana dari teorema Euler . , jadi x - 1 ≡ x 2 n - 1 - 1xφ(2n)≡1(mod2n) x−1≡x2n−1−1(mod2n)
Sayangnya itu eksponensial terlalu besar untuk dihitung secara langsung, jadi kita harus menggunakan loop dan melakukan reduksi modular di dalam loop. Langkah berulang adalah dan kami memiliki pilihan kasus dasar: baik denganx2k−1=(x2k−1−1)2×x
k=1
atau
k=2
denganSaya sedang mengerjakan pendekatan lain, tetapi penjaga itu lebih sulit.
Pengamatan kuncinya adalah kita dapat membangun invers up sedikit demi sedikit: jikaxy≡1(mod2k−1) xy∈{1,1+2k−1}(mod2k) x x(y+xy−1)≡1(mod2k) y′=(x+1)y−1
Itu memberi fungsi 19-char
x&1
1
n x f
sumber
Ruby - 88 karakter
Gunakan fungsinya
f
.Cukup fungsi rekursif dari halaman wiki yang tertaut, mengembalikan 0 pada kesalahan.
sumber
(e=->a,b{...})[x,2**n][0]
. Dapat juga menyimpan karakter dengan mengujia%b<1
alih-aliha%b==0
.Haskell, 42 byte
Menggunakan algoritma berdasarkan lemens Hensel yang menggandakan jumlah digit di setiap iterasi, ini berjalan di bawah satu detik untuk n hingga sekitar 30 juta !
sumber
Pyth , 9 byte
Coba di sini!
Mengambil input dalam urutan terbalik. Atau, 9 byte juga:
.^EtK^2QK
.Penjelasan
sumber
GAP, 39 byte
f(x,n)
mengembalikan kebalikan darix
modulo2^n
dan memberikan pesan kesalahanjika tidak ada terbalik.
sumber