#coding: utf-8 ''' mbinary ####################################################################### # File : fibonacci.py # Author: mbinary # Mail: zhuheqin1@gmail.com # Blog: https://mbinary.github.io # Github: https://github.com/mbinary # Created Time: 2019-02-03 19:10 # Description: use matrix and fast pow to calculate big numbr fibonacci value. ####################################################################### ''' def fib(n): """Calculates the nth Fibonacci number""" mat, p = (1, 1, 1, 0), n-2 if n <= 0: # for negative fib item, use f(n) = f(n+2)-f(n-1) to calculate mat = (0, 1, 1, -1), 2-n li = matrix_pow((0, 1, 1, -1), 1-n) return li[0]+li[1] def matrix_pow(mat, n): ans = (1, 0, 0, 1) # element matrix while n > 0: if n % 2 == 1: ans = matrix_mul(ans, mat) n >>= 1 mat = matrix_mul(mat, mat) return ans def matrix_mul(a, b): '''a,b are four-item tuple, represent matrix [[a[0],a[1]],[a[2],a[3]]]''' return a[0]*b[0]+a[1]*b[2], a[0]*b[1]+a[1]*b[3], a[2]*b[0]+a[3]*b[2], a[2]*b[1]+a[3]*b[3] if __name__ == '__main__': for i in range(-5, 5): print(i, fib(i))