Psi 945 – 2015/2016
http://blog.psi945.fr DS 5 – 23/01/2016
Le sujet est composé d’un exercice (probabilités pour analyser un programme
Python) et d’un problème (séries entières, intégration) complètement
indépendants.
1 Probabilités
Pour ce problème, on donne le programme Python suivant :
1def injective(p, N):
2valeurs_prises = [False for _ in range(N)]
3images = []
4for compteur in range(p):
5y = randint(0, N-1)
6while valeurs_prises[y]:
7y = randint(0, N-1)
8images.append(y)
9valeurs_prises[y] = True
10 return images
On rappelle que randint(a, b) renvoie un entier aléatoire de [[a, b]] (chacun avec la même
probabilité).
1. Analyse du fonctionnement du programme :
On suppose qu’on exécute injective(p, N), avec 26p6N.
(a) Lors du premier passage à la ligne 6:
Quelles sont les valeurs des variables valeurs_prises, images, compteur, y ?
Que vaut valeur_prises[y] ?
Est-ce que la ligne 7est exécutée après ce premier passage à la ligne 6?
(b) Lors du deuxième passage à la ligne 6, expliquer ce qui peut se passer, selon la
valeur de yqui aura été affectée juste avant (au deuxième passage à la ligne 5).
(c) On suppose qu’au deuxième passage dans la boucle 49on passe à la ligne 8.
Que vaut images avant et après l’exécution de cette ligne ?
(d) On suppose que l’exécution conduit à la ligne 10. Que dire alors de la valeur
retournée ? Donner un exemple possible si (p, N ) = (5,10).
2. Analyse de la complexité du programme :
L’exécution du programme étant soumise à l’aléa des randint, son temps d’exécu-
tion n’est pas constant. Pour évaluer la complexité temporelle, on peut s’intéresser au
nombre d’appels à la fonction randint, qui peut être vu comme une variable aléatoire,
qu’on notera X. On va par ailleurs noter, pour 06c < p,Xcle nombre d’appels à la
fonction randint lorsque compteur vaut c. On a donc X=
p1
P
c=0
Xc.
(a) Montrer que l’exécution de injective(p, N) peut ne pas terminer.
La variable aléatoire Xest donc seulement définie lorsque le programme termine.
(b) Montrer qu’en cas de terminaison, on a X>p, et que pour p>2, il n’existe pas
de majorant a priori de X.
1
(c) Que vaut X0?
(d) Lorsque compteur vaut 1, montrer qu’on passe une première fois à la ligne 7avec
probabilité 1
N·
Pour k > 1fixé, quelle est la probabilité pour qu’on y passe au moins kfois ? Et
exactement kfois ? Identifier précisément la loi de X1.
(e) Donner (avec une rapide justification) la loi de X2, puis celle de Xc, pour 16c<p.
(f) Donner, pour 06c < p, la valeur de E(Xc)en fonction de c, p et N.
Exprimer enfin E(X)en fonction de pet N(et simplifier l’expression obtenue).
C’est l’espérance de Xqu’on peut raisonnablement prendre comme « complexité moyenne »
du programme.
3. Deux cas particuliers :
(a) Lorsque N= 2p, montrer : E(X)Kp lorsque ptend vers +, avec Kune
constante qu’on précisera.
(b) Lorsque N=p, que dire du résultat retourné par injective(p, N) ? Donner
alors un équivalent simple de Xlorsque ptend vers +.
4. Terminaison :
On suppose qu’on exécute injective(p, N) avec 26p6N.
(a) Lorsque compteur vaut 0, montrer qu’on passe de façon certaine à la ligne 8.
(b) Lorsque compteur vaut 1, montrer qu’avec probabilité 1on passe à la ligne 8.
(c) Montrer que si p>4, alors avec probabilité 1,compteur passera à la valeur 3lors
de l’exécution du programme.
(d) Conclure !
5. Un petit malin explique « qu’on aurait pu s’en sortir sans le tableau de booléen, via
un test de la forme while y in images: ce qui aurait eu le bon goût d’améliorer la
lisibilité et la complexité de ce programme. »
Commenter la remarque de cet impertinent !
2 Intégration : extrait de CCP 2012 PC (maths 2)
2
3
4
1 / 4 100%