2進法のフィボナッチ数列

以前,中学生の女の子が「フィボナッチ数列は2進数でも美しいのか」というテーマで自由研究をし日本数学検定協会賞というのを受賞したというニュースがありましたね.そういうのを調べようと思うことが素晴らしいですね.フィボナッチ数列というのは,直前の2つの数の和になる数列で,0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946 のようなものです.たとえば,13がありますがその前には5と8があって5+8は13です.その次は8+13=21となります.他にも何人かがフィボナッチ数列の2進数表現にチャレンジしてますが,普通にコンピュータの言語でフィボナッチ数列を計算しそれを2進数の表現に変換して表示するという作られ方です.

ビスケットは2進法の計算はとても簡単にできるため,そんな回りくどいことはせずに,直接2進法のままでフィボナッチ数列を計算するプログラムをつくれないか挑戦してきました.

その1.
去年つくったのがこれです.

最初のメガネは2進法の計算そのもので「青い丸が2つ重なったら,1つが上にずれる」というものです.これで青い丸で2進法の足し算ができます.次の2つは,矢印命令のメガネで,「矢印が青い丸と重なったら,青い丸はそのままで右に2つ青い丸を増やす」「矢印がなにも重なってなければ消える」というものです.これらに対して,

というメガネは,赤い三角をタッチするとその上にたくさんの矢印を置き,赤い三角は右にずれるというものです.これで

からスタートして,赤い三角をタッチしてゆけばフィボナッチ数列を計算してゆきます.動きを見た方がわかりやすいので動画を見てください.ポイントは2進法の計算の桁上がりが全部終わってから,赤い三角をタッチして次の計算に進むことです.

ちょっと解説ですが,上の2つ目のメガネ,「矢印と青い丸で青い丸はそのままで隣に2つ青い丸ができる」というものは,ある数があったら隣ともう1つ隣にその数をコピーします.同じ場所に数を重ねると1つ目のメガネによって自動的に足されるので.その結果前の2つの数を足したものになります.

割とフィボナッチ数列の定義通りのプログラムですが,桁上がりが終わるのを待たずにコピーすると計算を間違えることがあるのが難点です.

その2
実はこちらが本題ですが,色々といじっているうちにほぼ偶然,フィボナッチ数列がつくれてしまいました.

基本的には

だけで,赤い丸の重なりの数がフィボナッチ数列になっています.丸の重なりでは数がわからないので,赤い丸で2進法の足し算をつくります.

これでこんな感じの動きになります.

一応,左から1,1,2,3,5,8,13と並んでいるのでフィボナッチ数列になってます.これがどうしてフィボナッチ数列になるのかを調べてみます.

赤丸をなしにして,

このようなメガネ「1つの絵が2つになる」を作ると,絵が1,2,4,8,と増えてゆきます.この増え方はパスカルの三角形といって

のようになります.1つが2つになる.それぞれがまた2つになりますが,真ん中には同じ場所に2つの絵が重なります.その次は中に3つの絵が重なっています.このようにして11ステップ目では252個の絵が同じ場所に重なることになるのです.ビスケットでは絵の数を1000個までに限定しているため,ここで合計1000を超えて,それ以上は増えなくなります.それで画面には,

と表示されているだけです.

このパスカルの三角形ですが,これをずらして並べます.

そして縦の数を足してゆくと,それがフィボナッチ数列になっているんですよね.そこで,この動きをそのままメガネにしたのが,

です.^の場所に赤丸が1つ,その隣に^^できます.これで赤丸の数がフィボナッチ数列になっていることが理解できるでしょうか.

ではあるんですが,ちょっと計算が進むと600とか1000とかの数の赤丸が重なるので,それを2進数に変換されるにはとてつもなく計算に時間がかかるのと,そもそもビスケットではステージ上の絵が1000を超えると,それ以上絵が増えなくなるというリミッターが働くので,これ以上の桁は計算できません.そんなに大きい桁の計算はできません.

そこで思いついたのがこれです,

計算の命令^にも2進法の計算をさせます.^が2つ重なると1つになって上にずれます.

次のように動きます.

動画で見た方が分かりやすいですね

必要なメガネはたった3つです.

こんなに簡単に作れるとは思っても見なかったですね.ビスケットはほんと奥が深いです.

シェアする

  • このエントリーをはてなブックマークに追加

フォローする