Calcola i coefficienti della serie di potenza


24

Dato un polinomio p(x)con coefficienti integrali e un termine costante di p(0) = 1 or -1, e un numero intero non negativo N, restituisce l' Nennesimo coefficiente del seris di potenza (a volte chiamato "serie di Taylor") di f(x) = 1/p(x)sviluppato a x0 = 0, cioè, il coefficiente del monomio di grado N.

Le condizioni indicate assicurano l'esistenza delle serie di potenze e che i suoi coefficienti siano numeri interi.

Dettagli

Come sempre il polinomio può essere accettato in qualsiasi formato conveniente, ad esempio un elenco di coefficienti, ad esempio p(x) = x^3-2x+5potrebbe essere rappresentato come [1,0,-2,5].

Il powerseries di una funzione fsviluppata da 0è dato da

e il Ncoefficiente -th (il coefficiente di x^N) è dato da

dove indica la nderivata -th dif

Esempi

  • Il polinomio p(x) = 1-xrisulta nelle serie geometriche, f(x) = 1 + x + x^2 + ...quindi l'output dovrebbe essere 1per tutti N.

  • p(x) = (1-x)^2 = x^2 - 2x + 1risulta nella derivata della serie geometrica f(x) = 1 + 2x + 3x^2 + 4x^3 + ..., quindi l'output per Nè N+1.

  • p(x) = 1 - x - x^2 risulta nella funzione generatrice della sequenza di Fibonacci f(x) = 1 + x + 2x^2 + 3x^3 + 5x^4 + 8x^5 + 13x^6 + ...

  • p(x) = 1 - x^2determina la funzione generatrice di 1,0,1,0,...ief(x) = 1 + x^2 + x^4 + x^6 + ...

  • p(x) = (1 - x)^3 = 1 -3x + 3x^2 - x^3determina la funzione generatrice dei numeri triangolari, il f(x) = 1 + 3x + 6x^6 + 10x^3 + 15x^4 + 21x^5 + ...che significa che il Ncoefficiente -th è il coefficiente binomiale(N+2, N)

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


Sarebbe accettabile prendere un polinomio come un elenco infinito di coefficienti serie di potenze come [1,-1,0,0,0,0,...]?
xnor

Sì, penso che questo sia un formato accettabile.
flawr

Bei esempi scelti!
Greg Martin

Sono contento che lo apprezzi, grazie =)
flawr

Risposte:


9

Mathematica, 24 23 byte

Salvato 1 byte grazie a Greg Martin

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

Funzione pura con due argomenti #e #2. Presuppone che il polinomio #2soddisfi PolynomialQ[#2,x]. Naturalmente c'è un built-in per questo:

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

1
Ben fatto battendo il built-in! Immagino che tu possa salvare un byte assumendo che #sia il numero intero Ned #2è il polinomio.
Greg Martin

6

Matlab, 81 79 75 byte

A differenza delle due precedenti risposte, questo non fa uso di calcoli simbolici. L'idea è che puoi calcolare iterativamente i coefficienti:

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)

Provalo online!

Spiegazione

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 byte

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

L'input viene preso dalle celle del foglio di calcolo A1 e B1 rispettivamente di un polinomio e di un numero intero e ogni riga viene inserita separatamente nella barra di input. L'output avviene tramite assegnazione alla variabile a.

Ecco una gif che mostra l'esecuzione:

Coefficienti di Taylor

L'uso dei builtin è molto più lungo, a 48 byte:

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

4

Haskell, 44 byte

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

Un calcolo diretto senza incorporamenti algebrici. Prende l'input come un elenco infinito di coefficienti delle serie di potenze, come p = [1,-2,3,0,0,0,0...](ie p = [1,-2,3] ++ repeat 0) per 1-2*x+x^2. Chiamalo come p%3, che dà -4.0.

L'idea è che se p è un polinomio e q = 1 / p è inverso, allora possiamo esprimere l'uguaglianza p · q = 1 termine per termine. Il coefficiente di x n in p · q è dato dalla convoluzione dei coefficienti in p e q :

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

Per mantenere p · q = 1 , quanto sopra deve essere uguale a zero per tutti n> 0 . Per qui, possiamo esprimere q n in modo ricorsivo in termini di q 0 , ..., q n-1 e i coefficienti di p .

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

Questo è esattamente ciò che viene calcolato nell'espressione sum[p!!i*p%(n-i)|i<-[1..n]]/head p, con head pil coefficiente iniziale p 0 . Il coefficiente iniziale q 0 = 1 / p 0 viene gestito aritmeticamente nella stessa espressione usando 0^ncome indicatore per n==0.


3

J, 12 byte

1 :'(1%u)t.'

Utilizza l'avverbio t.che assume un polinomio psotto forma di un verbo su LHS e un numero intero non negativo ksu RHS e calcola il coefficiente kth della serie di Taylor di pat x = 0. Per ottenere le serie di potenze, il reciproco di pviene preso prima di applicarle.

Provalo online!


2

Acero, 58 26 byte

Questa è una funzione senza nome che accetta un polinomio in xe un numero intero N.

EDIT: ho appena notato che c'è un builtin:

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

1

MATL , 19 byte

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

Traduzione dell'ottima risposta di Matlab a @ flawr .

Provalo online!

Come funziona

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 byte

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

La risposta di Port of @ xnor's Haskell. Inizialmente ho provato una versione iterativa ma si è rivelata di 98 byte, tuttavia sarà molto più veloce per N di grandi dimensioni, poiché sto effettivamente memorizzando le chiamate ricorsive:

(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+1sono richiesti termini, che vengono salvati nell'array r. Inizialmente sono gli zeri che consentono di ridurre contemporaneamente l'intero array r, poiché gli zeri non influiranno sul risultato. L'ultimo coefficiente calcolato è il risultato finale.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.