{{{id=1|
def fiboRecur(n):
""" suite de Fibonacci, récursif"""
if(n<2):
return 1
else:
return fiboRecur(n-1)+fiboRecur(n-2)
def fiboIter(n):
""" suite de Fibonacci, non récursif"""
a=1
b=1
for i in range(1,n):
a,b=b,a+b
return b
def temps(n,ff):
""" détermine le temps de calcul de ff(n) """
t = cputime()
r = ff(n)
return cputime()-t
///
}}}
{{{id=39|
# test naïf de validité
[fiboRecur(k) for k in range(15)]
[fiboIter(k) for k in range(15)]
///
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
}}}
{{{id=40|
fiboRecur(35)
///
14930352
}}}
{{{id=2|
# liste de temps de calculs avec la procédure récursive
FiRec = [[n,temps(n,fiboRecur)] for n in range(23,36)]
list_plot(FiRec)
///
}}}
{{{id=3|
# calcul et affichage des logarithmes
N = [[p[0],ln(p[1])] for p in FiRec]
list_plot(N)
///
}}}
{{{id=6|
# un ajustement linéaire sur les log semble pertinent !
var('a b')
h(x) = a*x+b
A=find_fit(N[1:],h,solution_dict=True)
A[a],A[b]
///
(0.47973203247579821, -14.551817546368314)
}}}
{{{id=7|
list_plot(N)+plot(x*A[a]+A[b],(x,21,38),color='red')
///
}}}
{{{id=8|
# il y a du nombre d'or dans l'air
exp(A[a]); numerical_approx((1+sqrt(5))/2,digits=6);fiboIter(5000)/fiboIter(4999).numerical_approx(digits=6)
///
1.6156414047536287
1.61803
1.61803
}}}
{{{id=45|
temps(5000,fiboIter)
///
0.0080010000000001469
}}}
{{{id=31|
L = [[n,temps(10000*n,fiboIter)] for n in range(20)]
list_plot(L)
///
}}}
{{{id=32|
# un ajustement second degré
var('a b c')
k(x) = a*x^2+b*x+c
B=find_fit(L,k,solution_dict=True)
B[a],B[b],B[c]
///
(0.00062295744826434962, 0.0012954528002819821, 0.0035637032445747785)
}}}
{{{id=46|
list_plot(L)+plot(x^2*B[a]+B[b]*x+B[c],(x,0,20),color='red')
///
}}}
{{{id=34|
# récursivité avec conservation des résultats antérieurs
# bien plus rapide que la récursivité naïve, bien sûr !
from functools import wraps
def memo(func):
cache={}
@wraps(func)
def wrap(*args):
if args not in cache:
cache[args]=func(*args)
return cache[args]
return wrap
@memo
def fibon(i):
if i<2:
return 1
return fibon(i-1)+fibon(i-2)
///
}}}
{{{id=48|
M = [[n,temps(300*n,fibon)] for n in range(20)]
list_plot(M,color="green")
///
}}}
{{{id=49|
# limitation : nombre d'étapes de récursivité autorisés
fibon(10000)
///
WARNING: Output truncated!
full_output.txt
Traceback (most recent call last):
File "", line 1, in
File "_sage_input_46.py", line 10, in
exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("IyBsaW1pdGF0aW9uIDogbm9tYnJlIGQnw6l0YXBlcyBkZSByw6ljdXJzaXZpdMOpIGF1dG9yaXPDqXMKZmlib24oMTAwMDAp"),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single')
File "", line 1, in
File "/tmp/tmptE_HHy/___code___.py", line 3, in
exec compile(u'fibon(_sage_const_10000 )' + '\n', '', 'single')
File "", line 1, in
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
...
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
File "/tmp/tmpgIUtj7/___code___.py", line 21, in fibon
return fibon(i-_sage_const_1 )+fibon(i-_sage_const_2 )
File "/tmp/tmpgIUtj7/___code___.py", line 12, in wrap
cache[args]=func(*args)
RuntimeError: maximum recursion depth exceeded
}}}
{{{id=50|
# manipulation rapide de nombres gigantesques (affichage du nombre de chiffres)
ln(fiboIter(500000)*1.)/ln(10.)
///
104493.679627627
}}}
{{{id=36|
# calcul des nombres de Fibonacci par les puissances d'une matrice
def puissance(M,n):
if n==0:
return Matrix(2,2,[1,0,0,1])
if n%2==0:
P = puissance(M,n/2)
return P*P
else:
P = puissance(M,(n-1)/2)
return P*P*M
def fiboPuiss(n):
M = Matrix(2,2,[1,1,1,0])
P = puissance(M,n)
return P[0][0]
///
}}}
{{{id=38|
[fiboPuiss(k) for k in range(15)]
///
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
}}}
{{{id=42|
# efficacité comparée des algorithmes itératif et par puissances
Ntest = 500000
temps(Ntest,fiboIter);temps(Ntest,fiboPuiss)
///
1.5800990000000041
0.028001999999993643
}}}
{{{id=44|
///
}}}