计算幂级数系数


24

给定一个多项式p(x)整系数和常数项p(0) = 1 or -1和非负整数N,返回N功率SERIS的个系数(有时称为“泰勒级数”)f(x) = 1/p(x)的开发x0 = 0,即程度的单项式的系数N

给定条件确保幂级数存在并且其系数为整数。

细节

与往常一样,可以采用任何方便的格式来接受多项式,例如,p(x) = x^3-2x+5可以将系数列表表示为[1,0,-2,5]

在处f开发的函数的幂级数0由下式给出

并且N-th系数(的系数x^N)由下式给出

其中表示的n-th导数f

例子

  • 多项式的p(x) = 1-x结果是几何级数,f(x) = 1 + x + x^2 + ...因此输出应该是1全部的N

  • p(x) = (1-x)^2 = x^2 - 2x + 1结果在衍生的几何级数的f(x) = 1 + 2x + 3x^2 + 4x^3 + ...,所以输出为NN+1

  • p(x) = 1 - x - x^2 导致斐波那契数列的生成函数 f(x) = 1 + x + 2x^2 + 3x^3 + 5x^4 + 8x^5 + 13x^6 + ...

  • p(x) = 1 - x^2导致1,0,1,0,...ie 的生成函数f(x) = 1 + x^2 + x^4 + x^6 + ...

  • p(x) = (1 - x)^3 = 1 -3x + 3x^2 - x^3导致三角数的生成函数,f(x) = 1 + 3x + 6x^6 + 10x^3 + 15x^4 + 21x^5 + ...这意味着N-th系数是二项式系数(N+2, N)

  • p(x) = (x - 3)^2 + (x - 2)^3 = 1 + 6x - 5x^2 + x^3 结果是 f(x) = 1 - 6x + 41x^2 - 277x^3 + 1873x4 - 12664x^5 + 85626x^6 - 57849x^7 + ...


将多项式作为幂级数系数的无限列表,例如,[1,-1,0,0,0,0,...]是否可以接受?
xnor

是的,我认为这是可以接受的格式。
瑕疵

选择好的例子!
格雷格·马丁

我很高兴您对此表示感谢,谢谢您=)
漏洞

Answers:


9

Mathematica,24个 23个字节

感谢格雷格·马丁节省了1个字节

D[1/#2,{x,#}]/#!/.x->0&

具有两个参数#和的纯函数#2。假定多项式#2满足PolynomialQ[#2,x]。当然有一个内置的:

SeriesCoefficient[1/#2,{x,0,#}]&

1
做得好击败内置!我猜您可以通过假设#是整数N#2多项式来保存一个字节。
格雷格·马丁

6

Matlab,81 79 75字节

与前两个答案不同,它不使用符号计算。这个想法是,您可以迭代地计算系数:

function C=f(p,N);s=p(end);for k=1:N;q=conv(p,s);s=[-q(end-k),s];end;C=s(1)

在线尝试!

说明

function C=f(p,N);
s=p(end);            % get the first (constant coefficient)
for k=1:N;           
    q=conv(p,s);     % multiply the known coefficients with the polynomial
    s=[-q(end-k),s]; % determine the new coefficient to make the the product get "closer" 
end;
C=s(1)           % output the N-th coefficient

4

GeoGebra,28个字节

Derivative[1/A1,B1]/B1!
f(0)

输入分别来自多项式和整数的电子表格单元格A1和B1,并且每行分别输入到输入栏中。通过分配给变量输出a

这是显示执行情况的gif:

泰勒系数

使用内置函数的时间更长,为48个字节:

First[Coefficients[TaylorPolynomial[1/A1,0,B1]]]

4

Haskell,44个字节

p%n=(0^n-sum[p!!i*p%(n-i)|i<-[1..n]])/head p

没有代数内置函数的直接计算。取输入作为幂级数系数的无限列表中,像p = [1,-2,3,0,0,0,0...](即p = [1,-2,3] ++ repeat 0对)1-2*x+x^2。称它为“ p%3给” -4.0

这个想法是,如果p是一个多项式并且q = 1 / p是逆,那么我们可以逐项表示等式p·q = 1。系数X ñp·Q是通过在系数的卷积给出pq

p 0 ·q n + p 1 ·q n-1 + ... + p n ·q 0

为了保持p·q = 1,对于所有n> 0,上述值必须等于零。对于这里,我们可以用q 0,...,q n-1p的系数递归地表示q n

q n =-1 / p 0 ·(p 1 ·q n-1 + ... + p n ·q 0

这正是公司在公式计算sum[p!!i*p%(n-i)|i<-[1..n]]/head p,与head p领先的系数p 0。初始系数q 0 = 1 / p 0在相同的表达式中0^n以表示为n==0


3

J,12个字节

1 :'(1%u)t.'

使用副词t.,该副词p在LHS上以动词形式采用多项式,在kRHS上采用非负整数,并计算at 的泰勒级数的kth系数。为了获得幂级数,在应用幂的倒数。px = 0p

在线尝试!


2

枫树,58 26字节

这是一个未命名的函数,它接受in的多项式x和integer N

编辑:我只是注意到有一个内置的:

(p,N)->coeftayl(1/p,x=0,N)

1

MATL,19字节

0)i:"1GY+@_)_8Mh]1)

翻译@ flawr的伟大Matlab的答案

在线尝试!

怎么运行的

0)      % Implicitly input vector of polynomial coefficients and get last entry
i       % Input N
:"      % For k in [1 2 ... N]
  1G    %   Push vector of polynomial coefficients
  Y+    %   Convolution, full size
  @     %   Push k
  _     %   Negate
  )     %   Index. This produces the end-k coefficient
  _     %   Negate
  8M    %   Push first input of the latest convolution
  h     %   Concatenate horizontally
]       % End
1)      % Get first entry. Implicitly display

1

JavaScript(ES6),57个字节

(a,n)=>a.reduce((s,p,i)=>!i|i>n?s:s-p*f(a,n-i),!n)/a[0]

@xnor的Haskell答案的端口。我最初尝试了一个迭代版本,但结果是98字节,但是对于大的N,它将更快得多,因为我实际上在记住递归调用:

(a,n)=>[...Array(n+1)].fill(0).map((_,i,r)=>r[i]=r.reduce((s,p,j)=>s-p*(a[i-j]||0),!i)/a[0]).pop()

n+1必填项,保存在array中r。最初为零,这允许一次缩小整个数组r,因为零不会影响结果。最后计算的系数是最终结果。


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.