TP PSI : écriture binaire des ensembles

publicité
TP PSI : écriture binaire des ensembles
Dans ce TP, on étudie une représentation efficace des ensembles dans python. Soit n ∈ N et
En = {0, 1, ..., n − 1}. On représente un sous-ensemble S ⊂ En sur n bits, par un nombre dont
l’écriture en base 2 a son ième bit égal à 1 si et seulement si i ∈ S.
Par exemple, si n = 5, le sous-ensemble S = {0, 2, 3} ⊂ En = {0, 1, 2, 3, 4} est représenté par :
< |{z}
0 |{z}
1 |{z}
1 |{z}
0 |{z}
1 >2 = 20 + 22 + 23 = 13
3∈S 2∈S 1∈S
0∈S
4∈S
/
/
Question 1. Par quel entier est représenté :
• l’ensemble vide ∅ ?
• En ?
• {j}, où j ∈ En ?
n
Inversement, tous les entiers de 0 à < 11...11
| {z } >2 = 2 − 1 représentent un sous-ensemble de
n
En . Pour trouver l’ensemble codé par un nombre, il suffit de trouver l’écriture en base 2 de ce
nombre. On rappelle que l’écriture en base 2 d’un nombre p correspond à la suite (inversée) des
restes obtenus par divisions euclidiennes successives de p par 2.
Par exemple, 26 = < 11010 >2 car : 26
0
2
13
1
2
6
0
2
3
1
2
1
1
2
0
Ainsi, 26 représente l’ensemble {1, 3, 4} ⊂ E5 .
Question 2. Quel est le sous-ensemble de En codé par le nombre 17 ?
En python, on peut écrire un nombre en binaire en préfixant l’écriture binaire par 0b :
Inversement, on peut obtenir l’écriture binaire d’un nombre (sous forme de chaı̂ne de caractères) avec bin :
On utilisera les opérations binaires suivantes, si A et B sont deux écritures binaires :
1
• & (et binaire) : le ième bit de A & B est 1 ssi les ièmes bits de A et B sont 1.
• | (ou binaire) : le ième bit de A | B est 1 ssi le ième bit de A ou B est 1.
Par exemple :
Question 3.
• A quelle opération sur les ensembles correspond & ? En déduire comment savoir si un
ensemble A est inclus dans un ensemble B.
• A quelle opération sur les ensembles correspond | ?
Question 4. Écrire une fonction appartient telle que appartient(i, A) renvoie True si
i ∈ A, False sinon.
Indice : il faut déterminer si A ∩ {i} = ∅.
Question 5. En déduire une fonction card qui renvoie la taille (cardinal) d’un ensemble en
argument.
Un des intérêts de cette représentation des ensembles réside dans la fait qu’on peut facilement
tous les énumérer : en faisant une boucle for variant de 0 à 2n − 1.
Question 6. En énumérant tous les ensembles, écrire une fonction pairs_impairs ayant n en
argument et renvoyant une liste composée de deux nombres : le nombre de sous-ensembles de
En de taille pair et le nombre de sous-ensembles de En de taille impair.
Question 7. Établir une conjecture sur le nombre de sous-ensembles de taille pair (resp.
impair). La prouver en utilisant la formule du binôme de Newton.
Question 8. Écrire une fonction pour calculer la taille moyenne d’un sous-ensemble de En .
Établir une conjecture et la prouver.
On rappelle que le codage par complément à 2 sur p bits (utilisé par python) consiste à
stocker tous les nombres n de −2p−1 à 2p−1 − 1 :
• Si n ≥ 0, n est codé par son écriture en base 2.
• Si n < 0, le codage de n est obtenu de la façon suivante :
1. Trouver la représentation de −n.
2. Ajouter 1.
3. Inverser les 0 et les 1.
Question 9. Comprendre pourquoi le minimum d’un ensemble A est obtenu en écrivant
A & (−A). Vérifier sur des exemples.
2
Téléchargement