🧮
フィボナッチ数列の一般項をもとに値を計算するコード
まえがき
最近、数学ガールを読んでいます
扱うテーマは難しいですが、それを噛み砕いて説明してくれているおかげで読みやすくて良いです
今回は、そこで出てきたフィボナッチ数列を少し掘り下げたいと思います
概要
- フィボナッチ数列の一般項を使って値を計算するコードを書いた
- 一般項の定義をそのまま実装すると無理数が出てきて違和感があるので、式変形してからコードにした
フィボナッチ数列の一般項
フィボナッチ数列
この一般項をもとに、
fibonacci.py
import math
import sys
def fibonacci(n):
sqrt_5 = math.sqrt(5)
result = (((1 + sqrt_5) / 2) ** n - ((1 - sqrt_5) / 2) ** n) / sqrt_5
return int(result)
if __name__ == "__main__":
n = int(sys.argv[1])
print(fibonacci(n))
このままでも問題なく動作はしますが、自然数を入力として自然数を返す関数なのに、計算途中に
そこで、
\sqrt{5} を含まない形に式変形
まずは二項定理を使って、n乗の箇所を和に書き換えます
ここで、
一方、
となり、一般項を
\sqrt{5} を含まない形で実装
式変形の結果をもとに、実装を修正します
fibonacci.py
def fibonacci(n):
if n == 0:
return 0
result = 0
half_floor = math.floor((n - 1) / 2)
for m in range(half_floor + 1):
result += math.comb(n, 2 * m + 1) * (5 ** m)
result //= 2 ** (n - 1)
return result
if __name__ == "__main__":
n = int(sys.argv[1])
print(fibonacci(n))
実装が合っているか確認するため、いくつかの値で実行して確認します
$ python fibonacci.py 1
1
$ python fibonacci.py 2
1
$ python fibonacci.py 3
2
$ python fibonacci.py 4
3
$ python fibonacci.py 5
5
$ python fibonacci.py 20
6765
Wikipediaによると、フィボナッチ数列の第20項の値は6765
なので、問題なく動作していることが確認できました
Discussion