Le DS2 des MPSI

Download Report

Transcript Le DS2 des MPSI

MPSI 831
Lycée Masséna
DS 2 : Devoir d’informatique numéro 2
1
Petits exercices entre amis
Exercice 1. Calcul approché de π par la méthode de la cible. La fonction random, importée du module random (ayant
le même nom), ne prend pas d’argument et renvoie un flottant tiré aléatoirement dans l’intervalle [0, 1[. Par exemple :
>>> from random import random
>>> random()
0.793327043412963
>>> random()
0.10601837430821237
1. En utilisant la fonction random() (qu’on suppose déja importée), écrire une fonction tombe_disque(), ne prenant
pas d’argument, qui tire aléatoirement deux flottants x et y dans l’intervalle [0, 1[, et teste si le couple (x, y) est
dans le disque de centre 0 et de rayon 1 : la fonction renvoie True ou False.
2. Écrire ensuite une fonction tirage(N), prenant en entrée un entier N > 0, réalisant N appels à la fonction
tombe_disque(), et renvoyant le nombre de fois où tombe_disque() a renvoyé True.
3. On admet que si N est grand, tirage(N) renvoie avec forte probabilité un entier très proche de N × A, où A est
le quart de l’aire du disque de centre 0 et de rayon 1. Écrire une fonction approximation_pi(N) faisant appel
à tirage(N) et renvoyant une approximation de π. Par exemple :
>>> approximation_pi(100000)
3.1458
Exercice 2. Une fonction de tri . On a vu en TP un algorithme qui triait un tableau dans l’ordre croissant, vous allez
ici en écrire un autre.
1. Écrire une fonction echanger(T,i,j) prenant en entrée un tableau contenant au moins deux éléments, et deux
indices i et j distincts compris entre 0 et n − 1, où n est la taille du tableau (il est inutile de vérifier tout ça).
Votre fonction (qui ne renvoie rien) doit échanger les éléments en positions i et j de T.
On suppose que la variable T contient un tableau non vide d’entiers, et on considère la suite d’instructions
suivantes :
for i in range(len(T)-1):
if T[i]>T[i+1]:
echanger(T,i,i+1)
2. Si T etait égal au tableau [6,4,7,3,5,1] avant la suite d’instructions, expliquez ce qui se passe et ce que contient
le tableau T après la suite d’instructions.
3. Justifiez à l’aide d’un invariant de boucle que pour tout tableau non vide T, si l’on effectue cette suite d’instructions, alors l’élément maximal de T se retrouve à la fin du tableau après la suite d’instructions.
4. Que se passe-t-il si on l’exécute une deuxième fois ?
5. En vous inspirant de cette suite d’instructions, écrire une fonction tri(T) qui trie le tableau passé en entrée, en
faisant des échanges d’éléments contigus (à l’aide de la fonction echange).
Svartz
Page 1/3
2014/2015
MPSI 831
Lycée Masséna
Problème : Points fixes de fonctions à support fini
Dans ce problème, on s’intéresse aux points fixes des fonctions f : En → En , où En = {0, 1, 2, . . . , n − 1}, avec n un
entier strictement positif. Pour représenter une telle fonction f en Python, il suffit de se donner un tableau de taille n
(n est accessible par len(T)). L’élément d’indice i de T indique l’image de i par f , accessible par T[i]. Par exemple,
le tableau [2,1,4,3,3] de taille 5 représente une fonction f de E5 = {0, 1, 2, 3, 4} vers lui même, avec f (0) = 2,
f (1) = 1, f (2) = 4 et f (3) = f (4) = 3.
Dans ce problème, on demande d’écrire des fonctions prenant en entrée un tel tableau. On supposera systématiquement qu’un tableau de taille n passé en entrée représente bien une fonction de En vers lui-même, c’est-à-dire que
ses éléments sont bien dans l’ensemble En . Il n’est pas demandé de le vérifier.
Question 1. On dit qu’un entier i de En est un point fixe de f si f (i) = i. Dans l’exemple ci-dessus, 1 et 3 sont deux
points fixes de f , et ce sont les seuls. Dans les deux cas suivants, donnez rapidement le tableau associé à f et indiquez
si f possède des points fixes, et si oui, lesquels.
a. n = 6 et f : i 7→ i + (−1)i .
b. n = 10 et f : i 7→ le chiffre des unités de 2i + 1.
Question 2. Écrire une fonction admet_point_fixe(T), qui prend en entrée un tableau représentant une fonction,
et qui renvoie un booléen (True ou False) suivant si la fonction possède un point fixe ou non.
>>> T1=[2,1,4,3,3] ; T2=[1,0]
>>> admet_point_fixe(T1)
True
>>> admet_point_fixe(T2)
False
Question 3. Écrire une fonction plus_petit_point_fixe(T), prenant en entrée un tableau représentant une fonction
f dont on suppose qu’elle possède un point fixe (il est inutile de le vérifier), et renvoyant le plus petit i tel que f (i) = i.
>>> plus_petit_point_fixe(T1)
1
1.1
Itérés d’un élément par une fonction
Pour f une fonction En → En , k ∈ N et x ∈ En , on note f k (x) l’itéré k-ième de x par f , autrement dit
f (f (...f (x)) . . . ) avec k itérations. On convient que f 0 (x) = x. On note f k la fonction x 7→ f k (x), de En dans
lui-même.
Question 4. Écrire une fonction itere(T,x,k) qui prend en premier argument un tableau T représentant une fonction
f : En → En , en deuxième argument un entier x de En , et en troisième argument un entier k ≥ 0, et renvoie f k (x).
Question 5. Écrire une fonction fonction_iteree(T,k) prenant en entrée un tableau T représentant une fonction
f : En → En , en deuxième argument un entier k ≥ 0 et renvoyant le tableau associé à f k . On utilisera la fonction
précédente, et on ne modifiera pas le tableau T (on créera un autre tableau).
1.2
Attracteur principal
Un élément z ∈ En est dit attracteur principal de f : En → En si et seulement si z est un point fixe de f , et si pour
tout x ∈ En , il existe un entier k ≥ 0 tel que f k (x) = z. Ainsi, si f possède un attracteur principal, c’est forcément
son unique point fixe. Afin d’illustrer cette notion, on pourra vérifier que la fonction g représentée par le tableau
[5,5,2,2,0,2] de taille 6 admet 2 comme attracteur principal. Ceci se voit très bien sur le graphe de g ci-dessous,
les flèches représentant pour chaque élément de En son image par g.
0
3
2
5
4
1
Svartz
Page 2/3
2014/2015
MPSI 831
Lycée Masséna
Question 6. Tracer rapidement le graphe de la fonction
f : E10
i
−→
7−→
E10
le chiffre des unités de 2i + 1
Admet-elle un attracteur principal ?
Question 7. Écrire une fonction admet_attracteur_principal(T) qui prend en argument un tableau T représentant
une fonction En → En ayant au moins un point fixe (inutile de le vérifier) et renvoie True si et seulement si la fonction
représentée par T admet un attracteur principal, False sinon. On admet provisoirement que si z est un point fixe
de f , alors z est attracteur principal de f si et seulement si f n−1 (x) = z pour tout x dans En . On pourra utiliser
fonction_iteree de la question précédente.
Question 8. * Démontrer qu’effectivement, si z est un point fixe de f , alors f possède z comme attracteur principal
si et seulement si f n−1 (x) = z pour tout x dans En .
Soit z un point fixe de la fonction f , et x et y deux éléments de En . On remarque que si l’on sait qu’un certain
itéré de x est égal à z et que s’il existe un entier k tel que f k (y) = x alors il existe un itéré de y égal à z. En prime,
on obtient que les itérés successifs de y ont également un itéré qui est égal à z. En utilisant cette idée, on propose la
fonction suivante, prenant en entrée un tableau représentant une fonction supposée avoir au moins un point fixe.
Test efficace d’existence d’un attracteur
def admet_attracteur_principal_efficace(T):
z=plus_petit_point_fixe(T)
n=len(T)
B=[False for i in range(n)] #un tableau de n booléens.
B[z]=True
for i in range(n):
y=i
compteur=0
iteres=[]
while compteur<n and not B[y]: #not B[y] équivalent à B[y]==False.
iteres.append(y)
y=T[y]
compteur+=1
if compteur==n:
return(False)
for j in range(compteur):
B[iteres[j]]=True
return(True)
Question 9. * Expliquez ce que fait la fonction. Justifiez qu’elle termine et qu’elle est correcte, c’est-à-dire qu’elle
renvoie True si la fonction En → En associée au tableau passé en entrée possède un attracteur principal, False sinon.
Question 10. Bonus. * Montrez que la complexité des deux fonctions de test d’existence d’un attracteur principal
est :
— O(n2 ) pour la fonction de la question 7 (c’est à dire qu’on fait un nombre d’opérations majoré par cn2 , où c
est une constante).
— O(n) pour la fonction de l’énoncé (attention, c’est difficile).
Svartz
Page 3/3
2014/2015