Welcome, guest | Sign In | My Account | Store | Cart
```from math import sqrt, pow, floor
from __future__ import generators

class Fibonacci:
"""A simple class which brings functions to calculate Fibonacci numbers
and make operations between them"""

def __init__(self):
self.Phi    = (1 + sqrt(5))/2
self.PhiP   = (1 - sqrt(5))/2
self.rs5    = 1/sqrt(5)
self.succ   = self.unboundedGenerator()

def __call__(self, n=-1):
if n == -1:
return self.next()
return self.nth(n)

def next(self):
"""Next Fibonacci number in the sucesion"""
return self.succ.next()

def nth(self, n):
"""Calculate the nth Fibonacci Number by formula. Doesn't work for n > 1474"""
return floor(self.rs5 * (pow(self.Phi, n) - pow(self.PhiP, n)))

def list(self, k, n):
"""Returns a list from Fibonacci(k) to Fibonacci(n) numbers"""
return [ self.nth(i) for i in range(k, n + 1) ]

def first(self, n):
"""Returns a list with the first n Fibonacci numbers"""
g = self.generator(n)
return [ g.next() for i in range(n) ]

def unboundedGenerator(self):
"""Unbounded Fibonacci generator"""
thisnum, nextnum = 0, 1L
while 1:
yield thisnum
thisnum, nextnum = nextnum, thisnum + nextnum
return

def generator(self, n):
"""n-Bounded Fibonacci generator"""
thisnum, nextnum = 0, 1L
for i in range(n + 1):
yield thisnum
thisnum, nextnum = nextnum, thisnum + nextnum
return
```