ウサギとフィボナッチ
数の列と書いて数列と言います。「1 2 3 4 5 6 7 8 9 10」も数列ですし、「1 2 4 8 16 32 64 128 256 512」も数列です。難しいように思いますが、どんな数字でも一定方向に向かって並んでいれば数列です。
子供の頃に数字の並び方のルールを当てたりして遊んだことがあるかもしれません。冒頭の2例は簡単な規則で作られていて、最初の数列は単に前の数字に1を加えたもので、後の数列は前の数字を2倍にしたものですね。
前の数字に同じ値を加えて次の数字にする数列を等差数列、前の数字に同じ値を掛けて次の数字にする数列を等比数列といいます。
よほど複雑な規則でない限り、ほとんどの数列はrpn式で簡単に作れます。ちなみに冒頭の2つの数列は以下のように1行で生成できます。DOSプロンプトを起動してからrpn式を入力してください。
1 2 3 4 5 6 7 8 9 10
>rpn @n 2 * #n @n -b 1 #n @n -r 9 | rpn 1 -c fold
1 2 4 8 16 32 64 128 256 512
フィボナッチ数列
自然界には面白い数列が多々あります。そのような数列の1つにフィボナッチ数列があります。この数列は、0と1から始まり前の二つの数字を加えた数を次に並べていくとできる数列です。
フィボナッチは中世のイタリアの数学者で、13世紀にヨーロッパにローマ数字とは異なるアラビア式数体系(0から9の数記号と位取り)を紹介した人としても有名です。
一見簡単な規則で作られるフィボナッチ数列なのですが、この数列に関して面白い問題が提起されています。
ここに親ウサギのつがい(番い)がいます。親ウサギのつがいは、1つがいの子ウサギを毎月1回出産するものとします。1つがいの子ウサギは親になるのに1ヶ月が必要ですが、それ以降は1つがいの子ウサギを毎月生み続けます。数ヵ月後のウサギのつがいの合計はいくつでしょうか。ただし、ウサギは永久に死なないものとします。
有名なウサギの子孫に関する問題です。19世紀にルカという人が作りましたが、この問題はフィボナッチの数列を再発見したことを意味します。ウサギのつがい数を計算するのは、簡単そうに思えて意外に複雑です。実際に紙に書きながら確かめてみないと、つがいの総数は分からないものです。
苦労して計算したウサギ一族のつがい数を1ヶ月毎に数列にしてならべると、「1 1 2 3 5 8 13 21 …」となるはずです。これは先のフィボナッチ数列の規則に従って作られる数列と同じです。ある意味驚きですよね。
フィボナッチ数列の作り方(その1)
さて、フィボナッチ数列は上記の生成規則に従って作っていけばいいのですが、図形を使って生成する方法もあります。興味深いので紹介しておきます。
(1) □□□□□□□□□□□□□
□ □□□□□□□□□□□□□
| (3) □□□□□□□□□□□□□
v □□ □□□□□□□□□□□□□
(2) □□ □□□□□□□□□□□□□
■□ ----> ■■ □□□□□□□□□□□□□
□□□□□□□□□□□□□
| □□□□□□□□□□□□□
| □□□□□□□□□□□□□
v □□□□□□□□□□□□□
(4) □□□□□□□□□□□□□
□□□■■ □□□□□□□□□□□□□
□□□■■ ■■■■■■■■■■■■■
□□□■■ ■■■■■■■■■■■■■
■■■■■■■■■■■■■
| ■■■■■■■■■■■■■
| ■■■■■■■■■■■■■
| ■■■■■■■■■■■■■
| ■■■■■■■■■■■■■
| ■■■■■■■■■■■■■
| ^
v |
(5) |
■■■■■ (6) ■■■■■□□□□□□□□
■■■■■ ■■■■■□□□□□□□□
■■■■■ ■■■■■□□□□□□□□
□□□□□ ■■■■■□□□□□□□□
□□□□□ -------> ■■■■■□□□□□□□□
□□□□□ ■■■■■□□□□□□□□
□□□□□ ■■■■■□□□□□□□□
□□□□□ ■■■■■□□□□□□□□
(1)から(7)までを順に見ていくと、(1)の□が(2)の■に変わって、(2)の□と■が全部■に変わっていくのが分かります。つまり、■は1つ前の□ということになります。それぞれの矩形の長い辺の数を数え上げると「1 2 3 5 8 13 21」になっていることが分かります。フィボナッチ数列と同じですね。
フィボナッチ数列の作り方(その2)
次は本格的にrpnを使って、フィボナッチ数列を生成してみましょう。rpnにはrオプションという繰り返し実行機能があります。このオプションを使って、数列を10項目まで生成してみましょう。
1
1
2
3
5
8
13
21
34
55
89
-rは10回の繰り返しですが、先頭の1を先に表示するので出力は11行になります。
rpnの引数に指定したrpn式を繰り返すのがrオプションですが、rpnプログラムをファイル化して使用することができません。つまり、「rpn <fibo.rpn -r 20」のようには記述できません。
増えるウサギのつがい
このrpn式でウサギのつがいがどれだけの速さで増えていくのかをグラフで確かめてみましょう。まずは10世代までグラフ化します。
>rpn 1 -c rownum <tmp | xyp -x,10 -y,100 -s1,20 -m
^y 100
|
-
|
|
-
| *
|
-
| *
|
- *
|
| * * x
|o * * * * * 10
+--|---|---|---|---|---|---|---|---|--->
横軸が世代、縦軸がつがい数です。10世代目には大体60つがいくらいに増えています。120羽のウサギを想像してみると…立派な生き物の集団ですね。ちょっとした迫力があります。次はそれから10世代が過ぎた20世代までをグラフ化してみましょう。
>rpn 1 -c rownum <tmp | xyp -x,20 -y,10000 -s10,2000 -m
^y 10000
|
-
|
| *
-
|
|
- *
|
|
- *
| *
| * x
|* * * * * * * * * * * * * * * 20
+------------------|------------------->
グラフを見て分かるように後半急激に増えています。縦軸もメモリが100つがいから10000つがいに変わっています。初めはたったの1つがいだったウサギが20世代目には8000つがい近くにまで増えたわけです。16000羽のウサギのいる風景は大繁殖地そのものですね。
実際はウサギの寿命は8年くらいで、ウサギが出産可能になるのは生まれてから約5ヶ月です。妊娠期間は1ヶ月強なので、年に5回くらいは妊娠できるようです。フィボナッチ数列じゃありませんが、無計画に飼っていると確実に大繁殖します。
自然界に潜むフィボナッチ数列
フィボナッチ数列はいろんな場所に潜んでいます。花びらの数は3枚、5枚、8枚、13枚が多い…。細胞分裂の数、枝分かれの数はフィボナッチ数列に従うなどです。
\/ / \/ \ \/ ・・・ 8
\/ \ \/ ・・・・・ 5
\ _\/ ・・・・・・・ 3
\ / ・・・・・・・・・ 2
| ・・・・・・・・・・・・・・ 1
____|_____
そして、フィボナッチ数列にはもう1つ興味深い数値が隠れています。それは黄金比率です。
黄金比率とは数値にして約1対1.6となるもので、古代から言い伝えられている黄金の比率です。何故か、この比率に従うと人が美しいと思う形が出来上がるのです。そして、一見関連性がないと思えるフィボナッチ数列との間にも不思議な関連性があるのです。
黄金比率との関係については、実践コーナーの数学アラカルトに黄金比率とフィボナッチ数列として詳しくあります。興味のある人は閲覧ください。
rpnプログラムを実行するには、rpn試用版かrpn標準版が必要です(バージョンの違いはこちら)。
foldはユーティリティーパッケージに同梱されています。rownumはカンタン分析パッケージに同梱されています。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。