Loading AI tools
数列を構成する数 ウィキペディアから
フィボナッチ数(フィボナッチすう、英: Fibonacci number)は、イタリアの数学者レオナルド・フィボナッチ(ピサのレオナルド)に因んで名付けられた数である。
第0~22項の値は次の通りである:
1202年にフィボナッチが発行した『算盤の書』(Liber Abaci) に記載されたことで「フィボナッチ数」と呼ばれているが、それ以前にもインドの学者であるヘーマチャンドラ (Hemachandra) が韻律の研究により発見し、書物に記したことが判明している[1][2]。
レオナルド・フィボナッチは次の問題を考案した[3]。
つがいの数は次の表のようになる。どの月のつがいの合計も、その前の2つの月での合計の和となり、フィボナッチ数が現れていることが分かる。
産まれたばかりのつがい | 生後1か月のつがい | 生後2か月以降のつがい | つがいの数(合計) | |
---|---|---|---|---|
0か月後 | 1 | 0 | 0 | 1 |
1か月後 | 0 | 1 | 0 | 1 |
2か月後 | 1 | 0 | 1 | 2 |
3か月後 | 1 | 1 | 1 | 3 |
4か月後 | 2 | 1 | 2 | 5 |
5か月後 | 3 | 2 | 3 | 8 |
6か月後 | 5 | 3 | 5 | 13 |
7か月後 | 8 | 5 | 8 | 21 |
8か月後 | 13 | 8 | 13 | 34 |
9か月後 | 21 | 13 | 21 | 55 |
10か月後 | 34 | 21 | 34 | 89 |
11か月後 | 55 | 34 | 55 | 144 |
12か月後 | 89 | 55 | 89 | 233 |
フィボナッチ数列の一般項は次の式で表される[3]:
この式は1843年にビネ (Jacques Philippe Marie Binet) が発表したことからビネの公式と呼ばれるが、それ以前の1730年(ド・モアブル)・1765年(オイラー)にも発表されており、ビネは最初の発見者ではない。
なお、この式に現れる
は黄金数で、いくつかの数学的特徴がある。黄金数を作る二次方程式 x2 − x − 1 = 0 の解を α, β (α > β) とすると、上記の一般項は
と表せる。
また、一般項の第2項 1/ √5 (−φ)−n の絶対値は減少列で、n = 0 のとき 1/ √5 = 0.447... < 1/2 より、第2項を切り捨てた式は Fn の値を 0.447 以下(n > 4 のとき1%以下)の誤差で与える近似式である。
この誤差の絶対値は0.5未満なので、Fn の正確な整数値は以下の式で得られる[3]。
ただし、⌊ x ⌋ は床関数である。
なお、後述の負数番への拡張を考慮した場合、n < 0 では逆に一般項の第1項の絶対値が0.5未満となるため、n < 0 における Fn の正確な整数値は以下の式で得られる。
これらのことから、任意の整数 n における Fn の正確な整数値は以下の式で得られる。
ただし、sgn x は符号関数である。
また、フィボナッチ数列の漸化式は次のように行列表現できる[3]:
これらを並べて表記すると、
ここで、F−1 = 1 は、漸化式 Fn = Fn−1 + Fn−2 に n = 1 を代入すると得られる(詳細は後述の負数番への拡張を参照)。
更に、n を 2n で置換すると、
よって、
母関数は
である。
また、この行列表現を基に、以下のような漸化式を考えることができる。
フィボナッチ数列の隣接2項の商は黄金数 φ に収束する。この性質は初期値 (F0 = 0, F1 = 1) に依らない。
これは次のように導出される:
これより以下を導くことができる。
フィボナッチ数の累和や累積について以下の式が成り立つ。
また、次の関係式が知られている。
フィボナッチ数のうち平方数であるのは F1 = F2 = 1, F12 = 144 のみ (Cohn 1964)[4]、立方数であるのは F1 = F2 = 1, F6 = 8 のみ (London and Finkelstein 1969)[5]である。フィボナッチ数のうち累乗数であるのはこれしかない (Bugeaud, Mignotte, Siksek 2006)[6]。(オンライン整数列大辞典の数列 A227875)
フィボナッチ数で素数であるのは 2, 3, 5, 13, 89, 233, 1597, 28657, … である(オンライン整数列大辞典の数列 A005478)。また、これらはフィボナッチ素数と呼ばれる。
フィボナッチ数で三角数であるのは 1, 3, 21, 55(オンライン整数列大辞典の数列 A039595)のみであることは Vern Hoggatt によって予想されていたが、のちに Luo Ming によって証明された[7]。
フィボナッチ数でハーシャッド数であるのは 1, 2, 3, 5, 8, 21, 144, 2584, …(オンライン整数列大辞典の数列 A117774)。
フィボナッチ数は完全数にはならない[8]。より一般に、フィボナッチ数は倍積完全数にもならず[9]、2つのフィボナッチ数の商も完全数にはならない[10]。
フィボナッチ数列の逆数和は収束し、記号 ψ で表される。
この ψ が無理数であることは証明されているが (André-Jeannin 1989)、超越数であるかどうかは分かっていない。
任意の正の整数は、1つ以上の連続しない相異なるフィボナッチ数の和として一意に表すことができる(ゼッケンドルフの定理)。
再帰的処理の例としてよく紹介される。以下はPythonでの例。
ただし、下記実装例の内、#負数番への拡張に対応しているのは例5・例6のみである。
このプログラムでは、n が与えられてから Fn が求まるまでに Fn ∝ φn 回の関数呼び出しが発生する(すなわち指数時間の計算となる)ため、実用的ではない。したがって通常は、線形時間で計算するためにメモ化などの手法を用いる他、後述するように様々な実装例が検討されている。
def fib(n: int) -> int:
if n < 2:
return n
else:
return fib(n=n-1) + fib(n=n-2)
メモ化の例を挙げると[注釈 1]、
from functools import cache
@cache
def fib(n: int) -> int:
if n < 2:
return n
else:
return fib(n=n-1) + fib(n=n-2)
def fib(n: int) -> int:
a, b = 1, 0
for _ in range(n):
a, b = b, a+b
return b
n が1以上の場合に第2・第3の引数を上記例2と同じ要領で順次更新していくことで、コール回数を n 回に抑えられる為、線形時間で処理できる。
def fib(n: int, a: int = 1, b: int = 0) -> int:
if n == 0:
return b
else:
return fib(n=n-1, a=b, b=a+b)
#行列表現で導出した漸化式(以下に再掲)を用いることで、再帰的処理でも対数時間で処理できる。
ただし、プログラム上は0を掛けるからと言ってその対象の値が計算されない訳では無い為(短絡評価されない)、条件式による分岐で表記している。
def fib(n: int) -> int:
if n < 2:
return n
q = n // 2
fq = fib(n=q)
return fq ** 2 + (2 * fib(n=q-1) * fq if n % 2 == 0 else fib(n=q+1) ** 2)
浮動小数点型を使用すると計算誤差が発生する為、decimal
モジュールを用いている[注釈 2]。
from decimal import Decimal
SQRT5 = Decimal(5).sqrt()
PHI = (1 + SQRT5) / 2 # 黄金数
def fib(n: int) -> int:
return round((PHI ** n - (-PHI) ** -n) / SQRT5)
なお、先述の通りフィボナッチ数列の一般項は、引数 n の符号によって2項の内いずれかが0.5未満となることから、符号関数及び床関数を用いて以下のように表すことができた。
このことから、以下のように実装することで冪乗演算の回数を減らすことが出来る[注釈 3]。
from decimal import Decimal
ONE = Decimal(1)
SQRT5 = Decimal(5).sqrt()
PHI = (1 + SQRT5) / 2 # 黄金数
def fib(n: int) -> int:
if n == 0:
return 0
sgn_n = ONE.copy_sign(n)
return sgn_n * round((sgn_n * PHI) ** abs(n) / SQRT5)
より、n を n − 1 に置換すると、
従って、Fn は、上式右辺(の具体的な計算値)の左上成分に等しい。
行列の冪を簡潔に記述する為にSymPyを用いた[注釈 4][注釈 5]。 {{Syntaxhighlight|lang=python|code= from sympy import Matrix
def fib(n: int) -> int:
return (Matrix([[1, 1], [1, 0]]) ** (n - 1))[0, 0] # 左上成分
}}
ヨハネス・ケプラーは1611年に発表した小論文「新年の贈り物あるいは六角形の雪について」において、フィボナッチ数を自己を増殖する比例と呼び、植物の種子の能力の現れであると論じた[13]。
フィボナッチ数列は、漸化式 Fn = Fn−1 + Fn−2 を全ての整数 n に対して適用することにより、n が負の整数の場合に拡張できる。そして F−n = (−1)n+1Fn が成り立つ。この式より、負の番号の項は次のようになる。
n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Fn | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 | 233 | 377 | 610 | 987 | 1597 | 2584 | 4181 | 6765 |
F−n | 0 | 1 | −1 | 2 | −3 | 5 | −8 | 13 | −21 | 34 | −55 | 89 | −144 | 233 | −377 | 610 | −987 | 1597 | −2584 | 4181 | −6765 |
フィボナッチ数列の定義である初期値や漸化式をやや変更して、類似の数列が作れる。
フィボナッチ数列は各項が先行する二項の和であるものであったが、それを「先行する k 項の和」と置き換えた一般化
を考えることができる。ただし、初期値は 1 で埋める(1-fil型)
あるいは 0 で埋める(0-fil型)
などを取るのが一般的である。これらフィボナッチ数列の類似物を、項数 k に対応するラテン語またはギリシャ語に由来する倍数接頭辞を「フィボナッチ」と組み合わせた名称で呼ぶ[注釈 6]。
k | 接頭辞[18] | 名称 | 整数列大辞典 |
---|---|---|---|
3 | tri- | トリボナッチ数 | 0 fil: A000073 1 fil: A000213 |
4 | tetra- | テトラナッチ数 | 0 fil: A000078 1 fil: A000288 |
5 | penta- | ペンタナッチ数 | 0 fil: A001591 1 fil: A000322 |
6 | hexa- | ヘキサナッチ数 | 0 fil: A001592 1 fil: A000383 |
7 | hepta- | ヘプタナッチ数 | 0 fil: A122189 1 fil: A060455 |
8 | octa- | オクタナッチ数 | 0 fil: A079262 1 fil: A123526 |
9 | nona- | ノナ(ボ)ナッチ数 | 1 fil: A127193 |
10 | deca- | デカ(ボ)ナッチ数 | 1 fil: A127194 |
11 | undeca- | ウンデカ(ボ)ナッチ数 | 1 fil: A127624 |
12 | dodeca- | ドデカ(ボ)ナッチ数 | 1 fil: A207539 |
20 | icosa- | イコサナッチ数 | ⋮ |
特に直前の三項の和として各項が定まるトリボナッチ数列は、フィボナッチ数列に次いでよく調べられている。0-fil型でオフセットが0番目からのものは
と表される。第0~21項の値は次の通りである:
トリボナッチ数列の一般項は次で表される。
ただし、α, β, γ は三次方程式 x3 − x2 − x − 1 = 0 の3解
であり、ここで
である。
また、上記の α をトリボナッチ定数という。これはフィボナッチ数列における黄金数に当たる定数で、トリボナッチ数列の隣接2項間の商はトリボナッチ定数に収束する:
直前の四項の和に変更したテトラナッチ数列も同様に様々なことが知られている。同様にオフセット0番の 0-fil型は
と書けて、第0~21項の値は次の通りである:
一般項は、四次方程式 x4 − x3 − x2 − x − 1 = 0 の4解を α, β, γ, δ として、
となる。
フィボナッチ数列の最初の2項を 2, 1 に置き換えた数列の項をリュカ数という。
この数列の一般項は
と表される。
フィボナッチ数列やリュカ数の列を一般化したものがリュカ数列であり、1878年にエドゥアール・リュカが体系的な研究を行い、1913年にロバート・ダニエル・カーマイケルがその結果を整理、拡張した[19]。これらの研究が現代のフィボナッチ数の理論の基礎となった。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.