Skip to content

This project is for discussing fibonacci algorithm by using python code

Notifications You must be signed in to change notification settings

howard31622/fibonacci-algorithm

Repository files navigation

This project is for discussing fibonacci algorithm

Fibonacii calculation

一. Divide anda Coonquer method : Recursive program Fib1 時間統計圖表及10秒中Fn最大的n值

python code

def fibonacci(n):
    if not isinstance(n, int):
        print ('Invalid Input')
        return None

    if n < 0:
       print ('Invalid Input')
        return None
    
    if n == 0:  
        return 0

    if n == 1:
        return 1

    fib = fibonacci(n-1) + fibonacci(n-2)
        return fib

    print(fibonacci(5)))

時間統計圖:

image

十秒內最大的n值: 7049155

二.Botton-up method:Fib2求時間統計圖表及10秒中Fn最大的n值

python code

count = 0
def fibonacci(n):
    global count
    count = count + 1
    if not isinstance(n, int):
        print ('Invalid Input')
        return None

    if n < 0:
        print ('Invalid Input')
        return None

    a = 0 
    b = 1 
    for c in range(0,n):
        a = b
        b = count
        count = a + b
        
fibonacci(5)
print(count)

時間統計圖:

image

十秒內最大的n值: 在64位元中最大值為fib2(305) ,在fib(306)時因為超過範圍了,故不計算。

而 n = 305 時算出的fib2(305) = 6452389184720949856740872794933738025334109298792472139250504213

而 n = 306 時算出的fib2(306) = 10440185009520720572083697583620800653786381708749108822250120621

三.Naive algorithm : Fib3求時間統計圖表及10秒中Fn最大的n值,在這個做法中有哪些Fn會算錯,如果要提高正確率的方法

python code

count = 0
def fibonacci(n):
    global count
    if not isinstance(n, int):
        print ('Invalid Input')
        return None
    if n < 0:
        print ('Invalid Input')
        return None
    count = (( (1 + (5 ** 0.5))/2) ** n)/(5 ** 0.5)

fibonacci(5)
print(count)

時間統計圖:

image

十秒內最大的n值:(因為數字超過範圍,因此只能顯示64位元中最大數字) 這個算出來的值會超出範圍,因此還是使用n = 305 求出最大數 2.4645933599212044e+63

四.Recursive squaring method1 : 利用Fn = (φ^(n/2)) * (φ^(n/2))為Fib4求時間統計圖表及10秒中Fn最大的n值,而這個做法會有哪些會算錯

python code

count = 0
def fibonacci(n):
    global count
    if not isinstance(n, int):
        print ('Invalid Input')
        return None
    if n < 0:
        print ('Invalid Input')
        return None
    count = (((1+(5 ** 0.5))/2) ** (n/2)) * (((1+(5 ** 0.5))/2) ** (n/2))
fibonacci(5)
print(count)

python code (divide and conquer)

count = 0

def fibonacci(n):
		if not isinstance(n, int):
    		print ('Invalid Input')
    		return None

		if n < 0:
    		print ('Invalid Input')
    		return None
    
		if n == 0:  
    		return 1

		if n == 1:
    		return (1+(5 ** 0.5))/2  

		fib = fibonacci(n/2)* fibonacci(n/2)
		return fib

print(fibonacci(305))

時間統計圖:

image

十秒內最大的n值:(因為數字超過範圍,因此只能顯示64位元中最大數字) 這個算出來的值會超出範圍,因此還是使用n =305求出最大數,這兩個的時間複雜度不一樣,但所算出的時間卻看似一樣,可能是因為,題目所設定的範圍不夠

五.Recursive squaring method2 : 利用Fn =[[1 1],[1 0]]為Fib5求時間統計圖表及10秒中Fn最大的n值

python code

import numpy as np
count = np.array([[1,1],[1,0]])
def fibonacci(n):
    global count
    if not isinstance(n, int):
        print ('Invalid Input')
        return None
    if n < 0:
        print ('Invalid Input')
        return None
    A = np.array([[1,1],[1,0]])
    for a in range(1,n):
	      count = np.dot(count,A)

fibonacci(5)
print (count[0][0])

時間統計圖:

image

十秒內最大的n值: 根據實驗結果,算出當n = 9000000在約十秒的時候算出答案 => 8434530251446700417

六.Negative Fibonacii numbers : 利用 Fn-2 = Fn – Fn-1 做出Fib6

python code

count = 0
def fibonacci(n):
    global count
    if not isinstance(n, int):
    print ('Invalid Input')
    return None
if n == 0:
    count = 0
if n == 1:
    count = 1
if n < 0:
    a = 0
    b = 1
    for c in range(n,0):
        count = b - a
        b = a
        a = count
if n > 1:    
    a = 0
    b = 1
    for c in range(0,n):
        a = b
        b = count
        count = a + b
    

fibonacci(-5)
print(count)

七.Lucas numbers : 利用定義寫出Fib7

python code

count = 0
def fibonacci(n):
    global count
    count = count + 1
    if not isinstance(n, int):
        print ('Invalid Input')
        return None

    if n < 0:
        print ('Invalid Input')
        return None
    if n == 0 :
        count = 2
        return count
    if n == 1:
        count = 1
        return count     

    a = 2 
    b = 1 
    for c in range(0,n):
        a = b
        b = count
        count = a + b
        
fibonacci(3)
print(count)

八.Tetranacci numbers : 利用這個method延伸出提供前K個數字相加求第n個Fib8 Fn,k ,並求時間跟空間複雜度

python code

  import numpy as np
  count = 0
  def fibonacci(n,k):
      global count
      if not isinstance(n, int):
          print ('Invalid Input')
          return None
      if n < 0:
          print ('Invalid Input')
          return None
      if n < k:
          print ('Invalid Input')
          return None

      x = np.zeros(k)   
      x[k-1] = 1
      y = np.zeros(n+1)
      for a in range(0,n+1):
          if a<k:
              y[a] = x[a]
          else:
              for b in range(a-k,a):
                  y[a] = y[a]+y[b]
      count = int(y[n])

  fibonacci(12,4)
  print(count)

從上面的程式碼中可以看出,空間複雜度是以O(k) 因為我使用陣列去處理,時間複雜度為O(n+1)

九. 參考資料:http://www.montefiore.ulg.ac.be/~piater/courses/INFO0902/notes/basic-algos/foil15.xhtml 這次作業對我來說碰到最大的困難應該都是在求時間成長統計表,因為求數據很花時間,也不太想用python直接畫圖

About

This project is for discussing fibonacci algorithm by using python code

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages