リュカ数列

リュカ数列

 初項および第 2 項をそれぞれ $L_0=2,\ L_1=1$ とし、第 3 項以降は
 
\[L_{n+2}=L_n+L_{n+1}\]
で定義される数列を リュカ数列 とよび、この数列の各項を リュカ数 (Lucas number) といいます。一般項は
 
\[L_n=\phi^n+(1-\phi)^n\]
で与えられます。ここに $\phi$ は黄金比とよばれる定数です:
 
\[\phi=\left(\frac{1+\sqrt{5}}{2}\right)^n\]
 リュカ数列生成マクロを定義して最初の 20 項を表示させてみましょう。

'[VBA] リュカ数列(Lucas number)生成マクロ

Sub Lucas()

  Dim i As Long
  Dim L(20) As Long

  '初項と第2項のリュカ数
  L(0) = 2
  L(1) = 1

  'L(2)~L(19)までのリュカ数列を生成
  For i = 2 To 19
    L(i) = L(i - 2) + L(i - 1)
  Next i

  'L(0)~L(19)までのリュカ数列を表示
  For i = 0 To 19
    Debug.Print L(i);
  Next i

End Sub
2 1 3 4 7 11 18 29 47 76
123 199 322 521 843 1364 2207 3571 5778 9349

 任意の $n$ を指定して $L_n$ を取得する関数も定義しておきます。
 一般項を使うと無理数の計算で丸め誤差が出る(しかもリターンが Double になってしまう)ので、きちんと漸化式を使って計算させます。

'[VBA] リュカ数を取得するユーザー定義関数

Function LucasNumber(n As Long) As Long

  Dim k As Long
  Dim L() As Long

  ReDim L(n)

  '初項と第2項のリュカ数
  L(0) = 2
  L(1) = 1

  'L(2)~L(n)までのリュカ数列を生成
  If n > 1 Then
    For k = 2 To n
      L(k) = L(k - 2) + L(k - 1)
    Next k
  End If

  LucasNumber = L(n)

End Function

 $L_{19}$ を取得して 9349 が返ることを確認しておきます。

'[VBA] リュカ数L_19を取得

Sub Test_LucasNumber()

  Debug.Print LucasNumber(19)

End Sub
9349

 $n$ が大きくなるにつれて、リュカ数列の隣り合う 2 項の比 $L_{n+1}/L_{n}$ は黄金比 $\phi=1.61803398…$ に近づきます。実際には、それほど大きな $n$ をとらなくても十分に良い精度の値が得られます。LucasNumber() 関数を使って $L_{40}/L_{39}$ を計算してみます。

'VBA リュカ数列を利用して黄金比の近似値を計算

Sub GoldenRatio()

  Debug.Print LucasNumber(40) / LucasNumber(39)

End Sub
1.61803398874989

 参考文献:Wikipedia

エクセルや数学に関するコメントをお寄せください