-
Notifications
You must be signed in to change notification settings - Fork 0
/
Fibonacci.py
163 lines (124 loc) · 4 KB
/
Fibonacci.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#on utilise la tibrairie time pour pouvoir faire un benchmark
import time
from decimal import Decimal,getcontext
#from numba import jit
#from progress.bar import ChargingBar
print("getcontext().prec= ",getcontext().prec)
#n=int(input("Juste qu'à combien ? "))
n=(3)
#fonction qui calcule le nième nombre de la suite de fibonacci
#suffix = '%(percent)d%% [%(elapsed_td)s / %(eta)d / %(eta_td)s]'
#bar = ChargingBar('Processing',max=n )
#@jit(nopython=True)
#getcontext().prec = 15
def time_it(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args,**kwargs)
end = time.time()
print(func.__name__ ," took " )
print( (end-start) , " ms")
return result
return wrapper
#@time_it
def Fibo(n) :
a,b,c=1,1,1
if (n==1) :
return(a)
elif (n==2) :
return(b)
else :
while (c<n-2) :
a,b,c=b,a+b,c+1
#bar.next()
#bar.finish()
return(a+b)
#Affiche la nième valeur de la suite
print("Le nième (",n,") nombre de la suite par itération est : ") #+str(Fibo(n)))
#démarre le timer
start=Decimal(time.time())
result=Fibo(n)
#arrête le timer
end=Decimal(time.time())
print(result)
#affiche le temps de calcul par itération
print("Temps de calcul par itération est de : ")
print(str(end-start)+" s")
#affiche le ratio n/(n-1) pour calculer phi le nombre d'or
ratio=Decimal(result)/Decimal(Fibo(n-1))
print("Le ratio est de : ")
print(str(ratio))
#affiche la différence entre le phi et le ratio calculé
similitude=Decimal(ratio)/Decimal((1+5**0.5)/2)
print("La similitude avec phi est de :")
print(str(similitude))
#valeur exacte de phi
#print(float((1+5**0.5)/2))
# valeur approché de phi avec un grand nombre de chiffres
phi=1.618033988749894848204586834365638117720309179805762862135448622705260462189024497072072041
#formule de binet permet de calculer le nième sans récursion ni itération
def binet(n):
a=Decimal(1)
b=Decimal(5)
c=Decimal(0.5)
d=Decimal(2)
n=Decimal(n)
r=a/b**c*(((b**c+a)/d)**n-((-b**c+a)/d)**n)
return r
#affiche le nième nombre de la suite avec la formule de binet
print("Le nième nombre de la suite avec la formuel de Binet est : ")#+str(binet(n)))
#commence un second timer
start2= Decimal(time.time())
result_binet=binet(n)
#arrête le second timer
end2=Decimal(time.time())
print(result_binet)
#affiche le temps de calcul pour la formule de binet
print("Temps de calcul avec la formule de Binet est de :")
print(str(end2-start2)+" s")
# Python Fibonacci series Program using For Loop
# Fibonacci series will start at 0 and travel upto below number
#Number = int(input("Please Enter the Range Number: "))
Number=n
# Initializing First and Second Values of a Series
# Find & Displaying Fibonacci series
@time_it
def fibo_for(Number):
First_Value = 0
Second_Value = 1
for Num in range(1, Number+1):
if(Num <= 1):
Next = Num
else:
Next = First_Value + Second_Value
First_Value = Second_Value
Second_Value = Next
return(Next)
print("For loop")
print(fibo_for(Number))
@time_it
def fibo_while(Number):
i = 1
First_Value = 0
Second_Value = 1
while(i < Number+1):
if(i <= 1):
Next = i
else:
Next = First_Value + Second_Value
First_Value = Second_Value
Second_Value = Next
i = i + 1
return(Next)
print("While loop")
print(fibo_while(n))
# Recursive Function Beginning
@time_it
def fibo_recur(Number):
if(Number < 2):
return Number
else:
resultat=(fibo_recur(Number - 2)+ fibo_recur(Number - 1))
return(resultat)
print("Recursive")
print(fibo_recur(n))