Bir Polinomu yerel olarak ters çevirin


20

Meydan okuma

pGerçek düzen 1ve derece katsayılarına sahip bir polinom göz önüne alındığında n, qen fazla nöyle bir derece (p∘q)(X) = p(q(X)) ≡ X mod X^(n+1)veya başka bir deyişle keyfi bir polinom p(q(X)) = X + h(X)nerede holduğu gibi başka bir derece polinomu bulun ord(h) ≥ n+1. Polinom qbenzersiz olarak belirlenir p.

Bir polinom için p(X) = a(n)*X^n + a(n+1)*X^(n+1) + ... + a(m)*X^mnereye n <= mve a(n) ≠ 0, a(m) ≠ 0deriz nolan düzen içinde pve mbir derece arasında p.

Sadeleştirme : Bunun ptamsayı katsayıları olduğunu varsayabilirsiniz a(1)=1( ve p(X) = X + [some integral polynomial of order 2]). Bu durumda qintegral katsayıları da vardır.

Bu basitleştirmenin amacı kayan nokta sayılarıyla ilgili sorunlardan kaçınmaktır. Bununla birlikte, gösterim amaçları için ayrılmaz bir örnek vardır.

Örnekler

  • Taylor serisini düşünün exp(x)-1 = x + x^2/2 + x^3/6 + x^4/24 + ...ve ln(x+1) = x - x^2/2 + x^3/3 - x^4/4 + ...açıkça ln(exp(x)-1+1)= x. Sadece bu iki fonksiyonun 4. derece Taylor polinomlarını düşünürsek, aşağıdan gösterimle alırız (test senaryolarına bakın) p = [-1/4,1/3,-1/2,1,0]ve q = [1/24, 1/6, 1/2, 1,0]ve(p∘q)(X) ≡ X mod X^5

  • Polinomu düşünün p(X) = X + X^2 + X^3 + X^4. Sonra q(X) = X - X^2 + X^3 - X^4biz alırız

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

testcases

Burada girdi ve çıktı polinomları, katsayıların listesi olarak yazılır (en yüksek dereceli monomial katsayısı, en son sabit terim ile):

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

İntegral Test Kılıfları:

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]

Yanıtlar:


5

Python 2 + sympy, 128 bayt

Polinomu, q (x) = x olduğunu varsayarak, p ile oluşturarak, x 2 için katsayıyı kontrol ederek ve q'dan çıkararak yerel olarak ters çeviririz. 4x - Let en katsayısı 4 olduğunu söylemek, ardından yeni polinom q (x) = x olur 2 . Daha sonra bunu p ile oluşturuyoruz, ancak x 3 katsayısına bakıyoruz . Vb...

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()

2

Mathematica, 45 bayt

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

Evet, Mathematica bunun için bir yerleşik var ....

Adsız işlev, değişkene son test durumu xgibi bir polinom girdi olarak -x^4+3x^3-3x^2+xgirer x+3x^2+15x^3+91x^4ve son test örneği gibi benzer sözdizimine sahip bir polinom döndürür .

#+O@x^(#~Exponent~x+1)girdiyi #derecesinde kesilmiş bir güç serisi nesnesine dönüştürür #; InverseSeriessöylediklerini yapar; ve Normalortaya çıkan kesik güç serilerini tekrar polinom haline getirir. (Formdaki bir yanıt x+3x^2+15x^3+91x^4+O[x]^5kabul edilebilirse , ilk 7 baytı kaydedebiliriz . Gerçekten de, hem giriş hem de çıkış için kabul edilebilir bir format InverseSeriesolsaydı , tek başına 13 baytlık bir çözüm olurdu.)


2

JavaScript (ES6), 138 bayt

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]],[])

Bağlantı noktası @ orlp'nin cevabı. G / Ç, katsayı dizilerini ters sırada diziler biçimindedir, yani ilk iki katsayı daima 0 ve 1'dir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.