0
大学数学基礎解説
文献あり

フィボナッチ数の性質と計算方法 (3) 定数係数 3 項間漸化式

79
0

この連載について

フィボナッチ数、リュカ数、そしてそれらを一般化した数列の基本的な性質と、コンピューターにおける計算方法について記述します。

  1. フィボナッチ数
  2. リュカ数
  3. 定数係数 3 項間漸化式 (本稿)
  4. ほとんど整数 (おまけ)

本文

今回は、フィボナッチ数やリュカ数をさらに一般化し、任意の定数係数 3 項間漸化式により定められる数列について考えます。

漸化式と一般項

定数係数 3 項間漸化式により定められる数列の一般項を求めます。
証明の方針は前回までとほぼ同じです。ただし、α=βの場合に注意します。

数列anを漸化式
  an+2pan+1+qan=0  (n0)
で定義する。p,q,a0,a1は実数とし、q0とする。

この数列の一般項は、2 次方程式 x2px+q=0 の 2 解α,βについて、

  1. αβの場合、
    an=αn(a1βa0)βn(a1αa0)αβ

  2. α=β (重解) の場合、
    an=nαn1a1(n1)αna0

なお、ii の式は i の式に含まれる。

ある実数λに対して、数列 bn:=an+1λan を考える。
元の漸化式においてan+2,an+1を消去して、
  bn+1(pλ)bn+(λ2pλ+q)an=0

α,βを 2 次方程式 x2px+q=0 の 2 解とすると、α+β=p, αβ=q を満たす。
そこでλ=αと選ぶと、bn+1=βbn という形にできる。
このときbnは等比数列であり、
  bn=βnb0=βn(a1αa0)
さらにλ=βと選んでも同様だから、
{an+1αan=βn(a1αa0)an+1βan=αn(a1βa0)

  1. αβの場合、
    上の 2 式より、
    (αβ)an=αn(a1βa0)βn(a1αa0)

  2. α=β (重解) の場合、
    an+1αan=αn(a1αa0)
    q0によりα0だから、
    an+1αnanαn1=a1αa0
    したがって anαn1 は等差数列であり、
    anαn1=αa0+n(a1αa0)=na1(n1)αa0an=nαn1a1(n1)αna0

さらに、i の式を変形すると、
  an=αnβnαβa1αn1βn1αβαβa0
となり、αnβnαβ=k=0n1αn1kβk により、ii の式はこれに含まれる。

これで (必ずとは限りませんが) α=βの場合を分ける必要がなくなりました。
次に、添字nを負数まで拡張します。

公式 1 は、任意の整数nに対して成り立つ。

  qanpan+1+an+2=0  (n<0)
とし、a1,a2,a3,と順に値が定まっていくと考え、n0のときと同様の解法を用いる。

2 次方程式 qx2px+1=0 の 2 解はx=α1,β1だから、n1に対し、
  an=α(1n)(a0β1a1)β(1n)(a0α1a1)α1β1       =αn(a1βa0)+βn(a1αa0)βα       =αn(a1βa0)βn(a1αa0)αβ

α,βが実数かつ|α||β|の場合は|α|>|β|となるようにα,βを決めることにより、
  limnan+1an=α
となります。
α=β (重解) の場合は上記の式が成り立ちます。
α,βが実数でない場合は|α|=|β|であり、実際に上記の極限は振動します。

p,q,a0,a1が整数のとき、anは整数ですが、αは無理数である可能性があります。
つまり、無理数となるαに対しても、比がほぼαになる整数の組が限りなく連なっていることを意味します。

では次に、前回の定理を拡張してみましょう。
an=±qnanが成り立つのはどのような場合かを調べます。

任意の整数nに対して、数列anを漸化式
  an+2pan+1+qan=0
で定義する。p,q,a0,a1は実数とし、q0とする。

このとき、任意の整数nに対して an=qnan を満たすのは、(a0,a1)(0,1)の定数倍であるときに限られる。
また、任意の整数nに対して an=qnan を満たすのは、(a0,a1)(2,p)の定数倍であるときに限られる。

α+β=p, αβ=q を用いる。

an=qnan を式変形していくと、
  αn(a1βa0)βn(a1αa0)=qn(αn(a1βa0)βn(a1αa0))  αn(a1βa0)βn(a1αa0)=βn(a1βa0)+αn(a1αa0)  αn(αβ)a0+βn(αβ)a0=0  (αn+βn)(αβ)a0=0
したがって a0=0 となり、(a0,a1)(0,1)の定数倍であるときに限られる。

また、an=qnan を式変形していくと、
  αn(a1βa0)βn(a1αa0)=qn(αn(a1βa0)βn(a1αa0))  αn(a1βa0)βn(a1αa0)=βn(a1βa0)αn(a1αa0)  αn(2a1(α+β)a0)βn(2a1(α+β)a0)=0  (αnβn)(2a1pa0)=0
したがって pa0=2a1 となり、(a0,a1)(2,p)の定数倍であるときに限られる。

なお、α=βの場合も上の議論に含まれる (一般項の分子がαβで割り切れることに注意すればよい)。

実際、例えば(p,q,a0,a1)=(3,1,2,3)のときは、
,47,18,7,3,2,3,7,18,47,
となります。
ちなみに3±52=(1±52)2であることから、この数列の第n項はリュカ数の第2n項に一致します。

公式 2 において、(a0,a1)=(0,1)としたときの一般項は、
  an=αnβnαβ
また、(a0,a1)=(2,p)としたときの一般項は、
  an=αn+βn

公式 2 に代入すれば得られる。

p,qを整数とし、(a0,a1)=(0,1)とした数列Un(a0,a1)=(2,p)とした数列Vnの組を リュカ数列 (Lucas sequence) と呼びます。本稿の p,q の符号はこのリンク先の P,Q に合わせています。

D:=p24qとすると、αβのとき、
  limnVnUn=αβ=D
Un,Vnは整数ですが、Dは無理数である可能性があります。
つまり、無理数となるDに対しても、比がほぼDになる整数の組を規則的にいくらでも見つけられることを意味します。

各項の計算

定数係数 3 項間漸化式により定められる数列の各項をコンピューターで具体的に求める方法をいくつか挙げます。
内容は フィボナッチ数 のときとほぼ同様です。
以下、p,q,a0,a1は整数とし、n0 とします。

一般項から求める

フィボナッチ数のときはα,βが無理数のため、一般項から値を計算する方法は実用的ではありませんでした。
α,βが整数となる場合においては、一般項から値を計算する方法が最も効率的でしょう。

漸化式から求める

数列の各項を整数のまま計算するには、定義の漸化式を用いて順に求めるのが簡単です。
時間計算量は O(n) です。
空間計算量は、途中の値をキャッシュする場合は O(n)、キャッシュしない場合は O(1) でできます。

また、再帰関数として実装する方法もありますが、nが大きくなるとスタックオーバーフローの原因になるため注意が必要です。
今回は、コードは省略します。

行列の漸化式から求める

行列を利用すると、整数のままで、しかも高速に計算できます。

2 次正方行列Aを用いて
(an+2an+1)=A(an+1an)
と表すことを考えると、定義の漸化式から
A=(pq10)
とすればよいです。したがって、
(an+1an)=An(a1a0)

これでAnを計算するとanを求めることができ、繰り返し二乗法により、時間計算量は O(logn) です。
値の桁が大きくなることを無視すれば (例えば、値を剰余群で考える場合)、nが 64 ビット整数の最大値であったとしても一瞬で計算できます。

同様に、定数係数 k 項間漸化式 (k>1) に拡張しても、k1 次正方行列を用いて各項を計算できます。ただし、k が大きくなれば計算量も大きくなっていきます。
こちらは定数係数 4 項間漸化式の例です:

作成したサンプル コード

前回: (2) リュカ数
次回: (4) ほとんど整数 (おまけ)

参考文献

投稿日:2021619
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

Researcher and Developer for Algorithms, using C# (.NET). 数検1級金賞 (2002).

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. この連載について
  2. 本文
  3. 漸化式と一般項
  4. 各項の計算
  5. 参考文献