Excel VBA 数学教室ではアフィリエイトプログラムを利用して商品を紹介しています。

リュカ数列

リュカ数列

初項および第 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\]
VBA でリュカ数列生成マクロを定義して最初の 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

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