この連載について
フィボナッチ数、リュカ数、そしてそれらを一般化した数列の基本的な性質と、コンピューターにおける計算方法について記述します。
-
フィボナッチ数
-
リュカ数
-
定数係数 3 項間漸化式
(本稿)
-
ほとんど整数 (おまけ)
本文
今回は、フィボナッチ数やリュカ数をさらに一般化し、任意の定数係数 3 項間漸化式により定められる数列について考えます。
漸化式と一般項
定数係数 3 項間漸化式により定められる数列の一般項を求めます。
証明の方針は前回までとほぼ同じです。ただし、の場合に注意します。
数列を漸化式
で定義する。は実数とし、とする。
この数列の一般項は、2 次方程式 の 2 解について、
の場合、
(重解) の場合、
なお、ii の式は i の式に含まれる。
ある実数に対して、数列 を考える。
元の漸化式においてを消去して、
を 2 次方程式 の 2 解とすると、 を満たす。
そこでと選ぶと、 という形にできる。
このときは等比数列であり、
さらにと選んでも同様だから、
の場合、
上の 2 式より、
(重解) の場合、
によりだから、
したがって は等差数列であり、
さらに、i の式を変形すると、
となり、 により、ii の式はこれに含まれる。
これで (必ずとは限りませんが) の場合を分ける必要がなくなりました。
次に、添字を負数まで拡張します。
とし、と順に値が定まっていくと考え、のときと同様の解法を用いる。
2 次方程式 の 2 解はだから、に対し、
が実数かつの場合はとなるようにを決めることにより、
となります。
(重解) の場合は上記の式が成り立ちます。
が実数でない場合はであり、実際に上記の極限は振動します。
が整数のとき、は整数ですが、は無理数である可能性があります。
つまり、無理数となるに対しても、比がほぼになる整数の組が限りなく連なっていることを意味します。
では次に、前回の定理を拡張してみましょう。
が成り立つのはどのような場合かを調べます。
任意の整数に対して、数列を漸化式
で定義する。は実数とし、とする。
このとき、任意の整数に対して を満たすのは、がの定数倍であるときに限られる。
また、任意の整数に対して を満たすのは、がの定数倍であるときに限られる。
を用いる。
を式変形していくと、
したがって となり、がの定数倍であるときに限られる。
また、 を式変形していくと、
したがって となり、がの定数倍であるときに限られる。
なお、の場合も上の議論に含まれる (一般項の分子がで割り切れることに注意すればよい)。
実際、例えばのときは、
となります。
ちなみにであることから、この数列の第項はリュカ数の第項に一致します。
公式 2 において、としたときの一般項は、
また、としたときの一般項は、
を整数とし、とした数列ととした数列の組を
リュカ数列 (Lucas sequence)
と呼びます。本稿の の符号はこのリンク先の に合わせています。
とすると、のとき、
は整数ですが、は無理数である可能性があります。
つまり、無理数となるに対しても、比がほぼになる整数の組を規則的にいくらでも見つけられることを意味します。
各項の計算
定数係数 3 項間漸化式により定められる数列の各項をコンピューターで具体的に求める方法をいくつか挙げます。
内容は
フィボナッチ数
のときとほぼ同様です。
以下、は整数とし、 とします。
一般項から求める
フィボナッチ数のときはが無理数のため、一般項から値を計算する方法は実用的ではありませんでした。
が整数となる場合においては、一般項から値を計算する方法が最も効率的でしょう。
漸化式から求める
数列の各項を整数のまま計算するには、定義の漸化式を用いて順に求めるのが簡単です。
時間計算量は です。
空間計算量は、途中の値をキャッシュする場合は 、キャッシュしない場合は でできます。
また、再帰関数として実装する方法もありますが、が大きくなるとスタックオーバーフローの原因になるため注意が必要です。
今回は、コードは省略します。
行列の漸化式から求める
行列を利用すると、整数のままで、しかも高速に計算できます。
2 次正方行列を用いて
と表すことを考えると、定義の漸化式から
とすればよいです。したがって、
これでを計算するとを求めることができ、繰り返し二乗法により、時間計算量は です。
値の桁が大きくなることを無視すれば (例えば、値を剰余群で考える場合)、が 64 ビット整数の最大値であったとしても一瞬で計算できます。
同様に、定数係数 項間漸化式 に拡張しても、 次正方行列を用いて各項を計算できます。ただし、 が大きくなれば計算量も大きくなっていきます。
こちらは定数係数 4 項間漸化式の例です:
作成したサンプル コード
前回:
(2) リュカ数
次回:
(4) ほとんど整数 (おまけ)