#!/usr/bin/env python3
import decimal
import math
from functools import lru_cache
from itertools import islice
from collections import deque
limit = 4000000
s = 0
a, b = 0, 2
while a < limit:
s += a
a, b = b, 4 * b + a
print(s)
# http://m...content-available-to-author-only...e.com/questions/323058/closed-form-for-the-sum-of-even-fibonacci-numbers
@lru_cache(maxsize=4)
def G(n):
if n == 0: return 0
elif n == 1: return 2
elif n == 2: return 8
else: return 5 * G(n-1) - 3 * G(n-2) - G(n-3)
print(sum(e for e in map(G, range(20)) if e < limit))
s = 0
a, b, c = 0, 2, 8
while a < limit:
s += a
a, b, c = b, c, 5*c - 3*b - a
print(s)
def fib(a=0, b=1):
while True:
yield a
a, b = b, a+b
# (F[3*n+2]-1) // 2
n = 11
print((deque(islice(fib(), 3*(n+1)), maxlen=1)[0] - 1) // 2)
def binet_decimal(n, precision):
"""Calculate nth fibonacci number using Binet's formula."""
with decimal.localcontext() as cxt:
cxt.prec = precision
with decimal.localcontext(cxt) as nested_cxt:
nested_cxt.prec += 2 # increase prec. for intermediate results
sqrt5 = decimal.Decimal(5).sqrt()
f = ((1 + sqrt5) / 2)**n / sqrt5
return +f.to_integral() # round to required precision
def ndigits_fibn(n):
"""Find number of decimal digits in fib(n)."""
phi = (1 + math.sqrt(5)) / 2
return int(n*math.log10(phi)-math.log10(5)/2)+1
def binetfib_exact(n):
return binet_decimal(n, ndigits_fibn(n))
print((binetfib_exact(3*n+2) - 1) // 2)
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwppbXBvcnQgZGVjaW1hbAppbXBvcnQgbWF0aAoKZnJvbSBmdW5jdG9vbHMgaW1wb3J0IGxydV9jYWNoZQpmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCgpsaW1pdCA9IDQwMDAwMDAKcyA9IDAKYSwgYiA9IDAsIDIKd2hpbGUgYSA8IGxpbWl0OgogICAgcyArPSBhCiAgICBhLCBiID0gYiwgNCAqIGIgKyBhCnByaW50KHMpCgojIGh0dHA6Ly9tLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS9xdWVzdGlvbnMvMzIzMDU4L2Nsb3NlZC1mb3JtLWZvci10aGUtc3VtLW9mLWV2ZW4tZmlib25hY2NpLW51bWJlcnMKQGxydV9jYWNoZShtYXhzaXplPTQpCmRlZiBHKG4pOgogICAgaWYgbiA9PSAwOiByZXR1cm4gMAogICAgZWxpZiBuID09IDE6IHJldHVybiAyCiAgICBlbGlmIG4gPT0gMjogcmV0dXJuIDgKICAgIGVsc2U6IHJldHVybiA1ICogRyhuLTEpIC0gMyAqIEcobi0yKSAtIEcobi0zKQoKcHJpbnQoc3VtKGUgZm9yIGUgaW4gbWFwKEcsIHJhbmdlKDIwKSkgaWYgZSA8IGxpbWl0KSkKCnMgPSAwCmEsIGIsIGMgPSAwLCAyLCA4CndoaWxlIGEgPCBsaW1pdDoKICAgIHMgKz0gYQogICAgYSwgYiwgYyA9IGIsIGMsIDUqYyAtIDMqYiAtIGEKcHJpbnQocykKCmRlZiBmaWIoYT0wLCBiPTEpOgogICAgd2hpbGUgVHJ1ZToKICAgICAgICB5aWVsZCBhCiAgICAgICAgYSwgYiA9IGIsIGErYgoKIyAoRlszKm4rMl0tMSkgLy8gMgpuID0gMTEKcHJpbnQoKGRlcXVlKGlzbGljZShmaWIoKSwgMyoobisxKSksIG1heGxlbj0xKVswXSAtIDEpIC8vIDIpCgpkZWYgYmluZXRfZGVjaW1hbChuLCBwcmVjaXNpb24pOgogICAgIiIiQ2FsY3VsYXRlIG50aCBmaWJvbmFjY2kgbnVtYmVyIHVzaW5nIEJpbmV0J3MgZm9ybXVsYS4iIiIKICAgIHdpdGggZGVjaW1hbC5sb2NhbGNvbnRleHQoKSBhcyBjeHQ6CiAgICAgICAgY3h0LnByZWMgPSBwcmVjaXNpb24KICAgICAgICB3aXRoIGRlY2ltYWwubG9jYWxjb250ZXh0KGN4dCkgYXMgbmVzdGVkX2N4dDoKICAgICAgICAgICAgbmVzdGVkX2N4dC5wcmVjICs9IDIgICMgaW5jcmVhc2UgcHJlYy4gZm9yIGludGVybWVkaWF0ZSByZXN1bHRzCiAgICAgICAgICAgIHNxcnQ1ID0gZGVjaW1hbC5EZWNpbWFsKDUpLnNxcnQoKQogICAgICAgICAgICBmID0gKCgxICsgc3FydDUpIC8gMikqKm4gLyBzcXJ0NQogICAgICAgIHJldHVybiArZi50b19pbnRlZ3JhbCgpICMgcm91bmQgdG8gcmVxdWlyZWQgcHJlY2lzaW9uCgpkZWYgbmRpZ2l0c19maWJuKG4pOgogICAgIiIiRmluZCBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgaW4gZmliKG4pLiIiIgogICAgcGhpID0gKDEgKyBtYXRoLnNxcnQoNSkpIC8gMgogICAgcmV0dXJuIGludChuKm1hdGgubG9nMTAocGhpKS1tYXRoLmxvZzEwKDUpLzIpKzEKCmRlZiBiaW5ldGZpYl9leGFjdChuKToKICAgIHJldHVybiBiaW5ldF9kZWNpbWFsKG4sIG5kaWdpdHNfZmlibihuKSkKCnByaW50KChiaW5ldGZpYl9leGFjdCgzKm4rMikgLSAxKSAvLyAyKQ==