#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))
