問題概略
400 万以下で偶数値のフィボナッチ数の総和を求めよ。
https://projecteuler.net/problem=2
2 で割った余りの周期性を利用
番目のフィボナッチ数を であらわして,これを 2 で割った余りを考えます。
この漸化式を繰り返し使うと 2 で割った余りは「1, 1, 0」を繰り返すことがわかります。
400 万以下の の和を求めればいいわけです。
フィボナッチ数を求めるのに sympy を使いました。
が 400 万以下になる最大の を求めて, から までの和を求めます。
import sympy nmx = 1 while sympy.fibonacci(nmx) < 4 * 10 ** 6: nmx += 1 print(sum([sympy.fibonacci(n) for n in range(3, nmx, 3)]))
漸化式を使う
とおいて, の漸化式を使って計算します。
の特性方程式は です。
これの解を , とおくと解と係数の関係から
は の形に書けます。
の特性方程式の解は , です。
簡単な計算で , がわかるので の特性方程式は で,漸化式は
実は条件をみたす項は 11 個しかなく,この漸化式で ~ を求めて足せばいいのですが,後学のためもう少し変形します。
とおきます。 で
(2)を(1)に代入して整理します。
これを繰り返し使って を求めました。
import sympy def solve(n): s = {1: sympy.fibonacci(3)} s[2] = s[1] + sympy.fibonacci(6) s[3] = s[2] + sympy.fibonacci(9) i = 4 while sympy.fibonacci(3 * i) < n: s[i] = 5 * s[i - 1] - 3 * s[i - 2] - s[i - 3] i += 1 return s[i-1] if __name__ == "__main__": nmx = 4 * 10 ** 6 print(solve(nmx))