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