数学の具体的な計算にPythonを使って、数学もPythonも同時に学んでしまいましょう。
本記事は、以前の記事
で学んだ内容の(数学的にもPython的にも)発展編です。
今回はPython(SymPy)を使ってBernoulli多項式(ベルヌーイ多項式)を学ぼうと思います。
Bernoulli多項式(ベルヌーイ多項式)
数学では、有用な性質を持っていることから特別な名前がつけられている多項式がたくさんあります。
今回はその中でもBernoulli多項式と呼ばれるものを取り上げたいと思います。
Bernoulli多項式は、スイスの数学者 Jacob Bernoulli(1654 – 1705)にちなんだ多項式です。
以下で具体的にみていくように、二項係数とBernoulli数(ベルヌーイ数)を組み合わせた多項式で、
整数の冪乗和とも深く関係しています。
例えば、高校の数学でも出てくる、自然数 から までの和
は、まだ子供だった J. C. F. Gauss(1777 - 1855)が から の場合について、
その答えを即座に求めて先生を驚かせたという逸話で彩られている有名な公式
で与えられます。では、自然数 から までの二乗の和
はどのような公式になったかというと(高校数学の公式を覚えているでしょうか?)
です(数学的帰納法などで示すことができます)。
さて、これらの公式で右辺を の多項式だと思うことにしましょう。
この多項式は何らかの系統的な手続きで与えられるでしょうか?
によって関係付けられます。さらに言えば
という関係が成り立ち、積分の区間と和の性質により、上の公式が導かれることがわかります。
以下では、Bernoulli多項式 がどのように与えられるのか、
冪乗和との関係がどのようにして導かれるのか、詳しく見ていくことにしましょう。
Pythonで具体的な計算を入力してその結果をみながら読み進めてもらうことで、
理解をより深めてもらうための一助になればと思います。
定義
Bernoulli多項式の定義式は
です。ここで は二項係数
そして はBernoulli数です。
冒頭にも述べましたが、本記事は以前の記事
の発展編です。Bernoulli数に関してはそこで取り上げているので、
あわせて読んでいただけたらと思います。
定義式から具体的にいくつかBernoulli多項式を求めてみます:
import sympy as sp sp.init_printing() k,n=sp.symbols('k,n',integer=True) sp.var('x') def B(n,x): return sp.summation(sp.binomial(n,k)*sp.bernoulli(n-k)*x**k,(k,0,n)) B_list = [] for n in range(7): b = B(n,x) B_list.append(b) B_list
から
です。特に引数で とおくと定義式の和の初項のみが値を持って
より、Bernoulli数を与えます:
Ber_list = [] for n in range(15): ber = B(n,0) Ber_list.append(ber) Ber_list
性質
Bernoulli多項式の特筆すべき性質は(既に述べたように)
となる点です。
あるいは、この性質が成り立つような多項式としてBernoulli多項式が定められる、ともいえます。
この性質が本当に成り立っているのか、具体的に計算して確認してみましょう:
B1int_list = [] for k in range(7): b1int = sp.integrate(B_list[1], (x, k, k+1) ) B1int_list.append(b1int) B1int_list
より
B3int_list = [] for k in range(7): b3int = sp.integrate(B_list[3], (x, k, k+1) ) B3int_list.append(b3int) B3int_list
より
また
B5int_list = [] for k in range(7): b5int = sp.integrate(B_list[5], (x, k, k+1) ) B5int_list.append(b5int) B5int_list
より
などと、確かに成り立っていることがわかります。
よって
であることがわかります。実際
Bint_list = [] N=sp.symbols('N',integer=True) for n in range(7): bint = sp.factor(sp.integrate(B_list[n], (x, 1, N+1) )) Bint_list.append(bint) Bint_list
により
といった公式を得ることができ、本記事の冒頭に述べた公式を正しく与えています。
母関数
以上、具体的な計算から、Bernoulli多項式に関する公式が成り立つことを確認してみました。
しかしながら、それは数学的な証明ではないので、納得がいかないという人もいるかもしれません。
そこで、最後にBernoulli多項式の母関数
から、その性質を導いておこうと思います。まず、Bernoulli数 は
で与えられます(むしろこの式でBernoulli数を定義しているといえます)。
母関数を2つの関数の積とみなし、それぞれをTaylor展開することによって
を得ます。実際
sp.var('t') def G(t): return t*sp.exp(x*t)/(sp.exp(t)-1) Gtayl_list = [] for n in range(7): g = sp.factorial(n-1)*sp.series(G(t), t, 0, n).coeff(t, n-1) Gtayl_list.append(g) Gtayl_list
により、確かにBernoulli多項式の母関数になっていることが確かめられます。
母関数を積分することによって
より、公式
を示すことができます。
また母関数の引数を としたものと引き算して
により公式
を得ます。実際
Bsub_list = [] for n in range(7): s = sp.factor(B_list[n].subs(x,x+1)-B_list[n]) Bsub_list.append(s) Bsub_list
により、確かに公式が成り立っています。
Bernoulli多項式は、その母関数も含めて、
とてもよくできた多項式だなという感動を共有できたら幸いです。
本記事で特に断りなく利用したSymPyの使い方については過去記事
が参考になるかと思います。あわせて読んでみてください。