import numpy as np
def Fibonacci_1(number):#O(2^n)
    if(number == 0):
        return 0
    elif(number == 1):
        return 1
    return Fibonacci_1(number-1) + Fibonacci_1(number-2)

def Fibonacci_2(M, number):#O(logn)
     if(number > 1):
         if number % 2 ==0:
             M = Fibonacci_2(M, number/2)
             M = np.dot(M,M)
         elif number % 2 ==1:
             M = Fibonacci_2(M,(number-1)/2)
             M = np.dot(M,M)
             M_1 = np.array([[1,1],[1,0]])             
             M = np.dot(M,M_1)
     return M

def Fibonacci_3(number):
    Fibonacci_T = []
    if number ==0 or number == 1:
        return number
    Fibonacci_T.append(0)
    Fibonacci_T.append(1)
    for i in range(2,number+1):
        Fibonacci_T.append(Fibonacci_T[i-1]+Fibonacci_T[i-2])
    result = Fibonacci_T
    return result

if __name__=='__main__':
    M=np.array([[1,1],[1,0]])
    a = (Fibonacci_2(M,10))
    F2 = a[0][1]
    b = Fibonacci_3(10)
    F3 = b[len(b)-1]
    
    
    print("O(2^n)")
    print(Fibonacci_1(10))
    print("O(log n)")
    print(F2)
    print("O(n)")
    print(F3)


+ Recent posts