リュカ数列
初項および第 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
エクセルや数学に関するコメントをお寄せください