Suite de Fibonacci, Exponentiation & Analyse de Complexité
Pour déterminer la complexité d'un algorithme récursif, on ne devine pas. On suit une méthode stricte :
Introduit par Léonard de Pise (Fibonacci) dans le Livre de l’abaque. L'objectif initial était d'étudier l'évolution d'une population de lapins.
| Mois (n) | Lapereaux (x) | Adultes (X) | Total F(n) |
|---|---|---|---|
| 1 | 1 | 0 | 1 |
| 2 | 0 | 1 | 1 |
| 3 | 1 | 1 | 2 |
| 4 | 1 | 2 | 3 |
| 5 | 2 | 3 | 5 |
On résout l'équation caractéristique \( r^2 - r - 1 = 0 \). Les racines incluent le nombre d'or \( \phi \).
⚠️ Bien que mathématiquement directe, cette méthode pose des problèmes de précision flottante sur ordinateur pour les grands nombres.
Fonction F(n)
Si n <= 1 Alors Retourne n
Sinon Retourne F(n-1) + F(n-2)
Fin Si
Analyse : Le nombre d'additions est \( P(n) = F(n+1) - 1 \).
La complexité explose de manière exponentielle : \( O(\phi^n) \).
Fonction F(n)
a = 1, b = 0
Pour i de 1 à n :
a, b = a + b, a
Retour b
Complexité : \( P(n) = n \). Simple et efficace pour la plupart des usages standards.
On utilise les formules de duplication pour sauter les étapes (méthode "Divide and Conquer").
La fonction \( G(n) \) retourne le couple \( (F(n), F(n+1)) \).
Fonction G(n) : (entier, entier)
Si n = 0 Alors Retour (0, 1)
// Appel récursif sur la moitié
(p, q) = G((n-1)/2)
Si n est pair Alors
Retour (2pq + q², q² + (p+q)²)
Sinon
Retour (p² + q², 2pq + q²)
FinSi
Soit la fonction \( f(n) \) définie par la récurrence :
| n | A(n) Appels |
|---|---|
| 1 | 1 |
| 2 | 3 |
| 3 | 5 |
| 4 | 7 |
On observe que \( A(n) = 2n - 1 \).
C'est donc une complexité Linéaire.
Pour l'optimiser en logarithmique, il faudrait utiliser la technique du couple (comme Fibonacci).
Même principe appliqué au calcul de puissance \( x^n \). Propriété clé : \( x^{2n} = (x^n)^2 \).
def e(x, n):
if n == 0 : return 1 // Arrêt
val = e(x, n // 2) // 1 seul appel récursif !
val = val * val
if n % 2 == 0 : return val // n pair
return val * x // n impair
1. Récurrence : \( A(n) = 1 + A(\lfloor n/2 \rfloor) \)
2. Résolution : \( A(n) = \lfloor \log_2(n) \rfloor + 2 \)
Le +2 provient de l'appel pour \( n=1 \) et de la condition d'arrêt \( n=0 \).