Skip to content

Instantly share code, notes, and snippets.

@raeq
Created September 5, 2020 10:48
Show Gist options
  • Save raeq/05ea07589af1b0e1ac078404a6786389 to your computer and use it in GitHub Desktop.
Save raeq/05ea07589af1b0e1ac078404a6786389 to your computer and use it in GitHub Desktop.
Djisktra uses Lucas Powers to calculate Fibonacci
def lucas_power(n: float):
"""lucas_power.
Args:
n (float): n
"""
if n == 1:
return (1, 1)
L, F = lucas_power(n // 2)
L, F = (L**2 + 5 * F**2) >> 1, L * F
if int(n) & 1:
return ((L + 5 * F) >> 1, (L + F) >> 1)
else:
return (L, F)
def _fib_djikstra(n: float):
"""fib.
Args:
n (float): n
"""
if int(n) & 1:
return lucas_power(n)[1]
else:
L, F = lucas_power(n // 2)
return L * F
fibs = {0: 0, 1: 1}
def fibonacci_djikstra(n: int):
"""
See: https://www.cs.utexas.edu/users/EWD/ewd06xx/EWD654.PDF
>>> fibonacci_djikstra(80)
23416728348467685
"""
if n in fibs:
return fibs[n]
if n % 2 == 0:
fibs[n] = ((2 * _fib_djikstra((n / 2) - 1)) + _fib_djikstra(n / 2)) * _fib_djikstra(n / 2)
return fibs[n]
else:
fibs[n] = (_fib_djikstra((n - 1) / 2)**2) + (_fib_djikstra((n + 1) / 2)**2)
return fibs[n]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment