フィボナッチ数をたくさん出力すると放物線が現れる件
前回、pythonを使ってフィボナッチ数の第n項を返す関数をいくつかのバリエーションで実装した。
ところで、pythonではメモリが許す限りいくらでも大きな整数を扱うことができる。
調子に乗って、前回作った関数でフィボナッチ数を(各項の間にスペースを一個入れながら)、大量に出力してみていると、面白いことに気づいた。
放物線が現れるのである。
おお。
なんだこれは。
若干の感動を覚えつつ、少し考えてみると理由が分かった。
おおざっぱに説明してみよう。
フィボナッチ数列をとかく。
フィボナッチ数列の漸化式を解くと、一般項は、
である。ここでは黄金比である。
であり、したがってであるから、
ゆえに、nが十分大きいとき、
と評価される。
つまり、nが十分大きくなると、その挙動は「指数関数的」になる。
いま、各項は10進数でコマンドラインに表示しているので、各項の桁数はである。
先の評価も考慮すれば、第n項の桁数は
で評価されることが分かる。
つまり、フィボナッチ数の各項の桁数はおおよそ「線形」に増えていく。
ところで、上のコマンドラインに放物線が現れたのは、スペースがある適当な間隔で表示されたことが直接の原因である。
ここで、「適当な間隔」というのは、ここまでで議論してきたフィボナッチ数の各項の桁数であり、それはおおむね線形に増加しているのだった。
そこで、長さがの文字列を繰り返し表示すれば(そして、各文字列のあいだに適当な文字を挟めば)、別にフィボナッチ数列でなくても、同じように放物線が現れそうだと予想がつくだろう。
以下のコードで試してみると、確かにそうなっている。
for i in range(200): print(" "*i, end="*")
では、なぜこのような状況で放物線が現れるのか。
次の図で説明する。
コマンドライン下に向かってx軸を、右に向かってy軸をとる。
コマンドラインの左端がで、右端がである。
各*はxが整数である点に現れていると考え、その座標を、とする。
上で定義した状況は、図に示した赤色の線の長さの合計が線形に増加する、という状況だから、次のように言い換えられる。
数列は、等差数列である
これは、Cという定数を抜きにして考えることで、すぐに次のように言い換えられる。
数列の階差数列は、等差数列である
したがって、
が分かり、これにより、放物線が現れることが説明される。
(ほんとうは、離散的な点集合のみで、線は一つも現れてないですけどね)。
あまり、正確には議論していないですが、今日のところはTeXを初めて書いた面倒くささなどもあり、これで
ということで許してください。