前回までの記事で母関数の作り方をいくつか紹介しました。ただ母関数を展開すると多項式になりその計算は手計算では限度があります。そこでプログラミングの出番なのですが特にSagemathはこの分野では強力なツールとなります。
Sagemathで母関数からべき級数を求める
PowerSeriesRingを使って、基本形の$f=\large \frac{1}{1-x}$を$x^{10}$まで定義して表示します。default_precで何項まで展開するかを指定しています。
x = PowerSeriesRing(QQ, 'x', default_prec=10+1).gen()
f = ((1-x)^(-1))
show(f)
同様に母関数$f=\large \frac{1}{(1-x)^2}$を多項式及びlist methodを使って数列を表示します。
f = ((1-x)^(-2))
show(f)
f.list()
Sagemathで例題の母関数からリストを表示
要は母関数を定義すれば数列(及び多項式)は計算してくれるということです。それでは(その1)での例題1~12の数列を一気に表示してみましょう。
print("例題 1:",(4*(1-x)^(-1)).list())
print("例題 2:",(2*(1-x)^(-2)).list())
print("例題 3:",(2*x^3*(1-x)^(-2)).list())
print("例題 4:",(1*(1-5*x)^(-1)).list())
print("例題 5:",(1*(1+3*x)^(-1)).list())
print("例題 6:",(1*(1-5*x^2)^(-1)).list())
print("例題 7:",(x*(1-x^3)^(-2)).list())
print("例題 8:",(4*x*(1-x)^(-1)).list())
print("例題 9:",(1*(1-4*x)^(-1)).list())
print("例題 10:",(x*(1+x)^(-1)).list())
print("例題 11:",(3*x*(1+x)^(-2)).list())
print("例題 12:",((1+x+x^2)*(1-x)^(-2)).list())
# 例題 1: [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
# 例題 2: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]
# 例題 3: [0, 0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]
# 例題 4: [1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625]
# 例題 5: [1, -3, 9, -27, 81, -243, 729, -2187, 6561, -19683, 59049]
# 例題 6: [1, 0, 5, 0, 25, 0, 125, 0, 625, 0, 3125]
# 例題 7: [0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4]
# 例題 8: [0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
# 例題 9: [1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, 262144, 1048576]
# 例題 10: [0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1]
# 例題 11: [0, 3, -6, 9, -12, 15, -18, 21, -24, 27, -30, 33]
# 例題 12: [1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
フィボナッチ数列や三角数
フィボナッチ数列や三角数も(その2)で母関数が求まっているので全く同様に数列が求まります。
print("フィボナッチ数列:",(x*(1-x-x^2)^(-1)).list())
print("三角数:",(1*(1-x)^(-3)).list())
#フィボナッチ数列: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
# 三角数: [1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66]
今回は$x^{10}$までの係数を表示しましたが、default_precの値を増やせばより長い数列を扱うことが出来ます。さらに関数は多項式の形で保持されているので、その後の色々な演算を行うことが可能です。
次回の記事では例題を示しながらそのような応用例を紹介したいと思います。
(開発環境:CoCalc)