昨日ご紹介した2進法でフィボナッチ数列を作り出すプログラムですが,生成される数列は画面の大きさに制限されてしまいます.そこで,画面をスクロールさせて無限に生成させることはできないか考えてみました.
まずは一番基本のメガネ
![](http://devroom.viscuit.com/wp-content/uploads/2019/03/bd38e1df946913c9e7cae1d77074e0f5.png)
これをスクロールさせるためにはメガネの右側を1つ左にずらすようにします.つまり,
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/30df4f008618e9970f877046a823f4c0.png)
のようにします.元のメガネは左の^と赤丸が同じ位置にあるのに対して,新しいメガネは^はそのままの位置でその左に青丸,右にも^が生成されます.
同じように丸が重なると上に上がるは
![](http://devroom.viscuit.com/wp-content/uploads/2019/03/de8b1218cce7dd2994e180abaf1eb4eb.png)
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/ec97756962cc4d7bea8746d1b360afc8.png)
のように斜め上に上がるように.^が重なった場合も
![](http://devroom.viscuit.com/wp-content/uploads/2019/03/c7e8f44548a77b52883fac2f7e17f28c.png)
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/65028685fd4f0eea1c05c779133b80e1.png)
のように斜めに上がります.さらに,今まで静止していた丸も
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/a18c4a9ad8c118221adc069707c5cc42.png)
のように横に動くようにします.これでいちおうスクロールして生成するのがつくれるのですが.
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/962fadb26fc3a0d372ce8256f03bf2fe.png)
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/86f4f9e680dee8599f6d0f3b762cc96d.png)
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/301c1b76fb5bb809b1016647f47f371d.png)
のように,左側に数列がスクロールして生成されてゆきます.
しかし,同じように右のほうにも^が生成されて広がってゆくみたいです.これだとやはり画面のサイズで無限に生成というのは難しいですね.
そこで,^を生成するタイミングを1つずれるようにします.つまり,あたらしく_の絵をかいてこのようにします.
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/66551b64d956abf722a2b33237f8d8f4.png)
最初は^から丸と^^が生成されるのではなく,丸と^_が生成されます.次に_は^に変わるわけですがそれはスクロールするので左にずれます.
これが生成される列をみてみると,
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/a73a279f080a60213ab5369924429693-1024x759.png)
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/317af1cfe43a08131d0c408f4c2c6cc6-1024x759.png)
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/8290aea95db634edcc3528767773809a-1024x757.png)
最初の_が横にずれて^になるのでここで^が2つ重なってます.それで,
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/ee3ee03cc3f060cbf5f5d4b5c22f8c46-1024x758.png)
_を生成するのをやめて斜め上に^が作られました.
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/668d68120dcbedaf0f9545d74cbc05fc-1024x768.png)
そこからさらに丸と_が作られて行きます.
この生成された列をみてみると,青丸が一度も重なったりしないことがわかります.実は青丸が重なったら斜め上にというメガネは必要なかったことになります.そこで必要なメガネはこの4つです.
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/66551b64d956abf722a2b33237f8d8f4-1.png)
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/8dd0ddd0208d9fbc722ace98228f7ea6.png)
生成される様子は動画でみてみましょう.
画面の縦は24マスあるので,2進法で24桁になります.24桁を超えた分は計算していませんが,この計算は上の桁が下の桁に影響しないので,下24桁だけを取り出したければ,単純に24を超えた分を無視しても問題ありません.
つまり,この先どれだけ計算してもたとえば,1万個目の数は下24桁に限定すればきちんと計算できていることになります.
この列にどういう性質があるでしょうか.ランダムのように見えますが,そんなことはなくて規則性があるはずです.
![](https://devroom.viscuit.com/wp-content/uploads/2019/03/3476e2eb7499500789ab4f24d02b214e-1024x761.png)
たとえば,1桁目(一番下)は110が繰り返しているようです.それは当然で,11と並んだらつぎは2になりますからこの桁は0です.01か10はそのまま1が残ります.2桁目は11が6回ごとに現れるようです.1桁目が3回ごとの繰り返しなのでその2倍です.その次が101101が12回ごとに繰り返されてます.どうも,2の倍数の3倍ごとの周期になっているようですね.
これが正しいフィボナッチ数列を計算しているのかどうか,ちょっと自身がないので,他の言語で計算して検算する必要がありそうです.