A2020 – INFO MP
ÉCOLE DES PONTS PARISTECH,
ISAE-SUPAERO, ENSTA PARIS,
TÉLÉCOM PARIS, MINES PARISTECH,
MINES SAINT-ÉTIENNE, MINES NANCY,
IMT ATLANTIQUE, ENSAE PARIS, CHIMIE PARISTECH.
Concours Centrale-Supélec (Cycle International),
Concours Mines-Télécom, Concours Commun TPE/EIVP.
CONCOURS 2020
ÉPREUVE D’INFORMATIQUE MP
Durée de l’épreuve : 3 heures
L’usage de la calculatrice et de tout dispositif électronique est interdit.
Cette épreuve concerne uniquement les candidats de la filière MP.
Les candidats sont priés de mentionner de façon apparente
sur la première page de la copie :
INFORMATIQUE - MP
L’énoncé de cette épreuve comporte 9 pages de texte.
Si, au cours de l’épreuve, un candidat repère ce qui lui semble être une erreur d’énoncé, il le
signale sur sa copie et poursuit sa composition en expliquant les raisons des initiatives qu’il est
amené à prendre.
Les sujets sont la propriété du GIP CCMP. Ils sont publiés les termes de la licence
Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 3.0 France.
Tout autre usage est soumis à une autorisation préalable du Concours commun Mines Ponts.
Épreuve d’option informatique MP 2020
Les techniques de compression sans perte permettent d’encoder des données telles que
des textes afin de les stocker en occupant un minimum d’espace. Elles s’appuient sur
une estimation de la fréquence d’apparition des symboles qui composent le texte. Dans
ce problème, nous étudions comment compter efficacement le nombre d’occurrences de
chaque symbole dans un texte, que l’on entendra dans la suite comme une suite finie de
numéros (par exemple, des numéros Unicode), et comment optimiser le fonctionnement
d’un encodeur pour passer d’un texte à une suite de bits.
Préliminaires
L’épreuve est composée d’un problème unique, comportant 33 questions. Après cette
section de préliminaires, le problème est divisé en deux parties indépendantes. Pour
répondre à une question, un candidat pourra réutiliser le résultat d’une question antérieure,
même s’il n’est pas parvenu à établir ce résultat.
Concernant la programmation
Il faudra coder des fonctions à l’aide du langage de programmation OCaml, tout autre
langage étant exclu. Lorsque le candidat écrira une fonction, il pourra faire appel à
d’autres fonctions définies dans les questions précédentes de la même sous-partie ; il
pourra aussi définir des fonctions auxiliaires. Quand l’énoncé demande de coder une
fonction, il n’est pas nécessaire de justifier que celle-ci est correcte, sauf si l’énoncé le
demande explicitement. Si les paramètres d’une fonction à coder sont supposés vérifier
certaines hypothèses, il ne sera pas utile de tester si les hypothèses sont bien vérifiées
dans le code de la fonction.
Dans tout l’énoncé, un même identificateur écrit dans deux polices de caractères
différentes désignera la même entité, mais du point de vue mathématique pour la police
en italique (par exemple n) et du point de vue informatique pour celle en romain avec
espacement fixe (par exemple n).
On suppose codées les fonctions suivantes :
— list_length, de type ’a list -> int, de complexité en temps linéaire, qui renvoie
la longueur d’une liste,
— list_append, de type ’a list -> ’a list -> ’a list, de complexité en temps
linéaire en la longueur du premier argument, qui concatène deux listes,
— array_make, de type int -> ’a -> ’a array, de complexité en temps linéaire en
la valeur du premier argument, qui crée un tableau d’une longueur spécifiée en
premier argument et dont chacune des cases est initialisée à une valeur donnée en
second argument,
— array_length, de type ’a array -> int, de complexité en temps constante, qui
renvoie la longueur d’un tableau.
On rappelle que a mod b renvoie le reste de la division euclidienne de a par b.
Page 1 sur 9
Épreuve d’option informatique MP 2020
Dans les calculs de complexité en espace, on considérera qu’un entier occupe une place
constante en mémoire quelle que soit sa valeur.
Concernant les objets manipulés et leur type
L’intervalle des entiers compris entre a et b est noté Ja, bK.
La lettre désigne un alphabet fini ordonné de cardinal ⁄ ; ses lettres, numérotées
dans l’ordre croissant, sont les éléments
‡0 , ‡1 , ‡2 , . . . , ‡⁄≠2 , ‡⁄≠1 .
Par exemple, la norme Unicode est une norme fréquemment utilisée en informatique qui
consiste à travailler sur un alphabet de 1 114 112 symboles. Elle permet d’identifier toute
sorte de caractères (lettre de l’alphabet latin, idéogramme chinois, émoticône, symbole
de l’alphabet phonétique international, etc.) par un numéro unique entre 0 et 1 114 111
quelle que soit la plate-forme informatique employée.
Définitions : Un mot sur un alphabet est une suite finie de lettres de . Leur en-
semble est noté ú , le mot vide est noté Á. Un mot possède plusieurs caractéristiques :
la longueur d’un mot w œ ú , notée |w|, est le nombre de lettres qui composent w ; la
fréquence d’une lettre ‡ œ dans un mot w œ ú , notée |w|‡ , est le nombre d’occurrences
de ‡ dans w ; la valence d’un mot w œ ú , notée [w], est le nombre de symboles distincts
qui composent w.
Un texte est une suite finie d’entiers de l’intervalle J0, ⁄ ≠ 1K. Le mot associé au texte
de s entiers [u1 , u2 , u3 , . . . , us ] est le mot ‡u1 ‡u2 . . . ‡us œ ú .
Indication OCaml : On définit les types unicode, texte et la constante globale lambda
par les déclarations suivantes :
type unicode = int;;
type texte = unicode list;;
let lambda = 1114112;;
Une fonction de l’alphabet vers un ensemble X est représentée par un tableau de
longueur ⁄ de type ’a array où ’a est le type par lequel on représente les éléments de X.
1 Fonction de distribution des lettres d’un texte
Le but de cette partie est de produire une structure de données qui permette de vérifier
la présence d’une lettre dans un mot et de stocker les valeurs non nulles de la fonction
de distribution des fréquences des lettres dans un mot w œ ú définie comme suit
I
æ N
‡ æ
‘ |w|‡
Page 2 sur 9
Épreuve d’option informatique MP 2020
de trois manières différentes et de comparer les complexités en temps et en espace de
chaque approche.
1.1 Avec un tableau exhaustif et une liste
1 – On définit une fonction fonction1 par le code suivant
let rec fonction1 (t:texte) =
match t with
| [ ] -> array_make lambda 0
| u::tprime -> let theta = fonction1 tprime in
theta.(u)<-theta.(u)+1;
theta;;
Inférer le type de la fonction fonction1. Expliquer ce que calcule fonction1 t
et le démontrer par récurrence sur |t|.
Définition : Soit Õ un sous-alphabet de l’alphabet . On appelle répartition du sous-
alphabet Õ dans le mot w œ ú toute liste constituée de tous les couples (‡, |w|‡ ) tels
que ‡ œ Õ et |w|‡ > 0. Cette liste peut être dans un ordre quelconque. La répartition
d’un sous-alphabet dans un texte est la répartition de ce sous-alphabet dans le mot
associé au texte.
Par exemple, une répartition des lettres du mot acad est la liste [(a, 2), (c, 1), (d, 1)].
Indication OCaml : En OCaml, on pourra se servir du type
type repartition = (unicode * int) list;;
2 – Écrire une fonction cree_repartition, de type texte -> repartition
qui renvoie une répartition d’un texte en utilisant la fonction fonction1
définie à la question 1.
3 – Déterminer la complexité en temps de la fonction cree_repartition
en fonction du cardinal ⁄ de l’alphabet et d’une caractéristique du texte
donné en entrée.
4 – Déterminer la complexité en espace de la fonction cree_repartition
en fonction du cardinal ⁄ de l’alphabet.
5 – Donner sans justification un ordre de grandeur de la taille de la valeur
de retour de cree_repartition en fonction d’une caractéristique du texte
donné en entrée.
6 – Comparer les ordres de grandeur obtenus dans les trois questions
précédentes quand le texte donné en entrée est le texte d’un courriel de la vie
courante rédigé en langue française et est l’alphabet Unicode.
Page 3 sur 9
Épreuve d’option informatique MP 2020
1.2 Avec une table modulaire
Définition : Soient w œ ú un mot et m œ Nı un entier non nul. Pour tout entier ¸
compris entre 0 et m ≠ 1, on note [¸] le sous-alphabet de défini par
[¸]
= {‡u , u œ J0, ⁄ ≠ 1K ; (u ≠ ¸) est divisible par m} .
Une table modulaire de comptage d’ordre m du mot w est un tableau de longueur m dont
la ¸-ième case contient une répartition des lettres de [¸] dans w.
Par exemple, avec l’alphabet = {a, b, c, d, e} muni de l’ordre alphabétique et l’entier
m = 3, une table modulaire de comptage d’ordre 3 du mot acad est le tableau de trois
listes
[(a, 2); (d, 1)] [ ] [(c, 1)] .
7 – Écrire une fonction incremente_repartition, de type repartition ->
unicode -> repartition telle que incremente_repartition r u renvoie la
répartition d’un mot qui contient la lettre ‡u une fois de plus qu’un mot de
répartition r.
8 – Écrire une fonction cree_modulaire, dont le type est texte -> int ->
repartition array, qui utilise la fonction définie à la question 7, telle que la
valeur de retour de cree_modulaire t m est une table modulaire de comptage
d’ordre m du texte t.
Le recours à la fonction fonction1 de la question 1 n’est pas autorisé pour
répondre à cette question.
9 – Écrire une fonction valence, de type repartition array -> int, qui
renvoie la valence d’un mot à partir de sa table modulaire de comptage.
10 – Soient m et v deux entiers non nuls et X1 , X2 , . . ., Xv des variables
aléatoires discrètes à valeurs dans l’intervalle entier J0, m ≠ 1K, mutuellement
indépendantes et qui suivent la loi de distribution uniforme. Soient encore
un entier i0 fixé dans l’intervalle J1, vK et un entier ¸0 fixé dans l’intervalle
J0, m ≠ 1K. Pour tout entier ¸ compris entre 0 et m ≠ 1, on appelle Z¸ le
cardinal
Z¸ = |{i œ J1, vK; Xi = ¸}|.
Pour tout entier ¸ compris entre 0 et m ≠ 1, calculer l’espérance
E[Z¸ |Xi0 = ¸0 ].
11 – Soit w œ ú le mot d’un texte t de valence v. En supposant que
l’ensemble des v lettres distinctes présentes dans le mot w a été choisi unifor-
mément dans l’ensemble des parties à v éléments de l’alphabet , montrer
que la complexité moyenne en temps de la fonction cree_modulaire t m est
A B
(v ≠ 1)|t|
O m + |t| + .
m
Page 4 sur 9
Épreuve d’option informatique MP 2020
12 – Donner sans justification la complexité en espace de la fonction
cree_modulaire t m en fonction de m et d’une caractéristique du texte t.
13 – Quelle valeur numérique de m suggérez-vous de choisir lorsque t est
le texte d’un courriel de la vie courante rédigé en langue française et est
l’alphabet Unicode ?
1.3 Avec un tableau creux
Définition : Un tableau creux de comptage du mot w œ ú
est un quadruplet (v, F, I, A)
formé d’un entier v et de trois fonctions F : æ N, I : æ et A : æ tels que
(i) l’entier v est la valence du mot w,
(ii) pour toute lettre ‡ œ présente dans le mot w, il existe une lettre · œ telle que
· 6 ‡v≠1 et I(· ) = ‡.
(iii) pour toute lettre · œ telle que · 6 ‡v≠1 , on a A(I(· )) = · ,
(iv) pour toute lettre ‡ œ présente dans le mot w, on a F (‡) = |w|‡ .
Par exemple, avec l’alphabet = {a, b, c, d, e, f, g, h}, le mot bbbbbbbbbbbbehhhhhhhhh
admet comme tableau de comptage le quadruplet (v, F, I, A)
a b c d e f g h
F ú 12 ú ú 1 ú ú 9
v = 3 et
I b e h ú ú ú ú ú
A ú a ú ú b ú ú c
où chaque symbole ú représente une valeur particulière mais non significative.
Indication OCaml : En OCaml, on pourra se servir du type
type creux = int * int array * unicode array * unicode array;;
On pourra utiliser une fonction make_creux, de type int -> creux qui crée et renvoie
un tableau creux de comptage du mot vide en temps constant, aucune hypothèse ne
pouvant être faite sur le contenu des trois tableaux constituant la valeur de retour de
cette fonction.
14 – Soit (v, F, I, A) un tableau creux de comptage du mot w œ ú .
Montrer que pour toute lettre · œ avec · 6 ‡v≠1 , la lettre I(· ) est une
lettre présente dans le mot w.
15 – Soit (v, F, I, A) un tableau creux de comptage du mot w œ ú .
Montrer que pour toute lettre ‡ œ , la lettre ‡ est présente dans le mot w
si et seulement si on a A(‡) 6 ‡v≠1 et I(A(‡)) = ‡.
Page 5 sur 9
Épreuve d’option informatique MP 2020
16 – Écrire une fonction est_present de type creux -> unicode -> bool
telle que la valeur de retour de tableau_creux theta u est vraie si et seulement
si la lettre ‡u est une lettre présente dans un mot de tableau creux de
comptage ◊. Justifier la correction et la terminaison de la fonction.
17 – Écrire une fonction incremente_tableaucreux, de type creux ->
unicode -> creux, telle que la valeur de retour de incremente_tableaucreux
theta u est un tableau creux de comptage d’un mot qui contient la lettre ‡u
une fois de plus qu’un mot de tableau creux de comptage ◊.
18 – Écrire une fonction cree_tableaucreux de type texte -> creux qui
renvoie le tableau creux de comptage du texte donné en argument.
Le recours à la fonction fonction1 de la question 1 n’est pas autorisé pour
répondre à cette question.
19 – Déterminer la complexité en temps de la fonction cree_tableaucreux.
20 – Donner sans justification la complexité en espace de la fonction
cree_tableaucreux.
21 – Est-il réaliste d’utiliser cette fonction pour le texte d’un courriel de
la vie courante rédigé en langue française encodé avec l’alphabet Unicode
lorsqu’on utilise un ordinateur ou un téléphone actuel ?
2 Un encodeur optimal
2.1 Codes et codages
Définitions : Un code c est une application
c: æ {0, 1}ú .
Le codage associé à un code c est l’application
I
ú
æ {0, 1}ú
e:
·1 ·2 . . . ·n ‘ æ c(·1 )c(·2 ) · · · c(·n )
Un arbre de code représentant un code c est un arbre binaire, dont l’ensemble des sommets
est , tel que
— pour toute lettre ‡ œ , l’étiquette du sommet ‡ est c(‡),
— pour toutes lettres ‡ et · de l’alphabet , si · appartient au sous-arbre gauche
de ‡, alors on a · < ‡ dans l’ordre de l’alphabet ; si · appartient au sous-arbre
droit de ‡, alors on a · > ‡ dans l’ordre de l’alphabet .
Page 6 sur 9
Épreuve d’option informatique MP 2020
Indication OCaml : On adopte les déclarations de type suivantes afin de représenter
les mots binaires et les arbres de code en OCaml :
type binaire = bool list;;
type code =
| Nil
| Noeud of unicode * binaire * code * code;;
22 – Écrire une fonction encodeur, de type texte -> code -> bool list,
qui, à partir d’un texte t et d’un code c, renvoie le codage du mot du texte t
par le codage associé au code c.
On note prof A (‡) la profondeur d’un sommet ‡ dans un arbre A, c’est-à-dire le nombre
de sommets de l’unique chemin entre le sommet ‡ et la racine de A. En particulier, la
racine fl d’un arbre A est de profondeur prof A (fl) = 1.
23 – Pour un code c donné, exprimer la complexité en temps de la fonction
encodeur à l’aide de L = max‡œ |c(‡)|, des profondeurs des sommets de
l’arbre de code A et de la distribution des fréquences dans le mot w donnés
en argument
2.2 Arbre de code optimal
On fixe un code c de l’alphabet ainsi que des poids réels positifs sous la forme d’une
application f : æ R+ . La profondeur pondérée d’un arbre de code A représentant le
code c est la somme ÿ
Prof(A) = f (‡) prof A (‡).
‡œ
24 – Exprimer la profondeur pondérée Prof(A) d’un arbre de code A en
fonction de f , de la profondeur pondérée Prof(Ag ) du sous-arbre gauche Ag
de l’arbre de code A et de la profondeur pondérée Prof(Ad ) du sous-arbre
droit Ad de l’arbre de code A.
On dit qu’un arbre de code est optimal si sa profondeur pondérée est la plus petite des
profondeurs pondérées des arbres de code représentant un code de l’alphabet . Pour
tous entiers u et v compris entre 0 et ⁄ ≠ 1 avec u 6 v, on note cu,v la restriction du
code c à l’alphabet u,v = {‡u , ‡u+1 , . . . , ‡v≠1 , ‡v }. On note u,v la profondeur pondérée
d’un arbre de code représentant le code cu,v optimal.
25 – Pour tout entier u compris entre 0 et ⁄ ≠ 1, calculer u,u .
Pour tous entiers u et v compris entre 0 et ⁄ ≠ 1 vérifiant u < v, exprimer
une relation entre u,v et les quantités ( u,r )u6r6v≠1 et ( r,v )u+16r6v .
Page 7 sur 9
Épreuve d’option informatique MP 2020
26 – Concevoir et présenter un algorithme qui reçoive en entrée un code
c : æ {0, 1}+ et une distribution de fréquences f : æ N sous la
forme de tableaux et qui construise un arbre de code optimal en temps
O(⁄3 ). Il n’est pas exigé d’utiliser la syntaxe OCaml pour répondre à cette
question. On décomposera l’algorithme en sous-programmes élémentaires dont
on caractérisera les entrées, les sorties ou les effets suffisamment pour que
l’établissement d’une preuve de correction de l’algorithme soit facile. Cette
preuve de correction n’est pas exigée.
On justifiera la complexité en temps.
2.3 Un arbre de code optimal calculé plus rapidement
Pour tous entiers u et v avec 0 6 u 6 v 6 ⁄ ≠ 1, on appelle ru,v le plus grand entier r
inférieur à ⁄≠1 tel qu’il existe un arbre optimal pour le code cu,v ayant la lettre ‡r comme
racine. On se propose de démontrer, pour tout n compris entre 0 et ⁄ ≠ 2, l’encadrement
’ 0 6 u 6 v 6 ⁄ ≠ 2 avec v ≠ u 6 n, ru,v 6 ru,v+1 6 ru+1,v+1 . (E(n))
27 – Déduire de l’encadrement E(⁄ ≠ 2) une modification de l’algorithme
proposé en réponse à la question 26 afin que son temps d’exécution soit O(⁄2 ).
Détailler le calcul de la complexité en temps.
Soient u et v deux entiers avec 1 6 u 6 v 6 ⁄ ≠ 2.
28 – Montrer que, dans un arbre de code qui représente le code cu,v , le
sommet qui contient la lettre ‡v ne possède jamais de fils droit.
29 – Dans cette question, on suppose que le poids f (‡v+1 ) est nul. Soit A
un arbre de code optimal pour le code cu,v et AÕ l’arbre obtenu en ajoutant
à A le sommet ‡v+1 comme fils droit du sommet qui contient la lettre ‡v .
Montrer que AÕ est un arbre de code optimal pour le code cu,v+1 .
Dans les trois questions qui suivent, on suppose que les poids (f (‡x ))u6x6v restent
constants tandis que le poids f (‡v+1 ) est variable.
30 – Montrer que l’application
I
R+ æ R+
fiu,v+1 :
f (‡v+1 ) ‘æ u,v+1
est une application continue et affine par morceaux sur R+ dont on précisera
la pente pour chaque morceau et que, pour tout intervalle ouvert I ™ R+
sur lesquels l’application fiu,v+1 est affine, les indices (ruÕ ,vÕ )u6uÕ 6vÕ 6v+1 sont
constants lorsque f (‡v+1 ) varie dans I.
Page 8 sur 9
Épreuve d’option informatique MP 2020
Soit – œ Rı+ un point de changement de pente de l’application fiu,v+1 , soit — ≠ < – un
réel tel que l’application fiu,v+1 soit affine sur l’intervalle I ≠ = ]— ≠ , –[ et soit — + > – un
réel tel que l’application fiu,v+1 soit affine sur l’intervalle I + = ]–, — + [.
+
On construit deux suites (d≠ k ) et (dk ) par récurrence. Chaque suite s’arrête si le terme
suivant n’est plus défini. Pour construire la première suite, on choisit f (‡v+1 ) dans
l’intervalle I ≠ et on pose
I
d≠
0 = ru,v+1
.
si dk < v + 1, dk+1 = rd≠ +1,v+1
≠ ≠
k
Pour construire la seconde suite, on choisit f (‡v+1 ) dans l’intervalle I + et on pose
I
d+0 = ru,v+1
.
si d+
k < v + 1, d +
k+1 = r d+ +1,v+1
k
Dans la mesure où les entiers ru,v dépendent de la valeur de f (‡v+1 ), les deux suites (d≠k)
et (d+
k ) ne sont pas forcément égales et ne dépendent que du fait que f (‡v+1 ) appartient
à I ≠ ou à I + .
+
31 – Montrer que les suites (d≠
k ) et (dk ) sont finies et que, en appelant m
≠
l’indice du dernier terme défini de la suite (dk ) et m l’indice du dernier
≠ +
terme défini de la suite (d+
k ), on a m > m .
≠ +
On suppose avoir démontré la validité de l’encadrement E(n) pour un certain entier n.
On suppose que les entiers u et v vérifient v ≠ u 6 n + 1.
32 – En faisant l’hypothèse d+
0 < d0 , montrer qu’il existe un indice s < m
≠ +
tel qu’on ait d≠
s = ds et tel que, pour tout entier ¸ compris entre 0 et s ≠ 1,
+
on ait d+
¸ < d¸ . En déduire une contradiction en échangeant les descendants
≠
du sommet ‡d≠s et du sommet ‡d+s dans certains arbres.
33 – Montrer que l’encadrement (E(n)) est satisfait pour tous entiers n
avec n 6 ⁄ ≠ 2.
Fin de l’épreuve
Page 9 sur 9