多項式を局所的に反転する


20

チャレンジ

多項式所定のp順序の実際の係数を有する1と程度n、別の多項式を見つけるq高々度にnなるように(p∘q)(X) = p(q(X)) ≡ X mod X^(n+1)、換言すれば、その結果p(q(X)) = X + h(X)ここhで任意の多項式ですord(h) ≥ n+1。多項式qはによって一意に決定されpます。

多項式のためにp(X) = a(n)*X^n + a(n+1)*X^(n+1) + ... + a(m)*X^mどこn <= ma(n) ≠ 0a(m) ≠ 0我々が言うnオーダーpmある程度p

単純化:にp整数係数があると仮定できますa(1)=1(そしてp(X) = X + [some integral polynomial of order 2])。この場合q、積分係数もあります。

この単純化の目的は、浮動小数点数の問題を回避することです。ただし、説明のために非整数の例があります。

  • テイラー級数を考えるexp(x)-1 = x + x^2/2 + x^3/6 + x^4/24 + ...ln(x+1) = x - x^2/2 + x^3/3 - x^4/4 + ...、明らかにそれからln(exp(x)-1+1)= x。私達はちょうど私たちは下からの表記で取得するこれら2つの関数の次数4のテイラー多項式を考慮した場合(テストケースを参照)p = [-1/4,1/3,-1/2,1,0]q = [1/24, 1/6, 1/2, 1,0]し、(p∘q)(X) ≡ X mod X^5

  • 多項式を考えp(X) = X + X^2 + X^3 + X^4ます。その後のためにq(X) = X - X^2 + X^3 - X^4、我々が得ます

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

テストケース

ここで、入力多項式と出力多項式は、係数のリストとして記述されます(最高次の単項式の係数が最初で、定数項が最後です)。

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

統合テストケース:

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]

回答:


5

Python 2 + sympy、128バイト

q(x)= xと仮定し、pで構成し、x 2の係数をチェックし、qから減算することにより、多項式を局所的に反転します。係数が4だったとすると、新しい多項式はq(x)= x-4x 2になります。次に、これを再びpで構成しますが、x 3の係数を調べます。等...

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バイト

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

Mathematicaにはそのためのビルトインがあります...

名前のない関数は、最後のテストケースのxように変数の多項式を入力として受け取り-x^4+3x^3-3x^2+x、最後のテストケースのように同様の構文の多項式を返しますx+3x^2+15x^3+91x^4

#+O@x^(#~Exponent~x+1)入力#を、次数で切り捨てられたべき級数オブジェクトに変換し#ます。InverseSeriesそれが言うことをします。そしてNormal、結果の切り捨てられたべき級数を多項式に戻します。(フォームの回答x+3x^2+15x^3+91x^4+O[x]^5が受け入れられる場合、これらの最初の7バイトを保存できます。実際、それが入力と出力の両方で受け入れられる形式であれば、それInverseSeriesだけで13バイトのソリューションになります。)


2

JavaScript(ES6)、138バイト

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

@orlpの回答のポート。I / Oは逆順の係数の配列の形式です。つまり、最初の2つの係数は常に0と1です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.