(Python)二項定理・パスカルの三角形をprintする
前書き
現在の日本の高校数学IIでは、教科書のはじめの方で「二項定理」を学びます。
数学的に興味深い性質があります。
ここでは、その応用やPythonによる実装について考えてみます。
from datetime import datetime as dt
print("実行環境")
print("Google Colaboratory Ver:" + str(dt.now().strftime("%Y/%m/%d")))
!python --version
実行環境
Google Colaboratory Ver:2021/04/17
Python 3.7.10
-
Reactによる実装(パスカルの三角形のみ)については[(React)パスカルの三角形をブラウザ上で描画]
-
なでしこによる実装(左よりの三角形)は[(なでしこ)パスカルの三角形を表示。]
-
セルオートマトンの仲間であるライフゲームについては[(Python)複数種のライフゲームをmatplotlib+gif出力]
内容
二項定理
$(a+b)^2 = a^2 + 2ab + b^2$
$(a+b)^3 = a^3 + 3a^2b + 3ab^2 + b^2$
のような多項式の展開(展開式)について、一般的に
$(a+b)^n = {}_n\mathrm{C}_ra^n + _{n}\mathrm{C}_1a^{n+1}b … _{n}\mathrm{C}_nb^{n}$
が成り立ちます。 これを「二項定理」といいます。
パスカルの三角形
二項定理に関連して、「パスカルの三角形」があります。
パスカルの三角形とは、多項式を展開した時の係数が、次の多項式の係数と以下のような関係にあることを言います。
まずは多項式の係数を描いてみましょう。
from math import factorial as fc
# fc(2) = 2!
nmax = 9 # (a+b)^nmax
for n in range(nmax+1):
b = [r for r in range(n+1)]
# nCr => fc(n)/(fc(n-r)*fc(r)
a = [str(int(fc(n)/(fc(n-r)*fc(r)))) for r in b]
print("n = "+str(n), " ".join(a).center(nmax*4))
# 4 = magic number
n = 0 1
n = 1 1 1
n = 2 1 2 1
n = 3 1 3 3 1
n = 4 1 4 6 4 1
n = 5 1 5 10 10 5 1
n = 6 1 6 15 20 15 6 1
n = 7 1 7 21 35 35 21 7 1
n = 8 1 8 28 56 70 56 28 8 1
n = 9 1 9 36 84 126 126 84 36 9 1
一つの列は一つの次数を示しています。
ある次数(n)に出た係数を足したものが、次の次数(n+1)の係数に表れています。
そして、それぞれの係数を並べると三角形が現れます。
このような三角形を「パスカルの三角形」といいます。
シェルピンスキーの三角形
パスカルの三角形の奇数の部分を塗りつぶすと、「シェルピンスキーの三角形」というものになります。
上のコードについて、奇数なら■、偶数なら□にするようにしてみましょう。
from math import factorial as fc
# fc(2) = 2!
nmax = 30 # (a+b)^nmax
for n in range(nmax+1):
b = [r for r in range(n+1)]
# nCr => fc(n)/(fc(n-r)*fc(r)
a = [str(int(fc(n)/(fc(n-r)*fc(r)))) for r in b]
'''-added---------------------------------------'''
a = [i.replace(str(i), "□")
if int(i)%2 == 0 else "■" for i in a]
'''---------------------------------------------'''
print("n = "+str(n), " ".join(a).center(nmax*3))
# 3 = magic number
n = 0 ■
n = 1 ■ ■
n = 2 ■ □ ■
n = 3 ■ ■ ■ ■
n = 4 ■ □ □ □ ■
n = 5 ■ ■ □ □ ■ ■
n = 6 ■ □ ■ □ ■ □ ■
n = 7 ■ ■ ■ ■ ■ ■ ■ ■
n = 8 ■ □ □ □ □ □ □ □ ■
n = 9 ■ ■ □ □ □ □ □ □ ■ ■
n = 10 ■ □ ■ □ □ □ □ □ ■ □ ■
n = 11 ■ ■ ■ ■ □ □ □ □ ■ ■ ■ ■
n = 12 ■ □ □ □ ■ □ □ □ ■ □ □ □ ■
n = 13 ■ ■ □ □ ■ ■ □ □ ■ ■ □ □ ■ ■
n = 14 ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■
n = 15 ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
n = 16 ■ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ■
n = 17 ■ ■ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ■ ■
n = 18 ■ □ ■ □ □ □ □ □ □ □ □ □ □ □ □ □ ■ □ ■
n = 19 ■ ■ ■ ■ □ □ □ □ □ □ □ □ □ □ □ □ ■ ■ ■ ■
n = 20 ■ □ □ □ ■ □ □ □ □ □ □ □ □ □ □ □ ■ □ □ □ ■
n = 21 ■ ■ □ □ ■ ■ □ □ □ □ □ □ □ □ □ □ ■ ■ □ □ ■ ■
n = 22 ■ □ ■ □ ■ □ ■ □ □ □ □ □ □ □ □ □ ■ □ ■ □ ■ □ ■
n = 23 ■ ■ ■ ■ ■ ■ ■ ■ □ □ □ □ □ □ □ □ ■ ■ ■ ■ ■ ■ ■ ■
n = 24 ■ □ □ □ □ □ □ □ ■ □ □ □ □ □ □ □ ■ □ □ □ □ □ □ □ ■
n = 25 ■ ■ □ □ □ □ □ □ ■ ■ □ □ □ □ □ □ ■ ■ □ □ □ □ □ □ ■ ■
n = 26 ■ □ ■ □ □ □ □ □ ■ □ ■ □ □ □ □ □ ■ □ ■ □ □ □ □ □ ■ □ ■
n = 27 ■ ■ ■ ■ □ □ □ □ ■ ■ ■ ■ □ □ □ □ ■ ■ ■ ■ □ □ □ □ ■ ■ ■ ■
n = 28 ■ □ □ □ ■ □ □ □ ■ □ □ □ ■ □ □ □ ■ □ □ □ ■ □ □ □ ■ □ □ □ ■
n = 29 ■ ■ □ □ ■ ■ □ □ ■ ■ □ □ ■ ■ □ □ ■ ■ □ □ ■ ■ □ □ ■ ■ □ □ ■ ■
n = 30 ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■
三角形の中に小さな三角形が表れています。
この繰り返し構造は「フラクタル」と呼ばれています。
シェルピンスキーの三角形もフラクタルの一種です。
また、1次元セルオートマトンでもあります。2次元セルオートマトンであるライフゲームについては[(Python)複数種のライフゲームをmatplotlib+gif出力]をご参照ください。