Latar Belakang (lewati ke definisi)
Euler membuktikan teorema yang indah tentang bilangan kompleks: e ix = cos (x) + i sin (x).
Ini membuat teorema de Moivre mudah dibuktikan:
(e ix ) n = e i (nx)
(cos (x) + i sin (x)) n = cos (nx) + i sin (nx)
Kita dapat memplot bilangan kompleks menggunakan bidang Euclidean dua dimensi, dengan sumbu horizontal mewakili bagian nyata dan sumbu vertikal mewakili bagian imajiner. Dengan cara ini, (3,4) akan sesuai dengan bilangan kompleks 3 + 4i.
Jika Anda terbiasa dengan koordinat polar, (3,4) akan menjadi (5, arctan (4/3)) dalam koordinat polar. Angka pertama, r, adalah jarak titik dari titik asal; angka kedua, θ, adalah sudut yang diukur dari sumbu x positif ke titik, berlawanan arah jarum jam. Akibatnya, 3 = r cosθ dan 4 = r sinθ. Oleh karena itu, kita dapat menulis 3 + 4i sebagai r cosθ + ri sinθ = r (cosθ + i sinθ) = re iθ .
Mari kita memecahkan persamaan kompleks z n = 1, di mana n adalah bilangan bulat positif.
Kami membiarkan z = re iθ . Kemudian, z n = r n e inθ . Jarak z n dari titik asal adalah r n , dan sudutnya adalah nθ. Namun, kita tahu bahwa jarak 1 dari titik asal adalah 1, dan sudutnya adalah 0. Oleh karena itu, r n = 1 dan nθ = 0. Namun, jika Anda memutar 2π lebih, Anda masih berakhir pada titik yang sama, karena 2π hanya lingkaran penuh. Oleh karena itu, r = 1 dan nθ = 2kπ, memberi kita z = e 2ikπ / n .
Kami menyatakan kembali penemuan kami: solusi untuk z n = 1 adalah z = e 2ikπ / n .
Polinomial dapat diekspresikan dalam hal akarnya. Misalnya, akar x 2 -3x + 2 adalah 1 dan 2, jadi x 2 -3x + 2 = (x-1) (x-2). Demikian pula dari penemuan kami di atas:
Namun, produk itu tentu mengandung akar n lain. Misalnya, ambil n = 8. Akar z 4 = 1 juga akan dimasukkan ke dalam akar z 8 = 1, karena z 4 = 1 menyiratkan z 8 = (z 4 ) 2 = 1 2 = 1. Ambil n = 6 sebagai contoh. Jika z 2 = 1, maka kita juga akan memiliki z 6 = 1. Demikian juga, jika z 3 = 1, maka z 6 = 1.
Jika kita ingin mengekstrak akar unik ke z n = 1, kita perlu k dan n untuk tidak berbagi pembagi umum kecuali 1. Atau, jika mereka berbagi pembagi umum d di mana d> 1, maka z akan menjadi (k / d) -th root dari z n / d = 1. Dengan menggunakan teknik di atas untuk menulis polinom dalam hal akarnya, kita memperoleh polinomial:
Perhatikan bahwa polinomial ini dilakukan dengan menghilangkan akar z n / d = 1 dengan d menjadi pembagi n. Kami mengklaim bahwa polinomial di atas memiliki koefisien bilangan bulat. Pertimbangkan LCM polinomial dalam bentuk z n / d -1 di mana d> 1 dan d membagi n. Akar LCM adalah persis akar yang ingin kita hapus. Karena setiap komponen memiliki koefisien integer, LCM juga memiliki koefisien integer. Karena LCM membagi z n -1, hasil bagi harus polinomial dengan koefisien integer, dan hasil bagi adalah polinomial di atas.
Akar z n = 1 semuanya memiliki jari-jari 1, sehingga mereka membentuk lingkaran. Polinomial mewakili titik-titik lingkaran yang unik ke n, jadi dalam arti polinomial membentuk partisi dari lingkaran. Oleh karena itu, polinomial di atas adalah polinomial siklomomik ke-n. (cyclo- = lingkaran; tom- = untuk memotong)
Definisi 1
Polinomial siklotomik ke-n, dilambangkan , adalah polinomial unik dengan koefisien bilangan bulat yang membagi x n -1 tetapi bukan x k -1 untuk k <n.
Definisi 2
Polinomial siklomomik adalah sekumpulan polinomial, satu untuk setiap bilangan bulat positif, sehingga:
dimana k | n berarti k membagi n.
Definisi 3
Polinomial siklomomik ke-n adalah polinomial xn -1 dibagi dengan LCM polinomial dalam bentuk xk -1 di mana k membagi n dan k <n.
Contohnya
- Φ 1 (x) = x - 1
- Φ 2 (x) = x + 1
- Φ 3 (x) = x 2 + x + 1
- Φ 30 (x) = x 8 + x 7 - x 5 - x 4 - x 3 + x + 1
- Φ 105 (x) = x 48 + x 47 + x 46 - x 43 - x 42 - 2x 41 - x 40 - x 39 + x 36 + x 35 + x 34 + x 33 + x 33 + x 32 + x 31 - x 28 - x 26 - x 24 - x 22 - x 20 + x 17 + x 16 + x 15 + x 14 + x 13 + x 12 - x9 - x 8 - 2x 7 - x 6 - x 5 + x 2 + x + 1
Tugas
Dengan bilangan bulat positif n
, kembalikan n
polinomial siklomomik ke-10 seperti yang didefinisikan di atas, dalam format yang masuk akal (mis. Daftar koefisien koefisien diperbolehkan).
Aturan
Anda dapat mengembalikan angka floating point / kompleks selama mereka membulatkan ke nilai yang benar.
Mencetak gol
Ini adalah kode-golf . Jawaban terpendek dalam byte menang.
Referensi
sumber
Jawaban:
Haskell , 120 byte
Cobalah online!
Memberikan daftar pelampung kompleks yang memiliki entri seperti
1.0000000000000078 :+ 3.314015728506092e-14
karena ketidaklancaran float. Metode penggandaan langsung untuk memulihkan polinomial dari akarnya.Ini
fromInteger
adalah konsesi besar untuk sistem tipe Haskell. Pasti ada cara yang lebih baik. Saran diterima. Berurusan dengan akar persatuan secara simbolis juga mungkin berhasil.Haskell , 127 byte
Cobalah online!
Tanpa impor.
Menggunakan formula
Menghitung Φ_n (x) dengan membagi LHS dengan masing-masing istilah lain dalam RHS.
Operator
%
melakukan pembagian polinomial, mengandalkan sisanya nol. Pembagi dianggap monic, dan diberikan tanpa angka 1, dan juga dengan nol trailing tak terbatas untuk menghindari pemotongan ketika melakukanzipWith
.sumber
[0,0..]
byte lebih pendek darirepeat 0
.Mathematica,
4341 byteTentu saja, kita selalu dapat menggunakan built-in, tetapi jika tidak, ini akan membagi x n -1 oleh Φ k ( x ) (dihitung secara rekursif) untuk setiap pembagi k yang tepat dari n .
Kami menggunakan
Factor
untuk mendapatkan polinomial di akhir. Saya pikir alasan ini berhasil adalah karenax^#-1
faktor - faktor ke dalam semua polinomial siklotomik pembagi n , dan kemudian kita membagi yang tidak kita inginkan.-2 byte terima kasih kepada Jenny_mathy, menulis ulang
Factor
hanya berlaku untuk pembilang.sumber
Factor@
Factor[x^#-1]/Times@@...
gantinya; jika kami tidak memiliki tanda kurung di sana, kami ingin tanda kurung.Factor[x^#-1]/Times@@...
, dan itu juga berarti saya tidak tahu cara kerjanya.MATL ,
32312725 byteOutput mungkin non-integer karena ketidaktepatan floating-point (yang diizinkan). Footer melakukan pembulatan untuk kejelasan.
Cobalah online!
sumber
Haskell ,
250 236 233 218216 byteIni adalah versi verbose, (@xnor dapat melakukannya di hampir setengah skor ) tetapi dijamin akan bekerja
n
selama Anda memiliki cukup memori, tetapi tidak menggunakan builtin untuk menghasilkan polinomial siklomomik ke-n. Input adalah bilangan bulat ukuran arbitrer dan outputnya adalah tipe polinomial dengan koefisien rasional (tepat).Ide kasar di sini adalah menghitung polinomial secara rekursif. Untuk
n=1
ataun
prima itu sepele. Untuk semua angka lainnya, pendekatan ini pada dasarnya menggunakan rumus dari definisi 2dipecahkan untuk . Terima kasih @ H.Wiz untuk cukup banyak byte!
Untuk
n=105
ini menghasilkan polinomial berikut (saya merapikan semua%1
penyebut):Polinomial
n=15015
dapat ditemukan di sini (koefisien terbesar adalah 23).Cobalah online!
sumber
+1
karena tidak menjadi builtin.Rationals
? Tampaknya berfungsi dengan baik tanpa merekaquotRemPoly
, izinkan saya coba lagi kalau begitu!Double
koefisien jika Anda tidak menggunakannyaRatio Integer
, yang mungkin menyebabkan masalah untuk sangat (sangat) besarn
.Jelly , 23 byte
Cobalah online!
Keluaran sebagai daftar koefisien.
Memiliki floating point dan ketidakakuratan yang kompleks. Footer melakukan pembulatan untuk membuat output lebih cantik.
sumber
J , 36 bytes
Cobalah online!
Menggunakan formula
Ada beberapa ketidakakuratan floating-point, tetapi diizinkan.
sumber
Mathematica, 81 byte
sumber
R ,
176171139112 byteCobalah online!
Versi yang jauh lebih sederhana; menggunakan
for
loop daripada aReduce
.sumber
Pari / GP , 8 byte
Built-in.
Cobalah online!
Pari / GP , 39 byte, tanpa built-in
Menggunakan rumus:
Cobalah online!
sumber
CJam (
5251 byte)Demo online . Ini adalah blok anonim (fungsi) yang mengambil integer pada stack dan meninggalkan array koefisien endian besar pada stack.
Pembedahan
sumber
JavaScript (ES6),
337333284...252250245242 bytePenjelasan (Dipilih):
Inisialisasi z = (1 + 0i) * x ^ 0
Perhitungan GCD.
Karena saya perlu menggunakan fungsi Matematika cukup banyak, saya menggunakan variabel lain di sini.
Penggandaan polinomial.
Formula yang digunakan adalah
Kompres kembali output ke array integer.
Output:
Array bilangan bulat, dengan elemen pada posisi i mewakili koefisien x ^ i.
Salah satu masalah yang dimiliki JS adalah karena JS tidak menyediakan pustaka asli untuk perhitungan pada polinomial dan bilangan kompleks, mereka perlu diimplementasikan dengan cara seperti array.
console.log (phi (105)) memberi
337> 333 (-4): Mengubah kode untuk memeriksa nilai yang tidak ditentukan
333> 284 (-49): Mengubah fungsi multiplikasi polinomial karena dapat disederhanakan
284> 277 (-7): Menghapus beberapa kode redundan
277> 265 (-12): Gunakan 2 variabel, bukan array 2-elemen untuk menjatuhkan beberapa byte dalam penggunaan array
265> 264 (-1): Gunakan Array.push () alih-alih Array.concat () untuk mengurangi 4 byte, tetapi menambahkan 3 untuk kurung for-loop dan variabel z
264> 263 (-1): Lebih lanjut bermain golf pada amandemen terakhir
263> 262 (-1): Golf pada for for loop
262> 260 (-2): Keluar dari klausa if
260> 258 (-2): Selanjutnya menggabungkan deklarasi
258> 252 (-6): Bermain golf dengan menggunakan kembali referensi array
252> 250 (-2): Ganti beberapa operator unary sebagai operator biner
250> 245 (-5): Pindahkan kenaikan di Array.map () ke referensi penghitung terakhir untuk menghapus byte
245> 242 (-3): Gunakan sintaksis alih-alih Array.push ()
sumber