Calcular coeficientes da série de potência


24

Dado um polinômio p(x)com coeficientes integrais e um termo constante de p(0) = 1 or -1, e um número inteiro não negativo N, retorne o N-ésimo coeficiente do seris de potência (às vezes chamado de "série Taylor") de f(x) = 1/p(x)desenvolvido em x0 = 0, isto é, o coeficiente do monômio de grau N.

As condições dadas garantem que a série de potências exista e que seus coeficientes sejam inteiros.

Detalhes

Como sempre, o polinômio pode ser aceito em qualquer formato conveniente, por exemplo, uma lista de coeficientes, por exemplo, p(x) = x^3-2x+5pode ser representada como [1,0,-2,5].

As séries de potência de uma função fdesenvolvida em 0são dadas por

e o N-ésimo coeficiente (o coeficiente de x^N) é dado por

onde denota a n-ésima derivada def

Exemplos

  • O polinômio p(x) = 1-xresulta na série geométrica, f(x) = 1 + x + x^2 + ...portanto a saída deve ser 1para todos N.

  • p(x) = (1-x)^2 = x^2 - 2x + 1resulta na derivada da série geométrica f(x) = 1 + 2x + 3x^2 + 4x^3 + ..., então a saída para Né N+1.

  • p(x) = 1 - x - x^2 resulta na função geradora da sequência de Fibonacci f(x) = 1 + x + 2x^2 + 3x^3 + 5x^4 + 8x^5 + 13x^6 + ...

  • p(x) = 1 - x^2resulta na função geradora de 1,0,1,0,...ief(x) = 1 + x^2 + x^4 + x^6 + ...

  • p(x) = (1 - x)^3 = 1 -3x + 3x^2 - x^3resulta na função geradora dos números triangulares f(x) = 1 + 3x + 6x^6 + 10x^3 + 15x^4 + 21x^5 + ...que significa que o N-ésimo coeficiente é o coeficiente binomial(N+2, N)

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


Seria aceitável considerar um polinômio como uma lista infinita de coeficientes de séries de potências [1,-1,0,0,0,0,...]?
xnor

Sim, acho que esse é um formato aceitável.
flawr

Bons exemplos escolhidos!
Greg Martin

Estou feliz que você apreciá-lo, obrigado =)
flawr

Respostas:


9

Mathematica, 24 23 bytes

Guardado 1 byte graças a Greg Martin

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

Função pura com dois argumentos #e #2. Assume que o polinômio é #2satisfatório PolynomialQ[#2,x]. Claro que há um built-in para isso:

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

11
Bem feito, batendo o built-in! Eu acho que você pode salvar um byte, assumindo que #é o número inteiro Ne #2é o polinômio.
Greg Martin

6

Matlab, 81 79 75 bytes

Ao contrário das duas respostas anteriores, isso não faz uso de cálculos simbólicos. A ideia é que você possa calcular iterativamente os coeficientes:

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)

Experimente online!

Explicação

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 bytes

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

A entrada é obtida das células da planilha A1 e B1 de um polinômio e um número inteiro, respectivamente, e cada linha é inserida separadamente na barra de entrada. A saída é via atribuição à variável a.

Aqui está um gif mostrando a execução:

Coeficientes de Taylor

O uso de built-in é muito mais longo, com 48 bytes:

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

4

Haskell, 44 bytes

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

Uma computação direta sem built-ins algébricos. Recebe entrada como uma lista infinita de coeficientes de séries de potência, como p = [1,-2,3,0,0,0,0...](ie p = [1,-2,3] ++ repeat 0) para 1-2*x+x^2. Chame assim p%3, o que dá -4.0.

A idéia é que se p é um polinômio e q = 1 / p é inverso, então podemos expressar a igualdade p · q = 1 termo a termo. O coeficiente de x n em p · q é dado pela convolução dos coeficientes em p e q :

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

Para que p · q = 1 seja mantido, o acima deve ser igual a zero para todos os n> 0 . Por aqui, podemos expressar q n recursivamente em termos de q 0 , ..., q n-1 e os coeficientes de p .

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

É exatamente isso que é calculado na expressão sum[p!!i*p%(n-i)|i<-[1..n]]/head p, com head po coeficiente inicial p 0 . O coeficiente inicial q 0 = 1 / p 0 é tratado aritmeticamente na mesma expressão usando 0^ncomo um indicador para n==0.


3

J, 12 bytes

1 :'(1%u)t.'

Usa o advérbio t.que recebe um polinômio pna forma de um verbo no LHS e um número inteiro não negativo kno RHS e calcula o coeficiente kth da série Taylor de pem x = 0. Para obter a série de potências, pé recíproco antes de aplicá-la.

Experimente online!


2

Bordo, 58 26 bytes

Esta é uma função sem nome que aceita um polinômio in xe um número inteiro N.

EDIT: Acabei de notar que existe um builtin:

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

1

MATL , 19 bytes

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

Tradução da ótima resposta do @ flawr no Matlab .

Experimente online!

Como funciona

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 bytes

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

Porto da resposta Haskell do @ xnor. Inicialmente, tentei uma versão iterativa, mas era de 98 bytes, mas será muito mais rápido para N grande, pois estou efetivamente memorizando as chamadas recursivas:

(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+1são necessários termos salvos na matriz r. Inicialmente, são zeros que permitem reduzir toda a matriz de ruma só vez, pois os zeros não afetam o resultado. O último coeficiente calculado é o resultado final.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.