import math
from itertools import combinations
Phi = (5 ** 0.5 + 1) / 2
phi = 1 / Phi
def get_next_lowest_fib(n, i=2):
while i <= n:
yield round((Phi ** i - ((-1 * phi) ** i)) / (5 ** 0.5))
i += 1
def zeckendorf(n):
fib_index = round((math.log(n) + math.log(5) / 2) / (math.log(Phi)))
fibs = [i for i in get_next_lowest_fib(fib_index)]
possibles = []
for i in range(1, len(fibs) + 1):
for combo in combinations(fibs, i):
if sum(combo) == n:
possibles.append(combo)
for pcombo in possibles:
for num in pcombo:
num_index = fibs.index(num)
if num_index + 1 < len(fibs):
next_num = fibs[num_index + 1]
if next_num in pcombo:
break
else:
return set(pcombo)
print([(i, zeckendorf(i)) for i in [120, 34, 88, 90, 320]])
aW1wb3J0IG1hdGgKZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNvbWJpbmF0aW9ucwpQaGkgPSAoNSAqKiAwLjUgKyAxKSAvIDIKcGhpID0gMSAvIFBoaQoKZGVmIGdldF9uZXh0X2xvd2VzdF9maWIobiwgaT0yKToKICAgIHdoaWxlIGkgPD0gbjoKICAgICAgICB5aWVsZCByb3VuZCgoUGhpICoqIGkgLSAoKC0xICogcGhpKSAqKiBpKSkgLyAoNSAqKiAwLjUpKQogICAgICAgIGkgKz0gMQoKZGVmIHplY2tlbmRvcmYobik6CiAgICBmaWJfaW5kZXggPSByb3VuZCgobWF0aC5sb2cobikgKyBtYXRoLmxvZyg1KSAvIDIpIC8gKG1hdGgubG9nKFBoaSkpKQogICAgZmlicyA9IFtpIGZvciBpIGluIGdldF9uZXh0X2xvd2VzdF9maWIoZmliX2luZGV4KV0KICAgIHBvc3NpYmxlcyA9IFtdCiAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4oZmlicykgKyAxKToKICAgICAgICBmb3IgY29tYm8gaW4gY29tYmluYXRpb25zKGZpYnMsIGkpOgogICAgICAgICAgICBpZiBzdW0oY29tYm8pID09IG46CiAgICAgICAgICAgICAgICBwb3NzaWJsZXMuYXBwZW5kKGNvbWJvKQoKICAgIGZvciBwY29tYm8gaW4gcG9zc2libGVzOgogICAgICAgIGZvciBudW0gaW4gcGNvbWJvOgogICAgICAgICAgICBudW1faW5kZXggPSBmaWJzLmluZGV4KG51bSkKICAgICAgICAgICAgaWYgbnVtX2luZGV4ICsgMSA8IGxlbihmaWJzKToKICAgICAgICAgICAgICAgIG5leHRfbnVtID0gZmlic1tudW1faW5kZXggKyAxXQogICAgICAgICAgICAgICAgaWYgbmV4dF9udW0gaW4gcGNvbWJvOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNldChwY29tYm8pCgpwcmludChbKGksIHplY2tlbmRvcmYoaSkpIGZvciBpIGluIFsxMjAsIDM0LCA4OCwgOTAsIDMyMF1dKQ==
[(120, {8, 89, 2, 21}), (34, {34}), (88, {8, 1, 3, 21, 55}), (90, {1, 89}), (320, {8, 233, 3, 21, 55})]