*** 1/89 ***

 きのう(・・・といってもほぼ47時間経過・・・)アップした記事のタイトルは、*** 4/3 ***
 4/3は「3分の4」ではなく、「4月3日」のこと・・・。

 そんなわけで、この記事のタイトルの1/89は「1月89日」のこと・・・なわけはありませんが・・・。
 本当は3月30日にアップしたかったのは、事実です。。

 1月に読んだ『黄金比はすべてを美しくするか?』の記事の中で、こんなことを書きました。

 フィボナッチ数列にも、実に驚くべき数字がある――一一番目の数89だ。1/89という数値を小数で表すと、0.01123595・・・となる。フィボナッチ数1,1,2,3,5,8,13,21・・・を次のような小数に書き直そう。

     0.01
     0.001
     0.0002
     0.00003
     0.000005
     0.0000008
     0.00000013
     0.000000021
     …

 要するに、一番目のフィボナッチ数については一の位を小数第二位に、二番目については小数第三位に動かすといった具合に、n番目のフィボナッチ数に対し、一の位が小数第(n+2)位になるようにするわけである。ここに並べた数を加えると、0.01123595・・・が得られ、これは1/89に等しい。(P168-169)


 なぜそうなのが分からないのに加え、だれがこの関係を見つけたのかも興味深いところ。
 どういうきっかけで、一つずらして足し合わせることを思いついたのでしょうか?
 さっぱり見当がつきませんが、Excelの有効桁数の限界を超えて、もう少し先までやってみたいです。。


 Excelの有効桁数は15桁。
 こちらのページを参考に、もう少し先までやってみました。

 まずは、Excelシートにフィボナッチ数を・・・というのは、簡単な話。
 セルB2・B3にそれぞれ1を入力し、B4には=SUM(B2:B3)、B5には=SUM(B3:B4)・・・と以下同文。
 セル式をコピペして桁数を確かめると、75行目(74番目)に16桁の数字が現われました。
 なので、15桁までで最大のフィボナッチ数は、74行目(73番目)の806515533049393。
 対象とすべきフィボナッチ数が集まったので、次は桁を動かす操作ですが、

  一番目のフィボナッチ数については一の位を小数第二位に、
  二番目については小数第三位に動かすといった具合に、
  n番目のフィボナッチ数に対し、一の位が小数第(n+2)位になるようにするわけである。


というのは、こういうことですね。
 下は10番目までのフィボナッチ数を並べたもので、A列の数字はフィボナッチ数の順番。
 1行目の数字は小数点以下の位を示します。


 まあ、これくらいなら手作業で出来ますが、桁数が増えるとさすがに・・・。
 そんなわけで、こんなマクロを作成。

   For i = 1 To 73
     fibo_n = Cells(1 + i, 2)
     fibo_n_l = Len(fn)
     For j = 1 To fn_l
     Cells(i + 1, i - j + 4) = Mid(fibo_n, fibo_n_l - j + 1, 1)
     Next j
    Next i


 実行して得られたのがこれ・・・。
 美しい・・・のでしょうか?

画像

 あとは足し算するだけですが、繰り上がりの処理を施す必要があります。
 下は、後半20数個のフィボナッチ数の桁を動かして表示したもので、76行目が各桁を足した結果。
 フィボナッチ数の桁数が多くなると、必然的にその和は2桁となり、繰上げ操作が必要です。
 77行目は76行目の1の位、78行目は10の位を繰り上げて(一つ左のセルに移して)表示させたもので、77行目と78行目を足して、二桁だったら繰上げ操作を行い・・・というのを繰り返し、各桁の和がすべて一桁になったら、それらを並べて終了・・・ということになります。

画像


  For i = 74 To 2 Step -1
    x = 0
   For j = 1 To 73
   x = x + Cells(j + 1, i + 2)
   Next j
   Cells(76, i + 2) = x   '各桁の和を76行目に
  Next i

  For k = 1 To 10  '10回も繰り返せば、各桁の和はすべて1桁になるだろう・・・という目論見
    y = 0
   For i = 74 To 2 Step -1
     x = Cells(72 + 4 * k, i + 2)
    Cells(73 + 4 * k, i + 2) = Right(x, 1)
   If x >= 10 Then
    Cells(74 + 4 * k, i + 1) = Left(x, 1)
   End If
     x = Cells(73 + 4 * k, i + 2) + Cells(74 + 4 * k, i + 2)
     Cells(76 + 4 * k, i + 2) = x
    If x >= 10 Then
    y = y + 1  '和が10以上になった桁の数を足す
   End If
  Next i
   If y = 0 Then
   GoTo 100  '和が10以上になった桁の数がゼロだったら、繰り返し終了
  End If
  Next k

100 MsgBox k


 メッセージボックスに現われた数字は「3」。
 各桁の和の1の位と10の位を一桁繰り上げたものを足し、和が二桁の桁が一つでもあったら、同様の操作を・・・というのを3回繰り返し、終了・・・で、下のような結果になりました。

画像

 この数字の羅列の中で、一番下の行の各セルをつなげるために・・・。

   fibo_n = "0.0"
   For i = 2 To 74
   fibo_n = fibo_n & Cells(76 + 4 * k, 3 + i)
   Next i

   MsgBox "0.0" & fibo_n


 で、結果は・・・。



 1/89 は 0.01123595505617977528089887640449438202247191・・・で、小数点第1位の0から最後の1までを循環節(長さは44)とする循環小数。
 上の結果を見ると、二巡目の011235955056179までは合っているので、うまくいっているようです。これ以下があわないのは、対象のフィボナッチ数が有限(73個)だからで、個数を増やせばそれだけ多くの桁数が一致するはず・・・。
 ただし、このマクロではかなり限界が見えています。そもそも、各桁の和が二桁までにとどまる保障はどこにもなく、実際、上の例では最大84と3桁間近に迫っていました。また、個数を増やすためには、シート上では表現できない16桁以上のフィボナッチ数を扱える必要があります。
 これらの問題を(ある程度)解決したうえで、エレガントなマクロを作ることが可能なのか・・・?
 気がむいたらちょっと考えてみます。

 それにしても・・・。

 1/89が、なぜそういう数字なのか。どういうきっかけで誰がこの関係を見つけたのか・・・。
 興味深すぎます。。

この記事へのコメント

この記事へのトラックバック