Tautan yang relevan di sini dan di sini , tetapi di sini adalah versi singkatnya:
Anda memiliki input dua bilangan bulat a
dan b
antara infinity negatif dan infinity (walaupun jika perlu, saya dapat membatasi rentang, tetapi fungsinya masih harus menerima input negatif).
Definisi simbol Kronecker
Anda harus mengembalikan simbol Kronecker (a|b)
untuk input a
dan di b
mana
(a|b) = (a|p_1)^e_1 * (a|p_2)^e_2 * ... * (a|p_n)^e_n
di mana b = p_1^e_1 * p_2^e_2 * ... * p_n^e_n
, dan p_i
dan e_i
adalah bilangan prima dan eksponen dalam faktorisasi utama b
.
Untuk prime yang aneh p
, (a|p)=a^((p-1)/2) (mod p)
seperti yang didefinisikan di sini .
Untuk b == 2
,(n|2)={0 for n even; 1 for n odd, n=+/-1 (mod 8); -1 for n odd, n=+/-3 (mod 8)
Untuk b == -1
,(n|-1)={-1 for n<0; 1 for n>0
Jika a >= b
, (a|b) == (z|b)
dimana z == a % b
. Dengan properti ini, dan seperti yang dijelaskan di sini dan di sini , a
adalah residu kuadrat dari b
if z
adalah, meskipun a >= b
.
(-1|b)
= 1
jika b == 0,1,2 (mod 4)
dan -1
jika b == 3 (mod 4)
. (0|b)
adalah 0
kecuali untuk (0|1)
yang 1
, karena (a|1)
selalu 1
dan untuk negatif a
, (-a|b) == (-1|b) * (a|b)
.
Output dari simbol Kronecker selalu -1, 0 or 1
, di mana outputnya adalah 0
jika a
dan b
memiliki faktor umum. If b
adalah prime odd, (a|b) == 1
if a
adalah residu mod kuadratikb
, dan -1
jika bukan residu kuadrat.
Aturan
Kode Anda harus berupa program atau fungsi.
Masukan harus dalam urutan
a b
.Outputnya harus berupa
-1
,0
atau1
.Ini kode golf, jadi kode Anda tidak harus efisien, cukup singkat.
Tidak ada bawaan yang secara langsung menghitung Kronecker atau simbol Jacobi dan Legendre terkait. Built-in lainnya (untuk faktorisasi utama, misalnya) adalah permainan yang adil.
Contohnya
>>> kronecker(1, 5)
1
>>> kronecker(3, 8)
-1
>>> kronecker(15, 22)
1
>>> kronecker(21, 7)
0
>>> kronecker(5, 31)
1
>>> kronecker(31, 5)
1
>>> kronecker(7, 19)
1
>>> kronecker(19, 7)
-1
>>> kronecker(323, 455625)
1
>>> kronecker(0, 12)
0
>>> kronecker(0, 1)
1
>>> kronecker(12, 0)
0
>>> kronecker(1, 0)
1
>>> kronecker(-1, 5)
1
>>> kronecker(1, -5)
1
>>> kronecker(-1, -5)
-1
>>> kronecker(6, 7)
-1
>>> kronecker(-1, -7)
1
>>> kronecker(-6, -7)
-1
Ini adalah fungsi yang rumit, jadi tolong beri tahu saya jika ada sesuatu yang tidak jelas.
sumber
Jawaban:
CJam (70 byte)
Demo online (test case dibuat dengan Mathematica).
Pembedahan
Saya menemukan beberapa cara mengevaluasi
(a|2)
untuk jumlah karakter yang sama, dan telah memilih untuk menggunakan yang dengan presentasi paling jelas.integer array <W=
adalah IMO cara yang cukup elegan untuk melakukan fallback: jika integer lebih besar dari panjang array, kita pilih elemen terakhir.Komentar lain
Sangat mengecewakan bahwa untuk prime odd
p
gaya Fermat langsung(a|p)
sangat pendek, karena ada cara yang sangat golf untuk menemukan(a|n)
aneh anehn
yang ingin saya gunakan. Dasarnya adalah lemma Zolotarev:Ini diperkuat oleh Frobenius untuk
dan oleh Lerch ke
Lihat Brunyate dan Clark, Memperluas pendekatan Zolotarev-Frobenius untuk timbal balik kuadratik , The Ramanujan Journal 37.1 (2014): 25-50 untuk referensi.
Dan itu dapat dengan mudah diperkuat satu langkah lebih jauh (walaupun saya belum melihat ini dalam literatur) untuk
Bukti: jika
a
memang coprimeb
maka kita menggunakan Zolotarev-Frobenius-Lerch; jika tidak, peta bukanlah permutasi, dan simbol Levi-Civita adalah0
seperti yang diinginkan.Ini memberikan perhitungan simbol Jacobi
Tetapi perlakukan khusus diperlukan untuk
(a|-1)
dan(a|2)
berarti bahwa saya belum menemukan cara menghitung simbol Kronecker yang lebih pendek dengan pendekatan ini: lebih pendek untuk membuat faktor dan memperlakukan bilangan prima secara individual.sumber
Python 3,
747369335 byteSebagai contoh jawaban, hanya sedikit bermain golf, dan untuk memberi Anda gambaran seperti apa jawaban itu.
Dan ya, faktorisasi utama dan bit enkode run-length dikumpulkan dari Pyth dengan permintaan maaf kepada isaacg .
sumber
Mathematica,
169175165 bytesumber
LabVIEW, 44 Bytes LabVIEW Primitif
Karena simetrisnya, saya menukar input jika a lebih besar dari b.Merupakan formula sebenarnya sekarang
menghitung seperti biasa menurut
untuk kasus yang sebenarnya
sumber
(a|b) != (b|a)
dalam semua kasus. Dalam kebanyakan kasus, ya, tetapi tidak di semua dari mereka. Meskipun itu akan berhasil jika Anda mengurangia mod b
alih-alih menukar mereka.Julia, 195 byte
Ini adalah fungsi rekursif
k
yang menerima dua bilangan bulat dan mengembalikan bilangan bulat.Tidak Disatukan:
sumber
Haskell, 286 byte
Mungkin tidak sepenuhnya dioptimalkan, tetapi upaya yang berani. Simbol Kronecker didefinisikan sebagai fungsi infiks a # b, yaitu
sumber