6. Écrire une fonction ecrireChaine(liste) qui lise une liste liste et retourne la chaîne correspondant
à cette liste. Tester alors toutes les fonctions par des compositions multiples et écrire un convertisseur
permettant de passer de l’écriture dans une base à l’écriture dans une autre base.
7. Introduire pour chaque fonction un contrôle de la validité des arguments ainsi que le traitement des
erreurs correspondantes (messages d’erreurs).
Exercice 3 (Relations-applications). Le but est ici de tester les différentes propriétés d’une part de relations
binaires sur des ensembles finis et d’autre part d’applications entre ensembles finis.
Tout ensemble fini de cardinal nétant en bijection avec l’intervalle d’entiers [[0,n−1]], on se limitera
aux ensembles de ce type.
Important : Toutes les fonctions devront être testées sur des exemples que vous construirez vous-
même afin de parcourir les différents cas de figure. Ces exemples seront écrits dans le même fichier que les
fonctions Python, pour ne pas avoir à les rentrer manuellement à chaque test.
1. On représente les relations binaires par des listes de listes (tableaux bidimensionnels) de nombres entiers
valant 0 ou 1 suivant que les éléments sont en relation ou pas. Par exemple, le tableau bidimensionnel
R = [[1,0,1],[0,0,0],[1,1,0]]
représente la relation binaire Rdéfinie sur [[0,2]] par 0R0, 06R1, 0R2, 16R0, 16R1, 16R2, 2R0, 2R1 et 26R2.
Le (i,j)-ème élément du tableau R[i][j] vaut donc 0 si i6Rjet 1 si iRj.
Écrire des fonctions prenant en argument un tableau carré Rde 0 et de 1 et retournant True ou False
suivant que la relation est ou n’est pas :
— réflexive (∀x∈[[0,n−1]],xRx)
— symétrique (∀x,y∈[[0,n−1]],(xRy=⇒yRx))
— antisymétrique (∀x,y∈[[0,n−1]],((xRyet yRx) =⇒x=y))
— transitive (∀x,y,z∈[[0,n−1]],((xRyet yRz) =⇒xRz))
— une relation d’équivalence (réflexive, symétrique et transitive)
— une relation d’ordre (réflexive, antisymétrique et transitive)
— une relation d’ordre total (relation d’ordre telle que ∀x,y∈[[0,n−1]],(xRyou yRx))
— une application (∀x∈[[0,n−1]],∃!y∈[[0,n−1]],xRy)
2. Une application entre deux ensembles est définie par son ensemble de départ [[0,n−1]], son ensemble
d’arrivée [[0,p−1]] et les images des éléments de l’ensemble de départ. Plutôt qu’avec des tableaux bi-
dimensionnels comme dans la question précédente, il est plus efficace de représenter les applications par
des listes unidimensionnelles, le premier élément étant l’image de 0, le deuxième l’image de 1, etc. Pour
signifier l’ensemble d’arrivée, il faut alors passer aux fonctions Python un deuxième argument : l’entier p.
Ainsi la liste et l’entier
F = [2,3,4,2,7,5,6,8,8,8,0,1], P = 9
représentent l’application fde [[0,11]] vers [[0,8]] telle que f(0) = 2, f(1) = 3,. . . f(11) = 1.
Écrire des fonctions prenant en argument une liste Fd’entiers naturels et un entier naturel Pet retournant
True ou False suivant que l’application est ou n’est pas :
— surjective (∀y∈[[0,p−1]],∃x∈[[0,n−1]],f(x) = y)
— injective (∀x,y∈[[0,n−1]],(f(x) = f(y) =⇒x=y))
— bijective (∀y∈[[0,p−1]],∃!x∈[[0,n−1]],f(x) = y, ce qui équivaut à être surjective et injective)
3. Écrire une fonction calculant la composée de deux applications passées en arguments et en écrire une
autre calculant l’application réciproque d’une bijection, puis tester la deuxième à l’aide de la première.
Exercice 4 (Problème de Caligula (qui comme chacun le sait était un fou sanguinaire)).
Caligula décide de s’amuser : il prend npersonnes au hasard et décide de les tuer toutes sauf une. Pour
faire durer le plaisir, il décide de procéder de la manière suivante : il numérote les personnes de 0 à n−1
et les fait disposer en cercle autour de lui dans l’ordre des numéros. Il choisit un nombre qquelconque
puis, partant du numéro zéro, se décale qfois d’une personne en partant dans l’ordre croissant et faisant
éventuellement plusieurs tours. Il tue alors la personne en face de lui. Le corps enlevé, il recommence le
2