Je vous propose un petit paradoxe concernant un algorithme (sans paramètre) dont on démontre d'une part qu'il termine à coup sûr, et d'autre part qu'il utilise en moyenne une infinité d'opérations ! Paradoxe ?
Evidemment, il existe des algos qui terminent à coup sûr et dont on ne peut pas borner le nombre d'opérations indépendamment des paramètres : par exemple, pour calculer le pgcd de deux entiers a et b, le nombre d'opérations dépend des entiers a et b, et en prenant des entiers a et b de plus en plus grands, on peut augmenter autant que l'on veut le nombre d'opérations. Mais dans l'exemple ci-dessous, nous ne sommes pas dans le même contexte car il n'y a pas de paramètre...
Voici le principe de l'algorithme : on veut tirer au hasard un entier k>0 en suivant la loi de probabilité P(X=k) = 1/k(k+1). Ceci est cohérent car .
Pour simuler en machine un tel tirage aléatoire, on utilise l'algo suivant qui transforme un tirage aléatoire uniforme dans ]0, 1[ (fonction prédéfinie dans tout langage, genre "rand") en un tirage sur N* suivant la loi donnée ci-dessus :
- Code: Tout sélectionner
f := la fonction x +--> 1/x(x+1)
r := un nombre tiré au hasard dans ]0, 1[ suivant la loi uniforme
s := 0
i := 0
tant que s < r répéter la boucle
i := i + 1
s := s + f(i)
fin de boucle
retourner la valeur de i
(certes, on peut gagner une étape de calcul en initialisant i à 1 et s à f(1), mais cela ne change rien à l'affaire :lol3:)
(quitte à changer la fonction f, cet algo fonctionne pour toute loi de probabilité sur les entiers naturels)
*Est-ce que cet algorithme se termine ? Oui, car les sommes partielles tendent vers 1 et finiront tôt ou tard par dépasser r puisque r<1.
**Est-ce que cet algorithme donne un tirage aléatoire respectant la loi de probabilité P(X=k) = 1/k(k+1) ? Oui : la probabilité de renvoyer un certain entier k est la probabilité que r soit coïncé dans l'intervalle I dont les bornes sont les sommes partielles consécutives et , autrement dit . Or I est un intervalle de longueur f(k) = 1/k(k+1), et comme r est tiré de manière uniforme, il en résulte que
***Quel est le nombre moyen d'additions lorsque l'on fait tourner cet algo ? Pour retourner un nombre k, l'algorithme a besoin de calculer k additions (car k tours de boucle). De plus la probabilité de retourner k est P(X=k)=1/k(k+1), donc l'espérance du nombre d'additions (autrement dit le nombre "moyen" d'additions) est ! :doh:
Ainsi cet algorithme donne en un temps fini un résultat correct qui nécessite en moyenne une infinité d'additions... :ptdr: