Complexité Algorithmique en Temps
Complexité Algorithmique en Temps
complexité
2
Introduction :
Algorithme et algorithmique
Un algorithme est une méthode permettant de
résoudre un problème donné en un temps fini.
➔Un algorithme est une suite ordonnée
d'opérations ou d'instructions décrites pour la
résolution d'un problème donné.
Algorithmique désigne le processus de recherche
d’algorithme.
◦ Il n’existe pas d’algorithme pour créer des
algorithmes.
◦ Il existe quelques principes généraux que l’on peut
suivre.
3
Introduction :
Caractéristiques d’un bon algorithme
Correct : Résout correctement le problème pour lequel il a été
conçu ==> donne un résultat correct.
Complet : Considère tous les cas possibles == > donne un
résultat dans chaque cas.
Efficace : exécute sa tâche avec efficacité c’est à dire avec un coût
minimal. Le coût pour un ordinateur se mesure en termes de
temps de calcul et d’espace mémoire nécessaire.
NB : on attend d’un algorithme qu’il résolve de manière efficace le
problème à résoudre, quelles que soit le volume des données à
traiter.
La théorie de la complexité s’intéresse à
l’efficacité d’un algorithme
4
Complexité algorithmique :
Efficacité d’un algorithme
L’efficacité d’un algorithme peut être évaluée par :
◦ Sa rapidité : en terme de temps d’exécution
◦ Sa consommation de ressources : espace de stockage,
mémoire utilisé
NB : La rapidité d’un algorithme ne se mesure pas en
heures minutes et secondes sinon on doit implémenter
tous les algorithmes possibles avant de choisir un.
En plus ces mesures ne seraient pas pertinentes puisque
le même algorithme serait plus rapide sur une machine
plus puissante.
5
Complexité algorithmique : Types
L'efficacité d'un algorithme peut être évalué en temps et/ou en
espace :
◦ Complexité en temps : évaluation du temps d'exécution de
l'algorithme
◦ Complexité en espace : évaluation de l'espace mémoire
occupé par l'exécution de l'algorithme ➔ éviter les problèmes de
(mémoire insuffisante) : l’allocation dynamique de mémoire peut
réduire ce type de problème (Exemple : dans le cas d’utilisation de
matrice).
NB : Même si on s’intéresse quasi-exclusivement à la complexité en
temps des algorithmes. Il est parfois intéressant de s’intéresser à
d’autres ressources, comme la complexité en espace (taille de
l’espace mémoire utilisé), la largeur de bande passante requise, etc.
6
Complexité en temps
Pour un même problème supposons que nous avons deux
méthodes
On veut Evaluer l’efficacité de la méthode M
Comparer M avec une autre méthode M′ indépendamment
de l’environnement (machine, système, compilateur, . . .)
Evaluation du nombre d’opérations élémentaires en fonction
de la taille des données, de la nature des données.
Notations :
◦ n : taille des données en entrée,
◦ T ( n ) : nombre d’opérations élémentaires
7
Complexité en temps
Exemple 1 : échange de deux valeurs
entières
Méthode 1 : //Echanger x et y Méthode 2 : //Echanger x et y
x, y, z : entier; //Déclarations entier x, y; //Déclarations
x 5; y 20; //Initialisations x 5; y 20; //Initialisations
z x; x y-x;
x y; y y-x;
y z; x y+x;
11
Complexité en temps : Types
Exemple
Recherche d’un élément dans une liste de n éléments.
◦ La complexité au meilleur est que l’élément cherché soit le
premier élément testé dans la liste
T(n)=1 (comparaison).
◦ La complexité au pire est que l’élément cherché soit le
dernier élément testé dans la liste ou inexistant
T(n)=n.
◦ La complexité moyenne est NB : La complexité
T(n) = (1+2+3+…+n-1+n)/n en nombre de
T(n)= ((n(n+1))/2)/n = (n+1)/2 == comparaisons
> T(n) =(n+1)/2 .
13
Complexité en temps :
Règles de calcul
Structures de contrôle
Structures
Séquence
algorithmiques :
Embranchement (ou sélection)
Boucle (ou itération)
Structures de données
Constantes
Variables
Tableaux
Structures récursives (listes, arbres)
14
Complexité en temps :
Règles de calcul
Chaque instruction basique consomme une unité de
temps (affectation d’une variable, comparaison,
opération arithmétique : multiplication,…,)
Chaque itération d’une boucle rajoute le nombre
d’unités de temps consommées dans le corps de cette
boucle.
Chaque appel de fonction rajoute le nombre
d’unités de temps consommées dans cette fonction.
Pour avoir le nombre effectués d’opérations par
l’algorithme et avoir le total d’unités de temps on
additionne le tout.
15
Complexité en temps :
Règles de calcul
Structures de contrôle
16
Complexité en temps :
Règles de calcul
Structures de contrôle
3) Boucle
Somme des coûts des passages successifs
Tant que < condition > faire
T(n)=Σi=1..Nb Ti(n)
Traitement i : Ti (n)
Fin faire
Nb : nombre d’itérations
17
Notion de grand O :
Borne supérieure asymptotique
On dit que la fonction g est une borne supérieure asymptotique de
la fonction f ( ou bien f est un grand O de g) s’il existe une
constante positive c telle que pour n assez grand (∃n0>0 tel
que ∀n>n0 ) on a :
f(n)≤c*g(n)
On note alors
f(n)=O(g(n)) (ou f(n)O(g(n)) ).
Cela signifie qu'à partir d'un certain rang n0 la fonction f est
majorée par une c*g(n) (constante c (positive) fois la
fonction g) .
Il s'agit donc d'une situation de domination de la fonction f par
la fonction g .
18
Interprétation graphique de la notion de grand O : A partir du rang
n0, la courbe de f est au dessous de celle de c*g .
Exemples de relations grand O :
◦ Si T(n)=4 alors T(n)=O(1) : (par exemple c=5 et n0=0 ).
◦ Si T(n)=3n+2 alors T(n)=O(n). (par exemple c=4et n0=2) .
◦ Si T(n)=3n+2 alors T(n)=O(n2)) ((par exemple c=1et n0=5) )
◦ Si T(n)=2n2+3 alors T(n)=O(n2)) . (par exemple c=3 et n0=3) .
19
Notion de grand Oméga :
Borne inférieure asymptotique
On dit qu’une fonction g est une borne inférieure
asymptotique d’une fonction g (ou f est un grand Oméga
de g) s’il existe une constante positive c (∃c > 0) telles que
pour n assez grand (∃n0>0 tel que ∀n>n0) on a :
c*g(n) ≤ f(n)
On dit aussi que f est un grand Oméga de g et on note
f(n)=Ω(g(n)) (ou f(n)Ω(g(n)) )
A partir d'un certain rang n0 la fonction f est minorée
par une constante ( c*g(n)) c fois la fonction g
(c*g(n)).
Il s'agit donc d'une situation de domination de la
fonction g par la fonction f .
20
Interprétation graphique de la notion de grand Oméga : A partir du
rang n0 , la courbe de f est au dessus de celle de c fois g .
Exemples de relations grand Oméga
◦ Si T(n)=4 alors T(n)=Ω(1) . (par exemple c=1 et n0=0 ).
◦ Si T(n)=3n+2 alors T(n)=Ω(n) . (par exemple c=1et n0=0)
◦ Si T(n)=2n2+3 alors T(n)=Ω(n2) . (par exemple c=1 et n0=1)
◦ Si T(n)=2n2+3 alors T(n)=Ω(n) . (par exemple c=1 et n0=1)
21
Notion de grand Théta « Θ »:
Borne approchée asymptotique
On dit qu’une fonction g est une borne approchée asymptotique
d’une fonction f s’il existe deux constante strictement positives c1 et c2
(∃c1>0, ∃c2>0) telles que pour n assez grand (∃n0>0) on a :
∀n>n0, 0 ≤ c1.g(n) ≤ f(n) ≤ c2.g(n)
On dit aussi que f un grand Théta de g et on note :
f(n)=Θ(g(n)) (ou f(n)Θ(g(n))) .
Cette situation combine les deux précédentes, à partir d'un certain rang
n0 la fonction f est encadrée par des multiples de la fonction g . Cela
signifie que les fonctions f et g sont du même ordre de grandeur
à un facteur constant près pour n assez grand.
Remarque :
f(n)=Θ(g(n)) ⇔ (f(n)=O(g(n)) et f(n)=Ω(g(n)))
22
Interprétation graphique de la notion de grand Théta
Remarque :
f(n)=Θ(g(n)) ⇔ (f(n)=O(g(n)) et f(n)=Ω(g(n)))
Exemples de relations grand Théta
◦ Si T(n)=4 alors T(n)=Θ(1) . (4 =O(1) et 4 =Ω(1))
◦ Si T(n)=3n+2 alors T(n)=Θ(n) . (3n+2 =O(n) et 3n+2 =Ω(n))
◦ Si T(n)=2n2+3 alors T(n)=Θ(n2) . (2n2+3 =O(n) et 2n2+3 =Ω(n))
23
Notion d'équivalence
Equivalence : On dit qu’une fonction f est équivalente à
une fonction g si et seulement si
Limn→∞ f(n)/g(n)=1
On note alors f(n)∼g(n) .
Exemple : F(n)=n2+2n+4 et g(n) = n2+3
Il faut bien comprendre que cette notion est plus forte que
celle de grand Théta, car non seulement les fonctions sont
du même ordre de grandeur mais leur quotient tend vers 1.
24
Notion de dominance
On dit qu’une fonction f domine une fonction
g si on a
Limn→∞ f(n)/g(n)= +
On dit qu’une fonction f est dominé par une
fonction g si on a
Limn→∞ f(n)/g(n)=0
25
Complexité en temps :
Algorithme récursif
● Il est souvent possible de retrouver une relation de récurrence
qui décrit le temps d'exécution d’un algorithme récursif en
fonction des temps d'exécution des appels récursifs résolvant les
sous-problèmes associés de tailles inférieures.
● le temps d’exécution d’un algorithme récursif est souvent facile à
déterminer à l’aide des récurrences.
26
Exemple de récurrence : fonction Factorielle
On considère l’opération de multiplication comme opération
élémentaire. À chaque appel récursif, l’algorithme effectue une
multiplication.
Soit T(n) désignant l’estimation du temps d’exécution, l’équation
de récurrence associée est donnée par:
D’ouT(n)= O(n)
28
Exemple de récurrence :
Tours de Hanoi Procédure Hanoï(n, départ, Intermédiaire,
destination) Début
On veut calculer la Si (n>0) alors
Hanoï(n-1, départ, destination, Intermédiaire)
complexité en deplacer(départ, destination)
nombre de // opération élémentaire
déplacements Hanoï(n-1, Intermédiaire, départ, destination)
invoqués sur n Fin Si
disques Fin
temps pour déplacer les (n-1)
T(n) = T(n-1) + 1 + T(n-1) disques de la tige intermédiaire
vers la tige destination.
temps pour déplacer les (n-1)
disques de la tige 1 de départ une opération de déplacement du
à la tige intermédiaire. disque de la tige de départ vers
la tige destination.
T(n) = 1 si n=1
2T(n-1) +1 si n>1
29
Exemple de récurrence : Tours de Hanoi
Résolution :
T(n) = 2T(n-1)+1
= 2[2T(n-2)+1]+1
= 2[22 T(n-3)+ 2 +1]+1
= 23 T(n-3)+ 22 +21 +1
= …
= 2n-1 T(1)+ 2n-2 + …+21+ 20
n−1
1− q n
n−1
q =
i
T(n) = 2 i= 2n-1 i= 0 1− q
i=0
T(n)=O(2n) : Exponentiel
30
Equation de récurrence linéaire
d’ordre k
● Une équation récurrente est dite linéaire d’ordre k si chaque terme
de la suite récurrente s’exprime comme combinaison linéaire des k
premiers termes qui le précèdent plus une certaine fonction de n.
T(n) = a1T(n-1) + a2T(n-2) + … + akT(n-k) +f(n)
T (n) = a ( T(0)+
n f (i)
ai )
i=1
31
Application – Tours de Hanoï
On a :
T(n) = 2T(n-1) +1
Il s’agit d’une récurrence linaire d’ordre 1, k=1
On applique la formule
n
T (n) = a ( T(0) +
n f (i)
ai )
i=1
T (n) = 2 ( 1+
n 1
2i )
i=1
32
Equation de récurrence linéaire sans
second membre
Lorsque f(n)=0, l’équation de récurrence est dite linéaire sans
second membre :
T(n) = a1T(n-1) + a2T(n-2) + … + akT(n-k)
On a :T(n) - a1T(n-1) - a2T(n-2) - … - akT(n-k) = 0
A cette équation, on associe un polynôme caractéristique :
P(x) = xk - a1xk-1- a2xk-2- … - ak-1x1 - akx0
Si la résolution de ce polynôme (P(x)=0) donne k racines distinctes r i,
i=1..k.
La solution de l’équation de récurrence est donnée par la formule
suivante :
T (n) = 1 (r1)n + 2 (r2)n+ . . . + k (rk)n
Les αi sont déterminés à partir des k premiers termes.
Cette solution est en général exponentielle.
33
Application – Suite de Fibonacci
On considère la suite de Fibonacci donnée par la relation
de récurrence :
1 si n = 0 ou n = 1
Fib(n) =
Fib(n −1) + Fib(n − 2) sinon
34
Application – Suite de Fibonacci
L’équation x2-x-1=0 admet deux racines r1 et r2 tels que :
1+ 5 r2 = 1- 5
r1 =
2 2
1 si n = 0 ou n = 1
T(n) =
1 ( 1+ 5 )n + 2 ( 1- 5 )n sinon
2 2
35
Application – Suite de Fibonacci
On détermine α1 et α2 à partir des conditions initiales
1 + 2 = 1 5+ 5
T (0) = 1 1 =
10
T (1) =1 1 (
1+ 5 n 1− 5 n
) + 2 ( ) =1 2 = 5 − 5
2 2 10
D’où F(n) est définie par :
5 + 5 1+ 5 n 5 − 5 1− 5 n
T (n) = 10 ( ) + ( )
2 10 2
1+ 5 Complexité
T(n) = O( ( )n) exponentielle
2
36
Paradigme «Diviser pour Régner »
● La majorité des algorithmes récursifs suivent le paradigme «
diviser- pour-régner». Suivant ce paradigme, un problème est
résolu d’une manière récursive en trois étapes à chaque niveau
de la récursivité:
● Diviser: le problème initial en un certain nombre de sous-
problèmes similaires de tailles plus petites.
● Régner: sur les sous-problèmes en les résolvant de façon
récursive. Si la taille d’un sous-problème est suffisamment
réduite, on a une résolution directe.
● Combiner: les solutions des sous-problèmes pour produire
le solution globale du problème originel.
37
Analyse des algorithmes «diviser-pour-régner»
Soit un algorithme récursif qui suit le paradigme « diviser-pour-
régner » pour la résolution d’un problème de taille n.
Si la taille du problème est suffisamment petite (n ≤c pour une
certaine constante c) alors la résolution est directe et consomme
un temps constant O(1).
Supposons que l’on divise le problème initial en a sous-problèmes,
chacun de taille n/b. Le temps d'exécution total T(n) de
l’algorithme est donné par la récurrence ayant la forme suivante:
T(n) = O (1) si n c
aT( n/b ) + D(n) + C(n) sinon
38
Analyse des algorithmes «diviser-pour-
régner»
T(n) = O (1) si n c
aT( n/b ) + D(n) + C(n) sinon
39
Exemple 1 -Maximum
Recherche du maximum dans un tableau, soit T(n) la complexité
en nombre de comparaisons, n est la taille du tableau.
Fonction Maximum(T : Tableau , indDeb, indFin : entier) : entier
Var : M : entier
Début
Si ( indDeb = indFin) alors retourner (T[indDeb])
Sinon
M = (indDeb+indFin)/2 // division du problème
max1 = Maximum (Tab, indDeb, m ) // régner sur le 1er sous-problème
max2 = Maximum (Tab, m+1, indFin)// régner sur le 2ème sous-problème
Si (max1 > max2) alors // combiner les solutions
retourner (max1)
Sinon retourner (max2) Complexité :
FinSi T(n)=2T(n/2)+1
FinSi
Fin une comparaison
40
Exemple 2 : Tri par fusion
41
Exemple 2 : Tri par fusion
Principe : On part du fait que trier un tableau de taille
N, c'est trier deux tableaux de taille N/2. Une fois les
deux tableaux sont triés, il suffit de les fusionner de sorte
à ce que le tableau final soit trié. Ce tri utilise une notion
de récursivité. Fonction Tri_Fusion (T : tableau[N] , deb, fin) :
Algorithme : tableau[N]
Variables : mil : entier; T1,T2 : tableau[N/2]
Début
Si (deb >= fin) alors Retourner T ;
Sinon
mil = (deb + fin) Div 2
T1 = Tri_Fusion (T, deb, mil) ;
T2 = Tri_Fusion (T, mil+1, fin)) ;
Retourner (Fusion (T1,T2) );
Finsi
FIN
42
Exemple 2: Tri par fusion
Exemple : Trier la séquence (5,2,4,7,1,3,2,6)
phase de descente
5 2 4 7 1 3 2 6
5 2 4 7 1 3 2 6
5 2 4 7 1 3 2 6
43
Exemple 2: Tri par fusion
phase de remonté
44
Exemple 2: Fusion
Fonction Fusion (T1,T2) : tableau entier
T1 : tableau entier [1...N] ;T2 : tableau entier [1...M]; T: tableau
entier [1...M+N]; i, j: entier; i←1 ;j←1 ;
Tantque (i+j-1 <> N+M) faire
Si (i ≤ N) alors
si (j ≤ M) alors
si (T1[i] < T2[j]) alors T[i+j-1]←T1[i] ;
i←i+1 ; sinon
T[i+j-1]←T2[j] ; j←j+1 ;
Fin si
sinon T[i+j-1]←T1[i]; i←i+1;
Fin si
sinon T[i+j-1]←T2[j] ; j←j+1 ;
Fin si
FinTanque
36 Retourner T ; Tfusion = O(n)
FIN
45
Exemple 2: analyse du tri par fusion
L’algorithme Tri_Fusion réalise les étapes suivantes:
◦ Diviser : diviser la suite de n éléments en deux sous-suites
de n/2 éléments chacune (complexité est donc en O(1)).
◦ Régner : trier les deux sous-tableaux, de tailles respectives
(n/2), de manière récursive en utilisant le tri par fusion,
d’où une complexité en 2T(n/2).
◦ Combiner : fusionner les deux sous-tableaux pour
produire la réponse. La complexité de cette étape est celle
de l’algorithme de fusion qui est de O(n) pour la
construction d’un tableau solution de taille n.
La récursivité s’arrête quand la séquence à trier a une
longueur égale à 1 : O(1).
T(n)=2T(n/2)+ Tfusion=2T(n/2)+ O(n)
46
Exemple 2: arbre des appels récursifs
On peut retrouver le même résultat pour la récurrence
T(n)=2T(n/2)+c.n en cumulant les coûts à chaque niveau de
récursivité, soit l’arbre récursif suivant:
cn cn
cn
cn/2 cn/2
cn
log2(n) cn/4 cn/4 cn/4 cn/4
c c c c c c c c cn
n
Total =c.n (log2(n)+1) = c.n log2(n)+ c.n
47
Analyse des algorithmes «diviser-pour-
régner»
Si les étapes « Diviser » et « Combiner » d’un
algorithme « diviser-pour-régner » prennent en tout un
temps f(n), alors la fonction T(n) prend la forme
suivante:
48
Résolution des récurrences des algorithmes «
diviser-pour-régner » :
Théorème :
Soit T(n) une fonction définie pour les entiers
positifs par la récurrence : T(n) = aT(n/b) + [Link]
avec a ≥ 1 , b > 1 et k ≥ 1,
T(n) peut être bornée asymptotiquement de la
façon suivante:
◦ cas 1 : Si a > bk alors T(n) = O(nlogb(a) )
◦ cas 2 : Si a = bk alors T(n) = O(nk .logb(n))
◦ cas 3 : Si a < bk alors T(n) = O(nk)
49
Résolution des récurrences des algorithmes
« diviser-pour-régner » : Interprétation
Dans chacun des trois cas, on compare la fonction f(n)=[Link] à
la fonction nlogba .
Intuitivement, la solution de la récurrence est déterminée par la
plus grande des deux fonctions pour n assez grand.
Si c’est la fonction nlogba qui est la plus grande (cas 1) alors la
solution est T(n)=O(nlogba )
Si c’est la fonction f(n) qui est la plus grande (cas 3), alors la
solution est T(n)=O(nk)
Si les deux fonctions ont le même comportement asymptotique
(cas 2), on multiplie par un facteur logarithmique et la solution
est donnée par : T(n)= O(nlogb(a).logb n)=O(nk logb n)
50
Applications
(1) Recherche du Maximum : T(n) = 2T(n/2) + 1
On a : a = 2 , b = 2 et k=0 (1=n0)
Puisque a>bk la solution de recurrence est :
T(n) = O(nlogb(a) )
Or logba=log2(2)=1 d’ou T(n) = O(n)
51
Applications
Considérons les récurrences suivantes:
(3) T(n)=9T(n/3)+n
52
Classes de complexités en temps
Complexité constante O(1) : pas d'augmentation du temps
d'exécution quand le paramètre croit.
Complexité logarithmique O(log(n)) : augmentation
très faible du temps d'exécution quand le paramètre croit.
◦ Exemple : algorithmes qui décomposent un problème en
un ensemble de problèmes plus petits (Recherche
dichotomique).
Complexité linéaire O(n) : augmentation linéaire du temps
d'exécution quand le paramètre croit (si le paramètre double,
le temps double).
◦ Exemple : Algorithmes qui parcourent séquentiellement
des structures linéaires (Recherche dans un tableau).
53
Classes de complexités en temps
Complexité quasi-linéaire O(nlog(n)) : augmentation un
peu supérieure à O(n).
◦ Exemple : algorithmes qui décomposent un problème en
d'autres plus simples, traités indépendamment et qui combinent
les solutions partielles pour calculer la solution générale (Tri
fusion).
Complexité quadratique O(n2) : quand le paramètre double,
le temps d'exécution est multiplié par 4.
◦ Exemple : algorithmes avec deux boucles imbriquées.
Complexité polynomiale O(ni) .
== >Quand le paramètre double, le temps d'exécution
est multiplié par 2i.
◦ Exemple : algorithme utilisant i boucles imbriquées.
54
Classes de complexités en temps
Complexité exponentielle O(in) : quand le paramètre double,
le temps d'exécution est élevé à la puissance 2.
Complexité factorielle O(n!) : asymptotiquement équivalente
à nn
Encore pire : la fonction d'Ackerman
◦ Ack(0,0) = 1
Fonction Ackerman
◦ Ack(1,1) = 3, Début
◦ Ack(2,2) = 7, si (m = 0) alors Ack(m,n) = n+1
Sinon si ((n=0) et (m > 0)) alors
◦ Ack(3,3) = 61, Ack(m,n) = Ack(m-1,1) Sinon
Ack(m,n) = Ack(m-1, Ack(m,n-1))
55
Représentation graphique des
fonctions de référence
f(n)
n3
n2
2n
[Link](n)
n
Log(n)
n
56
Exemples de temps d’exécution en fonction de la taille de la
donnée et de la complexité de l’algorithme si on suppose
qu’une instruction est de l’ordre de s
57
Complexité en espace mémoire
58
Complexité en espace mémoire
Structures de données
Une structure de données indique la manière d'organisation
des données dans la mémoire.
Le choix d'une structure de données adéquate dépend
généralement du problème à résoudre.
Deux types de structures de données :
◦ Statiques : Les données peuvent être manipulées dans la
mémoire dans un espace statique alloué dès le début de
résolution du problème. Ex : les tableaux
◦ Dynamiques : On peut allouer de la mémoire pour y
stocker des données au fur et à mesure des besoins de la
résolution du problème. Ex: liste chainée, pile, file, …
notion des pointeurs : nécessité de la gestion des liens
entre les données d'un problème en mémoire.
59
Conclusion
Loi de Moore (empirique) : évolution
technologique : à coût constant, la rapidité
des processeurs double tous les 18 mois (les
capacités de stockage suivent la même loi).
Constat : le volume des données
stockées dans les systèmes d'informations
augmente de façon exponentielle.
Conclusion : il vaut mieux optimiser ses
algorithmes qu'attendre des années qu'un
processeur surpuissant soit inventé.
60
Quelques calculs de sommes
usuelles
Soit n ∈ ℕ∗ et q ∈ ℝ. On a :
◦ Somme de n termes constants :
∑k=1..n q=n×q
◦ Somme des n premiers entiers :
∑k=1..nn=(n×(n+1))/2
◦ Somme des n premiers carrés d'entiers :
∑k=1..n k2=(n×(n+1)×(2n+1))/6
◦ Somme des n premiers termes d'une suite géométrique :
∑k=0..n qk=(1−qn+1)/(1−q)
Soit q ∈ ℝ.
◦ Si q<1, on a : ∑j=0..r qj ≤1/(1−q)
◦ Si q>1, on a : ∑j=0..r qj ≤qr(1+(1/(q−1))
61