home about terms twitter

(Python)二項定理・パスカルの三角形をprintする

date: 2021-04-17 | mod: 2021-05-29

前書き

現在の日本の高校数学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

内容

二項定理

$(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出力]をご参照ください。