Bonjour à tous,

Je suis actuellement en prépa scientifique et je débute donc la programmation sur Python.
J'ai un exercice à faire et je n'arrive pas à le mener à terme.

L'exercice :

On pose u[0]=1 et, pour tout n dans N,

u[n+1] = 0.5* (u[n] + (n+1)/(u[n]))
et v[n] = somme de : 1/(u[k])^5 pour k allant de 0 à n

Ecrire une fonction f(n) retournant la valeur de v[n]. On fera attention à ce que le calcul de f[n] ne demande pas trop de (re)calculs inutiles. Ainsi, f(10**6) doit être calculer en largement moins d'une minute.


Ce que j'ai déjà fait :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
def suite_u(n): 
    u = 1
    for k in range(n):
         u = 0.5*(u + (k+1)/u)
    return u

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
def f(n):
    v = 0
    for t in range(n+1):
         v += 1/(suite_u(t))**5
    return v

Cependant, mon problème est que ces algorithmes ne sont pas assez optimisés pour répondre à la nécessité temporelle associée au calcul de f(10**6).
Pourriez-vous donc m'indiquer des techniques de les optimiser ???
Je suis très novice dans la matière.


MERCI !