Correction 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 ∅ ? Réponse : < 0...0 >2 = 0 . • En ? n Réponse : < 1...1 |{z} >2 = 2 − 1 n • {j}, où j ∈ En ? Réponse : < 0...01 |{z} 0...0 >2 = 2j . j 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 ? Réponse : 17 2 donc 17 = < 10001 >2 code l’ensemble {0, 4} . 1 8 2 0 4 2 0 2 2 0 1 2 1 0 En python, on peut écrire un nombre en binaire en préfixant l’écriture binaire par 0b : 1 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 : • & (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. Réponse : à l’intersection. A ⊆ B ssi A ∩ B = B c’est à dire : A&B == B . • A quelle opération sur les ensembles correspond | ? Réponse : à l’union. 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. Réponse : (on utilise le fait que la taille d’un nombre q en binaire est blog2 qc) 2 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. Réponse : 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. Réponse : P Le nombre de sous-ensembles de taille pair (resp. impair) de En est : P = k pair nk (resp. P I = k impair nk ). D’après la formule du binôme de Newton, (1 − 1)n = P − I = 0 donc P = I . Question 8. Écrire une fonction pour calculer la taille moyenne d’un sous-ensemble de En . Établir une conjecture et la prouver. Réponse : Réponse : Il est ”évident” que la taille moyenne d’un sous-ensemble de En est P démontrer en calculant nk=0 k nk et en utilisant k nk = n n−1 k−1 . n 2 . On peut le 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. 3