X Informatique MP 2007

Thème de l'épreuve Codage de Reed-Solomon
Principaux outils utilisés polynômes, arbres, listes, récursivité
Mots clefs codage de Reed-Solomon, polynôme, arbre, division euclidienne, quotient, modulo, liste

Corrigé

 : 👈 gratuite pour tous les corrigés si tu crées un compte
👈 l'accès aux indications de tous les corrigés ne coûte que 5 € ⬅ clique ici
👈 gratuite pour tous les corrigés si tu crées un compte
- - - - - - - - - - - - - -

Énoncé complet

(télécharger le PDF)
                       

Rapport du jury

(télécharger le PDF)
           

Énoncé obtenu par reconnaissance optique des caractères


ÉCOLE POLYTECHNIQUE FILIÈRE MP
OPTION INFORMATIQUE
CONCOURS D'ADMISSION 2007

COMPOSITION D'INFORMATIQUE

(Durée : 4 heures)

L'utilisation des calculatrices n'est pas autorisée pour cette épreuve.

On attachera une grande importance a la concision, a la clarté, et a la 
précision de la rédaction.

***

Codage Reed-Solomon

Ce problème s'intéresse aux codes de correction d'erreurs de Reed-Solomon. On 
souhaite trans--
mettre un message au travers d'un canal de communication bruite" : les données 
émises sont modi--
fiées par quelques erreurs lorsqu'elles sont reçues. Pour permettre néanmoins 
la transmission fiable
d'un message, la donnée émise est un codage du message, plus long que le 
message lui-même.
La redondance ainsi ajoutée permet de corriger ensuite des erreurs qui peuvent 
apparaître lors de la
transmission. Les codes appelés codes de Reed-Solomon ont de nombreuses 
applications : les CDs,
DVDs, les systèmes ADSL, ou encore de nombreuses sondes spatiales utilisent des 
codes bâtis autour
des codes de Reed--Solomon.

Le préambule donne les définitions communes a l'ensemble de l'énoncé, et 
introduit les codes
de Reed-Solomon. La partie I s'attache au calcul du codage d'un message. La 
partie Il définit
quelques fonctions de manipulation de polynômes. La partie III poursuit cette 
étude par la mise en
oeuvre d'algorithmes de meilleure complexité. Enfin, la partie IV permet 
d'améliorer la complexité
du codage. On notera que le problème du décodage {retrouver un message original 
a partir d'une
transmission bruitée) n'est pas traité dans ce problème.

Les parties 1 a Ill peuvent être traitées indépendamment. La partie IV repose 
sur les résultats
de la partie III.

Préambule : Définitions et notations

Dans l'ensemble de l'énoncé, on fixe un nombre premier }) inférieur a 215 (de 
telle sorte que le
produit de deux entiers modulo }) soit toujours représentable par un simple 
entier positif en Caml ou
en Pascal). Les calculs liés aux codes de Reed--Solomon seront réalisés dans le 
corps le : Z/pZ des
entiers modulo p. On rappelle que l'opération << modulo >> est réalisée par 
l'opérateur mod en Caml
et en Pascal, où on suppose également disposer de la fonction inv suivante pour 
calculer l'inverse
modulo }) de tout entier a vérifiant 0 < a < p : (* Caml *) { Pascal } (donné) inv : int --> int (donné) function inv(azinteger)

: integer

Toutes les questions ayant trait a la complexité des programmes écrits 
demandent comme réponse
une borne supérieure (raisonnable) du type O() sur le nombre d'opérations dans 
le : chacune des
opérations dans le (addition, multiplication, inversion) est considérée de 
complexité 1.

1

On manipulera des listes d'entiers modulo p en les identifiant avec des 
polynômes. Ainsi la

liste de (d + 1) entiers  correspond au polynôme A(X ) : ZÎ=0 
a.;Xi de degré inférieur

ou égal a d, a coefficients dans E,. On notera couramment degA le degré d'un 
polynôme A(X )
Les listes d'entiers modulo p sont des valeurs du type poly, défini comme suit :

(* Caml *) { Pascal }
type poly = int list;; type poly = "polycoeff;
polycoeff = record

coeff: integer;

suivant: poly;

end;

En Pascal la liste vide est nil, et l'on pourra utiliser la fonction suivante 
pour construire des
listes :

{ Pascal }
function nouveauPolynome(a : integer ; (Q : poly) : poly;
var r : poly;

begin new(r); r".coeff := a. ; r".suivant := Q; nouveauPolynome := r; end;

Pour définir le codage de Reed--Solomon, on fixe deux constantes entières k et 
77. qui vérifient
O de k entiers modulo p, tandis que le codage est une liste 
B :  de
n entiers modulo p. On peut aussi voir le message comme un polynôme A(X ) de 
degré inférieur ou
égal a le -- 1. Le codage utilise comme paramètre une liste oz : {cm, . . . 
,dn_1> de n entiers modulo

p, et est calculé comme suit :

k--1
|A :  | -->|B :  | , avec b; : A(oz;) : Zou--cd 
modp.
message codage j =O

Dans les programmes qu'on écrira, on considérera les entiers k, 77. et p comme 
des constantes
globales.

Partie I. Codage de Reed-Solomon, première version

Question 1 Écrire la fonction valeur qui prend comme arguments un polynôme U a 
coefficients
dans E, et un entier a:; et qui retourne la valeur U (513) dans E, de ce 
polynôme en cet entier a:.

(* Caml *) valeur : poly --> int --> int

{ Pascal } function valeur(U : poly ; a: : integer) : integer

Question 2 Écrire la fonction codage qui prend comme arguments la liste 04 : 
(cm, . . . ,an_1> et
le polynôme A(a:) ; et qui retourne le codage de Reed--Solomon du message A.

(* Caml *) codage : poly --> poly --> poly
{ Pascal } function codage(a : poly ; A : poly) : poly

Question 3 Quelles sont les complexités des fonctions valeur et codage en 
fonction de n et k ?

Partie II. Polynômes

Dans cette partie) toutes les opérations retournent des polynômes a 
coefficients dans le.

Question 4 Écrire la fonction addition qui prend comme arguments deux polynômes 
U (X ) et
V(X ) a coefficients dans le, représentés par des listes de ÆU et EURV 
coefficients; et qui retourne
la somme de ces deux polynômes. Les coefficients du résultat sont aussi dans 
le. Déterminer la
complexité de cette fonction en fonction de ÆU et (V-

(* Caml *) addition : poly --> poly --> poly
{ Pascal } function addition(U : poly ; V : poly) : poly

Question 5 Écrire de même la fonction soustraction qui prend comme arguments 
deux poly--
nômes U (X ) et V(X ) a coefficients dans le, représentés par des listes de ÆU 
et EURV coefficients;
et qui retourne la différence U (X ) -- V(X ) Déterminer la complexité de cette 
fonction en fonction
de ËU et Ëv.

(* Caml *) soustraction : poly --> poly --> poly
{ Pascal } function soustraction(U : poly ; V : poly) : poly

Question 6 Écrire la fonction produitParScalaire qui prend comme arguments un 
polynôme
U (X )) représenté par la liste de ÆU coefficients7 et un entier 5 dans &; et 
qui retourne s >< U (X ) Donner la complexité de cette fonction en fonction de EURU. (* Caml *) produitParScalaire : poly --> int --> poly
{ Pascal } function produitParScalaire(U : poly ; s : integer) : poly

Question 7 Écrire la fonction produit qui prend comme arguments deux polynômes 
U (X ) et
V(X), représentés par des listes de ÆU et EURV coefficients; et qui retourne le 
produit de ces deux
polynômes. Déterminer la complexité de cette fonction en fonction de ÆU et (V-

(* Caml *) produit : poly --> poly --> poly
{ Pascal } function produit(U : poly ; V : poly) : poly

3

Question 8 Soit un polynôme U (X ) de degré inférieur ou égal a dU représenté 
par une liste de
ÆU : (dU + 1) entiers, et un polynôme non nul V(X ) de degré exactement égal a 
dv, représenté par
une liste de EURV : (dv + 1) entiers. Écrire la fonction division qui calcule 
le quotient de la division
euclidienne de U (X ) par V(X), noté U div V. On rappelle que le résultat de la 
division euclidienne
d'un polynôme U (X ) par un polynôme non nul V(X ) est l'unique couple (Q(X ), 
R(X )) (quotient
et reste) vérifiant :

U(X) =Q(X)V(X)+R(X),
degR < dv. Déterminer la complexité de la fonction division en fonction de ÆU et ËV- (* Caml *) division : poly --> poly --> poly
{ Pascal } function division(U : poly ; V : poly) : poly

Question 9 Écrire la fonction modulo qui prend comme arguments deux polynômes U 
(X ) et
V(X ) ; et qui calcule le reste de la division euclidienne de U (X ) par V(X ) 
Quelle est la complexité
de cette fonction ?

(* Caml *) modulo : poly --> poly --> poly
{ Pascal } function modulo(U : poly ; V : poly) : poly

Dans la suite du problème) le reste de la division euclidienne de U (X ) par 
V(X ) est noté U mod V.

Partie III. Multiplication et division rapide

Cette partie s'attache a l'amélioration de la complexité des algorithmes de 
multiplication et de
division de polynômes. La notation La:l (respectivement loel) désigne la partie 
entière inférieure
(respectivement la partie entière supérieure) d'un nombre réel a:. On remarque 
qu'on a, pour tout

- w ° d d _
nombre ent1er d, lequat10n (fl + bl -- d.
Multiplication Soient deux polynômes U (X ) et V(X ) représentés par les listes 
(uO7 . . . ,ug_1> et
(co, . .. ,Ug_1> ayant EUR coefficients (le degré de U et V est donc au plus 
EUR -- 1). On pose 6 : (%
puis Ub : (u0, . .. ,u6_1> et Uh : (ue, . .. ,ug_1>, de sorte que U : Ub +X6Uh. 
On définit de même
Vb et Vh. Lorsqu'on écrit le produit U (X )V(X )) on fait apparaitre quatre 
produits impliquant les
polynômes Uh, Ub, Vh, % :

U(X)V(X) = (UbX6 + Ub) (VhX6 + Vb),
= Uhth2EUR + (Ubi/}) + Uth) X6 + Ubi/b.
Question 10 Donner une formule par laquelle le produit U (X )V(X ) s'exprime 
sous la forme

VVsz26 + VV...XEUR + W5, où les polynômes W... W... et Wb se calculent avec 
seulement trois produits
impliquant les polynômes U... V... Ub, V},, Uh + Ub et Vh + V5.

4

Question 11 Écrire la fonction produitRapide qui prend comme arguments deux 
polynômes
U (X ) et V(X ) représentés par des listes de EUR coefficients; et qui calcule 
leur produit, avec une
complexité O (EUR10g2 3) dans le cas où EUR est une puissance de 2. Justifier 
cette formule de complexité.

(* Caml *) produitRapide : poly --> poly --> poly
{ Pascal } function produitRapide(U : poly ; V : poly) : poly

Division Il est possible d'obtenir une amélioration similaire de la division de 
polynômes. Soit un
dividende U (X ) et un diviseur non nul V(X ), respectivement représentés par 
les listes 
et  d'entiers. On suppose que vg_1 est non nul, de telle sorte 
que deg V est exactement
égal a d = EUR -- 1. Le degré de U est au plus égal a 2d : 2EUR -- 2.

Comme pour la multiplication, on sépare les entrées en << partie haute >> et << partie basse >>.
On pose 6 : L%J : l%l, puis Uh : , U;, : , Vh 
: ,
Vb : . Le découpage est représenté par la figure 1. Attention, 
selon la parité de d, on
a2<9=dou2<æ=d+l. On recherche le quotient Q, écrit sous la forme Q : X6Qh+Qb avec deg Qh S d--e et deg Qb < 6. Les formules suivantes donnent la valeur de Q}, et Qb. -- Q,, est le quotient de la division de U ;, par V;,. -- R,, est le reste de cette même division. -- Qb est le quotient de la division de S : <80, . .. 782(d--e)> par Vh, où :

S = X6R.. + uge_1XEUR--l -- thb.

Ub = <%. - -- ,U2e_1> U}. = 

A A

U : Ub + X26Uh |...,| ................. r..26| ................. |...|

V=Vb+Xth IUÜI °°°°°° |%l °°°°°°° lUdl

% %.
degU;,£2(d--e), degUb<26, deth=d--e, degV}, poly --> poly
{ Pascal } function divisionRapide(U : poly ; V : poly) : poly

Question 13 Écrire la fonction moduloRapide qui prend comme arguments deux 
polynômes U (X )
et V(X ) (toujours soumis a la contrainte degU S 2deg V); et qui calcule le 
reste de la division
euclidienne de U (X ) par V(X), plus rapidement qu'avec la fonction modulo de 
la question 11.9.
Quelle est la complexité de la fonction moduloRapide ?

(* Caml *) moduloRapide : poly --> poly --> poly
{ Pascal } function moduloRapide(U : poly ; V : poly) : poly

Partie IV. Codage par évaluation multi--points

L'objectif de cette partie est de proposer un autre algorithme pour calculer le 
codage de Reed--
Solomon par une stratégie de type << diviser pour régner >>.

On commence par construire un arbre binaire dont les noeuds sont étiquetés par 
des polynômes.
Un arbre de sous-produits pour les polynômes X -- dg, X -- cn, . . . X -- dn_1 
est défini comme suit :
les X -- a; sont les étiquettes des feuilles de l'arbre (par ordre des indices 
i croissants dans l'ordre de
lecture des feuilles de la gauche vers la droite)) chaque noeud interne est 
étiqueté par le produit des
polynômes étiquetant ses noeuds fils. Un arbre de sous--produits est dit 
optimal s'il est de hauteur
h minimale (2h_1 < 77. S 2h), et si les degrés des polynômes étiquetant deux fils d'un même noeud diffèrent d'au plus un. La figure 2 représente un tel arbre de sous--produits de hauteur h = 3 pour une famille de 6 polynômes X -- dg, . . . ,X -- a5. m0mlm2m3m4m5 /\ m0m1m2 m3m4m5 /\ /\ m0m1 m2 m3m4 m5 ...! \... ...! \... FIG. 2: Un arbre de sous--produits optimal pour (mo, . . . ,m5), avec la notation m; = X -- cri. Un arbre de sous--produits est représenté par une valeur de type arbre, défini comme suit : (* Caml *) { Pascal } type arbre = Vide type arbre = "noeud; l Noeud of poly * arbre * arbre noeud = record etiquette: poly; filsG: arbre; filsD: arbre; end; L'arbre vide (sans aucun noeud) est représenté par Vide en Caml et par nil en Pascal. Question 14 Écrire la fonction arbreSousProduits qui prend comme argument la liste  arbre

{ Pascal } function arbreSousProduits(a: poly) : arbre

On souhaite maintenant calculer un second arbre, appelé arbre des restes de A(X 
) Il est similaire
a l'arbre de sous--produits calculé a la question précédente) mais les 
étiquettes des noeuds diffèrent : a
un noeud d'étiquette m dans l'arbre des sous--produits) correspond un noeud 
d'étiquette A(X ) mod m
dans l'arbre des restes. La figure 3 donne l'arbre des restes de A(X ) qui 
correspond a l'arbre de la
figure 2.

A(X) mod m0m1mgmgm4m5

A(X )mod mom1m2 A(X )mod m3m4m5
A(X) mod m0m1 A(X) mod m2 A(X) mod m3m4 A(X) mod 7715

/ \ / \

A(X) mod m0 A(X) mod m1 A(X) mod 7713 A(X) mod 7714

FIG. 3: Arbres des restes de A(X ) correspondant a la figure 2.

On fait l'observation suivante. Soient (Q(X ), R1 (X ), R2 (X )) trois 
polynômes a coefficients dans
le. Si on connait @ mod R1R2, on peut calculer @ mod R1 par l'opération :

@ mod R1 = (@ mod R1R2) mod R1.

Question 15 Écrire la fonction arbreRestes qui prend comme arguments l'arbre 
des sous--
produits et un polynôme A(X ) ; et qui retourne comme résultat l'arbre des 
restes de A(X ) Quelle
est la complexité de la fonction arbreRestes lorsqu'on utilise les fonctions de 
la partie III ? Quelle
est la complexité lorsqu'on ne les utilise pas ?

(* Caml *) arbreRestes : arbre --> poly --> arbre

{ Pascal } function arbreRestes(T : arbre ; A : poly) : arbre

À présent) on se sert de l'arbre des sous--produits pour factoriser les 
évaluations du même poly--
nôme A(X) aux nombreux points cm, cm, . . . an_1. On remarque qu'on a pour tout 
i (0 S i < 77.) : A(CQ) : A(X) mod (X -- ozi) Et on calcule ces valeurs a partir de A(X) mod (X -- dg)(X -- 041) - - - (X -- ozn_1) a l'aide de l'arbre des restes. Question 16 Écrire la fonction codageArbre qui prend comme arguments la liste 04 : (cm, . .. ,dn_1> et le polynôme A(a:) ; et qui retourne le codage de 
Reed-Solomon du message
A en utilisant l'arbre de sous--produits correspondant a la suite des polynômes 
X -- cri. Déterminer
sa complexité.

(* Caml *) codageArbre : poly --> poly --> poly
{ Pascal } function codageArbre(oz : poly ; A : poly) : poly