フィボナッチ数、リュカ数、そしてそれらを一般化した数列の基本的な性質と、コンピューターにおける計算方法について記述します。
今回は、フィボナッチ数と対で語られることの多いリュカ数 (Lucas numbers) を扱います。
さらに、初項
漸化式
で定義される数列に現れる数をリュカ数 (Lucas number) と呼ぶ。
リュカ数の定義は、フィボナッチ数の初項
なお、添字
となります。
また、リュカ数列が別の意味を持つ用語として定義されていることから、リュカ数 (Lucas numbers; 複数形) が上記の数列を表すようです。
cf.
Lucas sequence - Wikipedia
リュカ数の一般項を求めます。
証明方法はフィボナッチ数とほぼ同じのため省略します。
ただし、
となります。
比がほぼ
次に、初項を一般化してみます。
数列
で定義する。
この数列の一般項は、
ただし、
フィボナッチ数のときの解法と同様にして、
となることから得られる。
次に、添字
公式 2 は、任意の整数
とし、
2 次方程式
ここで、
ところで、フィボナッチ数やリュカ数では、
このような性質を持つ数列はどれだけあるのでしょうか。
任意の整数
で定義する。
このとき、任意の整数
また、任意の整数
したがって
また、
したがって
リュカ数をコンピューターで具体的に求める方法をいくつか挙げます。
内容は前回の
フィボナッチ数
とほぼ同様で、とくに新しい説明はありません。一般項から求める方法は省略します。
以下、
リュカ数を整数のまま計算するには、定義の漸化式を用いて順に求めるのが簡単です。
時間計算量は
空間計算量は、途中の値をキャッシュする場合は
任意の
C# では次のようなコードでリュカ数を作れます。
なお、
public static long[] CreateSeq(int nLast = 90)
{
var a = new long[nLast + 1];
a[0] = 2;
a[1] = 1;
for (int i = 2; i <= nLast; i++)
a[i] = a[i - 1] + a[i - 2];
return a;
}
また、再帰関数として実装する方法もありますが、
行列を利用すると、整数のままで、しかも高速に計算できます。
2 次正方行列
と表すことを考えると、定義の漸化式から
とすればよいです。したがって、
これで
任意の
値の桁が大きくなることを無視すれば (例えば、値を剰余群で考える場合)、
前回:
(1) フィボナッチ数
次回:
(3) 定数係数 3 項間漸化式