""" fib_table.py Generate a list of 20 Fibonacci numbers F(n) where the n's are 7 apart starting at 100, e.g. n = [100, 107, 114, ...], and output as a csv (comma separated values) table. According to http://en.wikipedia.org/wiki/Fibonacci_number, the series starts like this : n 0 1 2 3 4 ... fib(n) 0 1 1 2 3 ... where each term is the sum of the previous two. Running it this way will create fib_data.csv. $ python fib_table.py > fib_data.csv --- fib_data.csv --- n,fib 100,354224848179261915075 107,10284720757613717413913 ... Jim Mahoney | Jan 2013 | MIT License """ def generate_fibs(max_n): """ Return list of fibonnaci numbers f[0 ... max_n] >>> generate_fibs(10) # fib[0] through fib[10] [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55] """ f = [0]*(max_n + 1) # list to hold result (f[0], f[1]) = (0, 1) # initial values for i in xrange(2, max_n + 1): f[i] = f[i-1] + f[i-2] return f def skip_list(start, skip, length): """ Return list with given start, skip, and length >>> skip_list(10, 3, 5) [10, 13, 16, 19, 22] """ return [start + i*skip for i in range(length)] def print_csv(lists, names=[]): """ Print a table of comma-separated-values from the given lists, with optional column names. >>> print_csv([ [0,1,2], [10,11,12] ], ['a', 'b']) a,b 0,10 1,11 2,12 """ if len(names) > 0: print ','.join(names) for n_line in range(len(lists[0])): data_line = [str(data[n_line]) for data in lists] print ','.join(data_line) def main(start=100, count=20): n = skip_list(start, 7, count) # [100, 107, ...] fibs = generate_fibs(n[-1]) # [f(0), f(1), ...] fibs_n = [fibs[i] for i in n] # [f(100, f(107), ...] # ## 1st try at dealing with big numbers (i.e. fib[10000]) ## fails for really big ones; can't convert to float. #fibs_n = ["{:.5g}".format(fibs[i]) for i in n] # ## 2nd try at dealing with big numbers : use log_2() #from math import log #fibs_n = [log(fibs[i], 2) for i in n] # print_csv([n, fibs_n], ['n', 'fib']) main() if __name__ == "__main__": import doctest doctest.testmod()