はじめに
ruby初心者です。プログラミングの練習のために二項係数の計算をやっていたら、結構遊べるテーマだと思ったのでメモ代わりに書き残しておきます。
パスカルの三角形とは
パスカルの三角形(パスカルのさんかくけい、英: Pascal's triangle)は、二項展開における係数を三角形状に並べたものである。
この三角形の作り方は単純なルールに基づいている。まず最上段に 1 を配置する。それより下の行はその位置の右上の数と左上の数の和を配置する。例えば、5段目の左から2番目には、左上の 1 と右上の 3 の合計である 4 が入る。このようにして数を並べると、上から n 段目、左から k 番目の数は、二項係数${}_ {n-1}C _{k-1}$に等しい。
Rubyで書いてみました
#!/usr/bin/ruby
arr = [[1]]
for l in 1..10
tmp = [1]
for m in 1..(arr[l-1].length - 1)
tmp.push(arr[l-1][m-1] + arr[l-1][m])
end
tmp.push(1)
arr.push(tmp)
end
arr.each do |row|
puts row.join("\t")
end
出力は次のようになります。左右対称のおもしろい数のパターンが見えると思います。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
1 10 45 120 210 252 210 120 45 10 1
パスカルの三角形に隠れるフラクタル
パスカルの三角形の各項を整数で割って、その余りを並べるとおもしろいパターンが見えてきます。先程のコードのarr.each
以降を次のように書き換えてその姿をご覧に入れましょう。
arr.each do |row|
row.map! do |elm|
elm % 4
end
puts row.join("\t")
end
1
1 1
1 2 1
1 3 3 1
1 0 2 0 1
1 1 2 2 1 1
1 2 3 0 3 2 1
1 3 1 3 3 1 3 1
1 0 0 0 2 0 0 0 1
1 1 0 0 2 2 0 0 1 1
1 2 1 0 2 0 2 0 1 2 1
自然数を4で割った余り「1」「2」「3」「0」の分布を得ることができました。ただ、分かりにくいですから1、2、3、0の代わりに絵文字で色を付け、さらに計算をすすめてもっと広い分布を見てみましょう。
#!/usr/bin/ruby
arr = [[1]]
for l in 1..50
tmp = [1]
for m in 1..(arr[l-1].length - 1)
tmp.push(arr[l-1][m-1] + arr[l-1][m])
end
tmp.push(1)
arr.push(tmp)
end
arr.each do |row|
row.map! do |elm|
elm = (elm % 4).to_s.gsub("0", "🍈").gsub("1", "🍎").gsub("2", "🍇").gsub("3", "🍊")
end
puts row.join("")
end
🍎
🍎🍎
🍎🍇🍎
🍎🍊🍊🍎
🍎🍈🍇🍈🍎
🍎🍎🍇🍇🍎🍎
🍎🍇🍊🍈🍊🍇🍎
🍎🍊🍎🍊🍊🍎🍊🍎
🍎🍈🍈🍈🍇🍈🍈🍈🍎
🍎🍎🍈🍈🍇🍇🍈🍈🍎🍎
🍎🍇🍎🍈🍇🍈🍇🍈🍎🍇🍎
🍎🍊🍊🍎🍇🍇🍇🍇🍎🍊🍊🍎
🍎🍈🍇🍈🍊🍈🍈🍈🍊🍈🍇🍈🍎
🍎🍎🍇🍇🍊🍊🍈🍈🍊🍊🍇🍇🍎🍎
🍎🍇🍊🍈🍎🍇🍊🍈🍊🍇🍎🍈🍊🍇🍎
🍎🍊🍎🍊🍎🍊🍎🍊🍊🍎🍊🍎🍊🍎🍊🍎
🍎🍈🍈🍈🍈🍈🍈🍈🍇🍈🍈🍈🍈🍈🍈🍈🍎
🍎🍎🍈🍈🍈🍈🍈🍈🍇🍇🍈🍈🍈🍈🍈🍈🍎🍎
🍎🍇🍎🍈🍈🍈🍈🍈🍇🍈🍇🍈🍈🍈🍈🍈🍎🍇🍎
🍎🍊🍊🍎🍈🍈🍈🍈🍇🍇🍇🍇🍈🍈🍈🍈🍎🍊🍊🍎
🍎🍈🍇🍈🍎🍈🍈🍈🍇🍈🍈🍈🍇🍈🍈🍈🍎🍈🍇🍈🍎
🍎🍎🍇🍇🍎🍎🍈🍈🍇🍇🍈🍈🍇🍇🍈🍈🍎🍎🍇🍇🍎🍎
🍎🍇🍊🍈🍊🍇🍎🍈🍇🍈🍇🍈🍇🍈🍇🍈🍎🍇🍊🍈🍊🍇🍎
🍎🍊🍎🍊🍊🍎🍊🍎🍇🍇🍇🍇🍇🍇🍇🍇🍎🍊🍎🍊🍊🍎🍊🍎
🍎🍈🍈🍈🍇🍈🍈🍈🍊🍈🍈🍈🍈🍈🍈🍈🍊🍈🍈🍈🍇🍈🍈🍈🍎
🍎🍎🍈🍈🍇🍇🍈🍈🍊🍊🍈🍈🍈🍈🍈🍈🍊🍊🍈🍈🍇🍇🍈🍈🍎🍎
🍎🍇🍎🍈🍇🍈🍇🍈🍊🍇🍊🍈🍈🍈🍈🍈🍊🍇🍊🍈🍇🍈🍇🍈🍎🍇🍎
🍎🍊🍊🍎🍇🍇🍇🍇🍊🍎🍎🍊🍈🍈🍈🍈🍊🍎🍎🍊🍇🍇🍇🍇🍎🍊🍊🍎
🍎🍈🍇🍈🍊🍈🍈🍈🍎🍈🍇🍈🍊🍈🍈🍈🍊🍈🍇🍈🍎🍈🍈🍈🍊🍈🍇🍈🍎
🍎🍎🍇🍇🍊🍊🍈🍈🍎🍎🍇🍇🍊🍊🍈🍈🍊🍊🍇🍇🍎🍎🍈🍈🍊🍊🍇🍇🍎🍎
🍎🍇🍊🍈🍎🍇🍊🍈🍎🍇🍊🍈🍎🍇🍊🍈🍊🍇🍎🍈🍊🍇🍎🍈🍊🍇🍎🍈🍊🍇🍎
🍎🍊🍎🍊🍎🍊🍎🍊🍎🍊🍎🍊🍎🍊🍎🍊🍊🍎🍊🍎🍊🍎🍊🍎🍊🍎🍊🍎🍊🍎🍊🍎
🍎🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍇🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍎
🍎🍎🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍇🍇🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍎🍎
🍎🍇🍎🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍇🍈🍇🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍎🍇🍎
🍎🍊🍊🍎🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍇🍇🍇🍇🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍎🍊🍊🍎
🍎🍈🍇🍈🍎🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍇🍈🍈🍈🍇🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍎🍈🍇🍈🍎
🍎🍎🍇🍇🍎🍎🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍇🍇🍈🍈🍇🍇🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍎🍎🍇🍇🍎🍎
🍎🍇🍊🍈🍊🍇🍎🍈🍈🍈🍈🍈🍈🍈🍈🍈🍇🍈🍇🍈🍇🍈🍇🍈🍈🍈🍈🍈🍈🍈🍈🍈🍎🍇🍊🍈🍊🍇🍎
🍎🍊🍎🍊🍊🍎🍊🍎🍈🍈🍈🍈🍈🍈🍈🍈🍇🍇🍇🍇🍇🍇🍇🍇🍈🍈🍈🍈🍈🍈🍈🍈🍎🍊🍎🍊🍊🍎🍊🍎
🍎🍈🍈🍈🍇🍈🍈🍈🍎🍈🍈🍈🍈🍈🍈🍈🍇🍈🍈🍈🍈🍈🍈🍈🍇🍈🍈🍈🍈🍈🍈🍈🍎🍈🍈🍈🍇🍈🍈🍈🍎
🍎🍎🍈🍈🍇🍇🍈🍈🍎🍎🍈🍈🍈🍈🍈🍈🍇🍇🍈🍈🍈🍈🍈🍈🍇🍇🍈🍈🍈🍈🍈🍈🍎🍎🍈🍈🍇🍇🍈🍈🍎🍎
🍎🍇🍎🍈🍇🍈🍇🍈🍎🍇🍎🍈🍈🍈🍈🍈🍇🍈🍇🍈🍈🍈🍈🍈🍇🍈🍇🍈🍈🍈🍈🍈🍎🍇🍎🍈🍇🍈🍇🍈🍎🍇🍎
🍎🍊🍊🍎🍇🍇🍇🍇🍎🍊🍊🍎🍈🍈🍈🍈🍇🍇🍇🍇🍈🍈🍈🍈🍇🍇🍇🍇🍈🍈🍈🍈🍎🍊🍊🍎🍇🍇🍇🍇🍎🍊🍊🍎
🍎🍈🍇🍈🍊🍈🍈🍈🍊🍈🍇🍈🍎🍈🍈🍈🍇🍈🍈🍈🍇🍈🍈🍈🍇🍈🍈🍈🍇🍈🍈🍈🍎🍈🍇🍈🍊🍈🍈🍈🍊🍈🍇🍈🍎
🍎🍎🍇🍇🍊🍊🍈🍈🍊🍊🍇🍇🍎🍎🍈🍈🍇🍇🍈🍈🍇🍇🍈🍈🍇🍇🍈🍈🍇🍇🍈🍈🍎🍎🍇🍇🍊🍊🍈🍈🍊🍊🍇🍇🍎🍎
🍎🍇🍊🍈🍎🍇🍊🍈🍊🍇🍎🍈🍊🍇🍎🍈🍇🍈🍇🍈🍇🍈🍇🍈🍇🍈🍇🍈🍇🍈🍇🍈🍎🍇🍊🍈🍎🍇🍊🍈🍊🍇🍎🍈🍊🍇🍎
🍎🍊🍎🍊🍎🍊🍎🍊🍊🍎🍊🍎🍊🍎🍊🍎🍇🍇🍇🍇🍇🍇🍇🍇🍇🍇🍇🍇🍇🍇🍇🍇🍎🍊🍎🍊🍎🍊🍎🍊🍊🍎🍊🍎🍊🍎🍊🍎
🍎🍈🍈🍈🍈🍈🍈🍈🍇🍈🍈🍈🍈🍈🍈🍈🍊🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍊🍈🍈🍈🍈🍈🍈🍈🍇🍈🍈🍈🍈🍈🍈🍈🍎
🍎🍎🍈🍈🍈🍈🍈🍈🍇🍇🍈🍈🍈🍈🍈🍈🍊🍊🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍊🍊🍈🍈🍈🍈🍈🍈🍇🍇🍈🍈🍈🍈🍈🍈🍎🍎
🍎🍇🍎🍈🍈🍈🍈🍈🍇🍈🍇🍈🍈🍈🍈🍈🍊🍇🍊🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍈🍊🍇🍊🍈🍈🍈🍈🍈🍇🍈🍇🍈🍈🍈🍈🍈🍎🍇🍎
(画面幅によってはきれいに表示されないかも…)
このように部分が全体に等しい(類似している)ような性質を持った図形のことを「フラクタル図形」といいます。日本語では「自己相似形」といいますが、上の図形をよく観察すると互いに相似なパターンが大きさを変え何度も出現していることがわかります。
今回はパスカルの三角形を4で割ったときの余りで考えましたが、他の数でやってみてもおもしろいパターンを得ることができます。