The Sisa Cina Teorema bisa sangat berguna dalam aritmatika modular.
Misalnya, pertimbangkan rangkaian hubungan kongruensi berikut:
Untuk set hubungan harmoni seperti ini, di mana semua basis ( 3, 5, 7
dalam contoh ini) adalah co-prime satu sama lain, akan ada satu dan hanya satu bilangan bulat n
antara 1
dan produk dari basis ( 3*5*7 = 105
dalam contoh ini) inklusif yang memenuhi hubungan .
Dalam contoh ini, angkanya akan 14
, dihasilkan oleh rumus ini:
dimana 2, 4, and 0
diberikan dari contoh di atas.
70, 21, 15
adalah koefisien rumus dan mereka tergantung pada basis 3, 5, 7
,.
Untuk menghitung koefisien rumus ( 70, 21, 15
dalam contoh kami) untuk satu set pangkalan, kami menggunakan prosedur berikut.
Untuk setiap nomor a
dalam satu set pangkalan:
- Temukan produk dari semua pangkalan lain, dilambangkan sebagai
P
. - Temukan kelipatan pertama
P
yang meninggalkan sisa1
saat dibagia
. Ini adalah koefisiena
.
Misalnya, untuk menghitung koefisien yang sesuai dengan basis 3
, kami menemukan produk dari semua basis lainnya (yaitu 5*7 = 35
) dan kemudian menemukan kelipatan pertama dari produk yang meninggalkan sisa 1
ketika dibagi dengan basis.
Dalam hal ini, 35
meninggalkan sisa 2
saat dibagi dengan 3
, tetapi 35*2 = 70
meninggalkan sisa 1
saat dibagi dengan 3
, demikian 70
juga koefisien yang sesuai untuk 3
. Demikian pula, 3*7 = 21
meninggalkan sisa 1
saat dibagi oleh 5
dan 3*5 = 15
meninggalkan sisa 1
saat dibagi oleh 7
.
Pendeknya
Untuk setiap nomor a
dalam satu set angka:
- Temukan produk dari semua nomor lainnya, dilambangkan sebagai
P
. - Temukan kelipatan pertama
P
yang meninggalkan sisa1
saat dibagia
. Ini adalah koefisiena
.
Tantangan
- Tantangannya adalah, untuk satu set dua atau lebih pangkalan, untuk menemukan set koefisien yang sesuai.
- Himpunan basis dijamin co-prime berpasangan dan setiap basis dijamin lebih besar dari 1.
- Input Anda adalah daftar bilangan bulat sebagai input
[3,4,5]
atau string yang dipisahkan ruang"3 4 5"
atau bagaimanapun input Anda bekerja. - Output Anda harus berupa daftar bilangan bulat atau string yang dipisahkan oleh spasi yang menunjukkan set koefisien.
Uji kasus
input output
[3,5,7] [70,21,15]
[2,3,5] [15,10,6]
[3,4,5] [40,45,36]
[3,4] [4,9]
[2,3,5,7] [105,70,126,120]
[40,27,11] [9801,7480,6480]
[100,27,31] [61101,49600,56700]
[16,27,25,49,11] [363825,2371600,2794176,5583600,529200]
Terima kasih banyak kepada Leaky Nun atas bantuannya dalam menulis tantangan ini. Seperti biasa, jika masalahnya tidak jelas, beri tahu saya. Semoga berhasil dan bermain golf dengan baik!
Jawaban:
Haskell,
615553 byteMenentukan fungsi
f
yang mengambil input dan memberikan output sebagai daftar bilangan bulat.Pertama kita mengulang semua bilangan bulat di input (1). Kemudian kita mengambil produk dari semua bilangan bulat (2) dan membaginya dengan n untuk mendapatkan produk dari bukan-
n
bilangan bulat, yaituP
(3).Kemudian kami menggunakan hasil (
P
) sebagai nilai langkah untuk rentang mulai dari nol (4). Kami mengambil hasilnya,,[0, P, 2P, 3P, ...]
dan memfilternya pada nilai yang hasil dari operasi mod-n adalah satu (5). Akhirnya, kami mengambil elemen pertama, yang berfungsi berkat evaluasi malas (6).Terima kasih kepada @xnor untuk 2 byte!
sumber
quot
bisa menjadidiv
, danhead
bisa!!0
.Jelly ,
117 byteCobalah online! atau verifikasi semua kasus uji .
Latar Belakang
Biarkan P dan a benar-benar positif, bilangan bulat koprime .
Proses dua langkah dalam pertanyaan - menemukan kelipatan P yang meninggalkan sisa 1 ketika dibagi dengan a - dapat dijelaskan dengan persamaan kongruensi berikut.
Dengan teorema Euler-Fermat , kita miliki
di mana φ menunjukkan fungsi total Euler . Dari hasil ini, kami menyimpulkan sebagai berikut.
Akhirnya, karena tantangan mengharuskan kita untuk menghitung Px , kami mengamati itu
di mana Pa dapat dihitung sebagai produk dari semua moduli.
Bagaimana itu bekerja
sumber
J, 13 byte
Berdasarkan jawaban luar biasa @Dennis .
Pemakaian
Beberapa test case memerlukan input sebagai bilangan bulat yang diperluas yang memiliki akhiran
x
.Penjelasan
Coba di sini.
sumber
Mathematica, 27 byte
sumber
Pyth , 14 byte
Suite uji.
Implementasi algoritma yang naif.
sumber
Jelly,
1413 byteMenyimpan satu byte berkat @ Dennis !
Menggunakan proses yang dijelaskan dalam spec tantangan. Input adalah daftar pangkalan dan output adalah daftar koefisien.
Cobalah secara online atau Verifikasi semua kasus uji .
Penjelasan
sumber
JavaScript (ES6), 80 byte
Saya mencoba algoritma Euclidean yang diperluas tetapi membutuhkan 98 byte:
Jika semua nilai prima, ES7 dapat melakukannya dalam 56 byte:
sumber
Python + SymPy, 71 byte
Ini menggunakan algoritma dari jawaban Jelly saya . I / O adalah dalam bentuk daftar nomor SymPy.
sumber
Python 2,
8784 byteImplementasi sederhana dari algoritma. Saran bermain golf diterima.
sumber
Cheddar , 64 byte
sumber
.product
yang tidak.reduce((*))
untuk array ...GAP , 51 byte
GAP memiliki fungsi yang dapat menghitung contoh yang memotivasi
ChineseRem([2,5,7],[2,4,0])
, tetapi itu masih tidak membuatnya mudah untuk mendapatkan koefisien. Kita bisa mendapatkan koefisien ke-n dengan menggunakan daftar dengan satu di posisi ke-n dan nol di posisi lain sebagai argumen kedua. Jadi kita perlu membuat daftar ini dan menerapkan fungsinya untuk semuanya:sumber
Batch, 148 byte
sumber
Sebenarnya, 14 byte
Ini menggunakan algoritma dalam jawaban Dennis's Jelly . Jawaban lain berdasarkan pada jawaban Python saya akan datang. Saran bermain golf diterima. Cobalah online!
Bagaimana itu bekerja
Jawaban lain berdasarkan pada jawaban Python saya sebesar 22 byte. Saran bermain golf diterima. Cobalah online!
Bagaimana itu bekerja
sumber