Diberi dua polinomial f,g
derajat sembarang atas bilangan bulat, program / fungsi Anda harus mengevaluasi polinomial pertama di polinomial kedua. f(g(x))
(alias komposisi (fog)(x)
dua polinomial)
Detail
Dibangun secara bawaan. Anda dapat menganggap pemformatan yang masuk akal sebagai input / output, tetapi format input dan output harus cocok. Misalnya memformat sebagai string
x^2+3x+5
atau sebagai daftar koefisien:
[1,3,5] or alternatively [5,3,1]
Selanjutnya polinomial input dapat diasumsikan diperluas penuh, dan outputnya juga diharapkan diperluas sepenuhnya.
Contohnya
A(x) = x^2 + 3x + 5, B(y) = y+1
A(B(y)) = (y+1)^2 + 3(y+1) + 5 = y^2 + 5y + 9
A(x) = x^6 + x^2 + 1, B(y) = y^2 - y
A(B(y))= y^12 - 6y^11 + 15y^10 - 20y^9 + 15y^8 - 6y^7 + y^6 + y^4 - 2 y^3 + y^2 + 1
A(x) = 24x^3 - 144x^2 + 288x - 192, B(y) = y + 2
A(B(y)) = 24y^3
A(x) = 3x^4 - 36x^3 + 138x^2 - 180x + 27, B(y) = 2y + 3
A(B(y)) = 48y^4 - 96y^2
(.)
adalah jawaban di Haskell. Anda mungkin bermaksud beberapa representasi dari daftar koefisien.Jawaban:
Haskell,
8672 byteMenentukan fungsi
o
sedemikian rupa sehinggao g f
menghitung komposisi f ∘ g. Polinomial diwakili oleh daftar koefisien kosong mulai dari suku konstan.Demo
Bagaimana itu bekerja
Tidak ada builtin atau perpustakaan terkait polinomial. Amati perulangan yang serupa
f (x) = a + f₁ (x) x ⇒ f (x) g (x) = ag (x) + f₁ (x) g (x) x,
f (x) = a + f₁ (x) x ⇒ f (g (x)) = a + f₁ (g (x)) g (x),
untuk perkalian dan komposisi polinomial, masing-masing. Mereka berdua mengambil formulir
f (x) = a + f₁ (x) x ⇒ W (f) (x) = C (a) (x) + U (W (f₁)) (x).
Operator
!
memecahkan pengulangan formulir ini untuk W diberikan U dan C, menggunakanzipWith(+).(++[0,0..])
untuk penambahan polinomial (dengan asumsi argumen kedua lebih panjang-untuk tujuan kita, selalu akan menjadi). Kemudian,(0:)
mengalikan argumen polinomial dengan x (dengan mendahului koefisien nol);(<$>g).(*)
mengalikan argumen skalar dengan polinomialg
;(0:)!((<$>g).(*))
mengalikan argumen polinomial dengan polinomialg
;pure
mengangkat argumen skalar ke polinomial konstan (daftar tunggal);(0:)!((<$>g).(*))!pure
menyusun argumen polinomial dengan polinomialg
.sumber
Mathematica, 17 byte
Contoh penggunaan:
sumber
TI-Basic 68k, 12 byte
Penggunaannya mudah, misalnya untuk contoh pertama:
Yang kembali
sumber
→
menjadi 1 byte di TI-BASIC?Python 2, 138
156 162byteMasukan diharapkan daftar bilangan bulat dengan kekuatan terkecil terlebih dahulu.
Tidak Disatukan:
Dalam perhitungan ini, koefisien polinomial dipandang sebagai digit (yang mungkin negatif) dari angka dalam basis yang sangat besar. Setelah polinomial berada dalam format ini, penggandaan atau penambahan adalah operasi integer tunggal. Selama basisnya cukup besar, tidak akan ada carry yang tumpah ke angka tetangga.
-18 dari meningkatkan terikat
B
seperti yang disarankan oleh @xnor.sumber
B
, apakah10**len(`a+b`)
cukup?Python + SymPy,
5935 byteTerima kasih kepada @asmeurer karena bermain golf 24 byte!
Uji coba
sumber
compose()
fungsi.from module import*;function
merupakan pengajuan yang valid. Apapun itu, ini adalah kebijakan yang lebih baru, yang memungkinkan impor dan fungsi pembantu dengan lambda yang tidak disebutkan namanya.Sage, 24 byte
Pada Sage 6.9 (versi yang berjalan di http://sagecell.sagemath.org ), fungsi panggilan tanpa penugasan argumen eksplisit (
f(2) rather than f(x=2)
) menyebabkan pesan yang mengganggu dan tidak membantu dicetak ke STDERR. Karena STDERR dapat diabaikan secara default dalam kode golf, ini masih berlaku.Ini sangat mirip dengan jawaban SymPy Dennis karena Sage adalah a) dibangun di atas Python, dan b) menggunakan Maxima , sistem aljabar komputer yang sangat mirip dengan SymPy dalam banyak hal. Namun, Sage jauh lebih kuat daripada Python dengan SymPy, dan dengan demikian merupakan bahasa yang cukup berbeda sehingga pantas untuk jawabannya sendiri.
Verifikasi semua kasus uji online
sumber
PARI / GP , 19 byte
yang memungkinkan Anda melakukannya
mendapatkan
sumber
MATLAB dengan Symbolic Toolbox, 28 byte
Ini adalah fungsi anonim. Untuk menyebutnya, tetapkan ke variabel atau gunakan
ans
. Input adalah string dengan format (spasi opsional)Contoh dijalankan:
sumber
Python 2,
239232223 byteImplementasi 'tepat' yang tidak menyalahgunakan basis. Koefisien signifikan terkecil terlebih dahulu.
a
adalah penambahan polinomial,m
adalah perkalian polinomial, dano
komposisi.sumber
m([c],e(m,[[1]]+[g]*k))
sama dengane(m,[[c]]+[g]*k)
?a=lambda*l:map(lambda x,y:(x or 0)+(y or 0),*l)
( or 0)
dalam versi itu.JavaScript (ES6),
150103 byteMenerima dan mengembalikan polinomial sebagai array a = [a 0 , a 1 , 2 , ...] yang mewakili 0 + a 1 * x + a 2 * x 2 ...
Sunting: Disimpan 47 byte dengan beralih dari multiplikasi polinomial berulang ke berulang, yang kemudian memungkinkan saya untuk menggabungkan dua
map
panggilan.Penjelasan: r adalah hasilnya, yang dimulai dari nol, diwakili oleh array kosong, dan p adalah g h , yang dimulai pada satu. p dikalikan dengan masing-masing f h pada gilirannya, dan hasilnya terakumulasi dalam r . p juga dikalikan dengan g pada saat yang sama.
sumber
Pyth,
5134 byteSuite uji .
sumber
Ruby 2.4 + polinomial , 41 + 12 = 53 byte
Menggunakan bendera
-rpolynomial
. Input adalah duaPolynomial
objek.Jika seseorang mengalahkan saya di vanilla Ruby (tidak ada perpustakaan eksternal polinomial), saya akan sangat terkesan.
sumber