局部反转多项式


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为了pmp

简化:您可以假设它p具有整数系数,并且a(1)=1(so 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。如果仅考虑这两个函数的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]

Answers:


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采用相反顺序的系数阵列形式,即前两个系数始终为0和1。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.