TP Python – Relations et applications sur des ensembles finis
BTS SIO SISR 1re année – Mathématiques pour l'informatique – S11
Note
Comment ce TP fonctionne. Chaque exercice a un éditeur Python intégré à la page (il s'exécute dans ton navigateur, rien à installer). Avant de lancer, écris sur ta feuille ce que tu anticipes (« J'anticipe »). Puis lance et compare. Le bouton Valider exécute des tests : un test réussi ne dispense pas de comprendre pourquoi.
Dans ce TP, une relation est un ensemble de couples ({(1, 2), (2, 2)}) et une application est un dictionnaire ({1: "a", 2: "b"}) dont les clés forment l'ensemble de départ.
Exercice A – Produit cartésien
Écris produit(a, b) qui renvoie l'ensemble des couples (x, y) avec x dans a et y dans b.
J'anticipe. Combien de couples pour a de 3 éléments et b de 4 ? Que renvoie produit(a, set()) ?
def produit(a, b):bksl-nl """Ensemble des couples (x, y), x dans a, y dans b."""bksl-nl resultat = set()bksl-nl for x in a:bksl-nl # À compléter : une boucle sur b, qui ajoute le couple (x, y)bksl-nl passbksl-nl return resultatbksl-nlbksl-nl
Exercice B – Propriétés d'une relation
Écris est_reflexive(r, e), est_symetrique(r), est_antisymetrique(r) et est_transitive(r). r est un ensemble de couples, e l'ensemble sur lequel on travaille.
Je comprends. Pour la transitivité, pourquoi faut-il deux boucles imbriquées sur les couples ? Quelle propriété est vraie « à vide » pour la relation vide ?
def estpy-undreflexive(r, e):bksl-nl for x in e:bksl-nl # À compléter : renvoyer False si (x, x) n'est pas dans rbksl-nl passbksl-nl return Truebksl-nlbksl-nldef estpy-undsymetrique(r):bksl-nl for (x, y) in r:bksl-nl # À compléter : renvoyer False si (y, x) n'est pas dans rbksl-nl passbksl-nl return Truebksl-nlbksl-nldef estpy-undantisymetrique(r):bksl-nl for (x, y) in r:bksl-nl # À compléter : renvoyer False si (y, x) est dans r avec x != ybksl-nl passbksl-nl return Truebksl-nlbksl-nldef estpy-undtransitive(r):bksl-nl for (x, y) in r:bksl-nl for (z, t) in r:bksl-nl # À compléter : si y == z, le couple (x, t) doit être dans rbksl-nl passbksl-nl return Truebksl-nlbksl-nl
Exercice C – Classes d'équivalence
Écris classes(r, e) qui renvoie la liste des classes d'équivalence (des ensembles) d'une relation d'équivalence r sur e, rangées par plus petit élément croissant.
def classes(r, e):bksl-nl """Classes d'équivalence de r sur e, par plus petit élément croissant."""bksl-nl vus = set()bksl-nl resultat = []bksl-nl for x in sorted(e):bksl-nl if x in vus:bksl-nl continuebksl-nl classe = set()bksl-nl for y in e:bksl-nl # À compléter : ajouter y à la classe de x si (x, y) est dans rbksl-nl passbksl-nl resultat.append(classe)bksl-nl # À compléter : mémoriser les éléments de la classe comme déjà vusbksl-nl return resultatbksl-nlbksl-nl
Exercice D – Injective, surjective, bijective
Écris est_injective(f), est_surjective(f, b) et est_bijective(f, b) pour une application f (dictionnaire) d'ensemble d'arrivée b.
Je comprends. Pourquoi peut-on tester l'injectivité en comparant le nombre de valeurs distinctes au nombre de clés ?
def estpy-undinjective(f):bksl-nl valeurs = set()bksl-nl for x in f:bksl-nl # À compléter : ajouter l'image de x aux valeursbksl-nl passbksl-nl return False # À compléter : comparer len(valeurs) et len(f)bksl-nlbksl-nldef estpy-undsurjective(f, b):bksl-nl valeurs = set()bksl-nl for x in f:bksl-nl # À compléter : ajouter l'image de x aux valeursbksl-nl passbksl-nl return False # À compléter : comparer valeurs et set(b)bksl-nlbksl-nldef estpy-undbijective(f, b):bksl-nl return False # À compléter : en utilisant les deux fonctions précédentesbksl-nlbksl-nl
Exercice E – Images, réciproque et composée
Écris image_directe(f, x), image_reciproque(f, y), composee(g, f) (le dictionnaire de \(g \circ f\)) et reciproque(f) (l'application réciproque d'une bijection, ou None si f n'est pas injective).
def imagepy-unddirecte(f, x):bksl-nl """Ensemble des images des éléments de x."""bksl-nl resultat = set()bksl-nl for a in x:bksl-nl # À compléter : ajouter l'image de abksl-nl passbksl-nl return resultatbksl-nlbksl-nldef imagepy-undreciproque(f, y):bksl-nl """Ensemble des éléments de départ dont l'image est dans y."""bksl-nl resultat = set()bksl-nl for a in f:bksl-nl # À compléter : ajouter a si f[a] est dans ybksl-nl passbksl-nl return resultatbksl-nlbksl-nldef composee(g, f):bksl-nl """Dictionnaire de g o f : x -> g(f(x))."""bksl-nl resultat = {}bksl-nl for x in f:bksl-nl # À compléter : resultat[x] = g(f(x))bksl-nl passbksl-nl return resultatbksl-nlbksl-nldef reciproque(f):bksl-nl """Application réciproque (b -> a), ou None si f n'est pas injective."""bksl-nl inverse = {}bksl-nl for a in f:bksl-nl # À compléter : si f[a] est déjà une clé de inverse, renvoyer None ;bksl-nl # sinon associer f[a] à abksl-nl passbksl-nl return inversebksl-nlbksl-nl