べき級数係数の計算


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]

機能のPOWERSERIES fで開発が0で与えられます

- N番目の係数(の係数x^N)は

ここでは、のn次の導関数を示します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 + ...ため、の出力はNですN+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^21,0,1,0,...ie の生成関数になりますf(x) = 1 + x^2 + x^4 + x^6 + ...

  • p(x) = (1 - x)^3 = 1 -3x + 3x^2 - x^3-th係数が二項係数であるf(x) = 1 + 3x + 6x^6 + 10x^3 + 15x^4 + 21x^5 + ...ことを意味する三角数の生成関数になりますN(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

はい、これは許容できる形式だと思います。
-flawr

良い例が選ばれました!
グレッグマーティン

感謝します、ありがとうございます=)
flawr

回答:


9

Mathematica、24 23バイト

Greg Martinのおかげで1バイト節約

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

2つの引数#とを持つ純粋な関数#2。多項式がを#2満たすと仮定しますPolynomialQ[#2,x]。もちろん、これにはビルトインがあります:

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

1
ビルトインを打ち負かしました!それ#が整数N#2あり、多項式であると仮定することで、バイトを節約できると思います。
グレッグマーティン

6

Matlab、81 79 75バイト

前の2つの答えとは異なり、これはシンボリック計算を使用しません。アイデアは、係数を繰り返し計算できるということです:

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 NP・Qは、の係数の畳み込みによって与えられるPQ

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

以下のためのp・q = 1で保持するために、上記マストは全てゼロに等しく、N> 0。ここでは、我々は表現することができ、Qをn個の面で再帰的にQ 0、...、Q N-1との係数のp

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 00^n、の指標としてを使用して同じ式で算術的に処理されn==0ます。


3

J、12バイト

1 :'(1%u)t.'

LHSでは動詞の形のt.多項式を、RHSではp非負の整数をとる副詞を使用し、atのテイラー級数のth係数をk計算します。べき級数を取得するために、逆数が適用される前に取得されます。kpx = 0p

オンラインでお試しください!


2

メープル、58 26バイト

これは、の多項式xと整数を受け入れる名前のない関数です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配列に保存される用語が必要ですrrゼロは結果に影響を与えないため、配列全体を一度に減らすことができる最初はゼロです。最後に計算された係数が最終結果です。


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