Membalik Polinomial secara lokal

20

Tantangan

Mengingat jumlahnya banyak pdengan koefisien nyata ketertiban 1dan gelar n, menemukan polinomial lain qdari tingkat paling nsehingga (p∘q)(X) = p(q(X)) ≡ X mod X^(n+1), atau dengan kata lain seperti yang p(q(X)) = X + h(X)mana hmerupakan polinomial sewenang-wenang dengan ord(h) ≥ n+1. Polinomial qditentukan secara unik oleh p.

Untuk polinomial p(X) = a(n)*X^n + a(n+1)*X^(n+1) + ... + a(m)*X^mmana n <= mdan a(n) ≠ 0, a(m) ≠ 0, kita katakan nadalah urutan dari pdan madalah derajat dari p.

Penyederhanaan : Anda dapat berasumsi bahwa pmemiliki koefisien integer, dan a(1)=1(jadi p(X) = X + [some integral polynomial of order 2]). Dalam hal ini qmemiliki koefisien integral juga.

Tujuan dari penyederhanaan ini adalah untuk menghindari masalah dengan angka floating point. Namun ada contoh non-integral untuk tujuan ilustrasi.

Contohnya

  • Pertimbangkan seri Taylor exp(x)-1 = x + x^2/2 + x^3/6 + x^4/24 + ...dan ln(x+1) = x - x^2/2 + x^3/3 - x^4/4 + ...kemudian jelas ln(exp(x)-1+1)= x. Jika kita hanya mempertimbangkan polinomial Taylor tingkat 4 dari dua fungsi yang kita dapatkan dengan notasi dari bawah (lihat testcases) p = [-1/4,1/3,-1/2,1,0]dan q = [1/24, 1/6, 1/2, 1,0]dan(p∘q)(X) ≡ X mod X^5

  • Pertimbangkan polinomialnya p(X) = X + X^2 + X^3 + X^4. Lalu untuk q(X) = X - X^2 + X^3 - X^4kita dapatkan

    (p∘q)(X) = p(q(X)) = X - 2X^5 + 3X^6 - 10X^7 +...+ X^16 ≡ X mod X^5
    

Testcases

Di sini input dan output polinomial dituliskan sebagai daftar koefisien (dengan koefisien monomial tingkat tertinggi pertama, istilah konstan terakhir):

p = [4,3,2,0];  q=[0.3125,-.375,0.5,0]

Testcas Integral:

p = [1,0]; q = [1,0]

p = [9,8,7,6,5,4,3,2,1,0]; q = [4862,-1430,429,-132,42,-14,5,-2,1,0]

p = [-1,3,-3,1,0]; q = [91,15,3,1,0]
cacat
sumber

Jawaban:

5

Python 2 + sympy, 128 byte

Kami secara lokal membalikkan polinomial dengan mengasumsikan bahwa q (x) = x, menyusunnya dengan p, memeriksa koefisien untuk x 2 , dan mengurangkannya dari q. Katakanlah koefisiennya adalah 4, maka polinomial baru menjadi q (x) = x - 4x 2 . Kami sekali lagi menyusun ini dengan p, tetapi mencari koefisien untuk x 3 . Dll ...

from sympy import*
i=input()
p=Poly(i,var('x'));q=p*0+x
n=2
for _ in i[2:]:q-=compose(p,q).nth(n)*x**n;n+=1
print q.all_coeffs()
orlp
sumber
2

Mathematica, 45 byte

Normal@InverseSeries[#+O@x^(#~Exponent~x+1)]&

Ya, Mathematica memiliki builtin untuk itu ....

Fungsi yang tidak disebutkan namanya mengambil input polinomial dalam variabel x, seperti -x^4+3x^3-3x^2+xuntuk kasus uji terakhir, dan mengembalikan polinomial dengan sintaks yang sama, seperti x+3x^2+15x^3+91x^4untuk kasus uji terakhir.

#+O@x^(#~Exponent~x+1)mengubah input #menjadi objek seri daya, terpotong pada tingkat #; InverseSeriesmelakukan apa yang dikatakannya; dan Normalmengubah rangkaian daya terputus yang dihasilkan kembali menjadi polinomial. (Kita dapat menyimpan 7 byte awal tersebut jika jawaban dalam formulir x+3x^2+15x^3+91x^4+O[x]^5dapat diterima. Memang, jika itu adalah format yang dapat diterima untuk input dan output, maka InverseSeriessendirian akan menjadi solusi 13-byte.)

Greg Martin
sumber
2

JavaScript (ES6), 138 byte

a=>a.reduce((r,_,i)=>[...r,i<2?i:a.map(l=>c=p.map((m,j)=>(r.map((n,k)=>p[k+=j]=m*n+(p[k]||0)),m*l+(c[j]||0)),p=[]),c=[],p=[1])&&-c[i]],[])

Port jawaban @ orlp. I / O adalah dalam bentuk array dari koefisien dalam urutan terbalik yaitu dua koefisien pertama selalu 0 dan 1.

Neil
sumber