Poly
Poly
Poly
Objectifs du cours
Le cours de Codage de l’Information est un cours proposé aux étudiants en deuxième année
de licence d’informatique.
Il a pour but d’initier les étudiants à différentes problématiques du codage de l’informa-
tion : comment représenter en machine un nombre réel quelconque ? comment transmettre une
information à la sonde Rosetta en s’assurant qu’elle sera décodée correctement ? comment les
compresseurs de fichiers fonctionnent-ils ?
Dans la vie réelle une même information peut être représentée de diverses manières : par
exemple une « table » pourra notamment être désignée par « mesa », « tisch », « tafel »,
« pöytä », sans même évoquer les représentations possibles en dessin, en langue des signes, en
braille, . . .
Afin d’assurer une interopérabilité entre différents systèmes informatiques, il est nécessaire
de se mettre d’accord sur une même manière de représenter des nombres (entiers ou réels) et des
caractères. Ce sera l’objet de la première partie du cours.
Ces représentations nous amèneront à généraliser cette approche consistant à représenter un
symbole ou une valeur par une suite de bits, par exemple. Nous verrons donc ce qu’est un code
ainsi que certaines familles particulières de codes.
De nombreuses applications nécessitant d’utiliser le moins de mémoire possible, nous verrons
comment utiliser les codes ayant une longueur moyenne la plus faible possible. Ce qui nous
conduire à aborder la compression de données.
Enfin, les communications à grande distance (comme sur Internet, par exemple) nécessitent
des systèmes pour corriger les erreurs de transmission qui peuvent subvenir. Nous verrons donc
comment ajouter le moins d’information possible de manière à ce qu’on puisse détecter voire
corriger une erreur de transmission.
Pour résumer, les différents aspects abordés durant ce cours seront :
1. la représentation des données ;
2. les codes ;
3. l’optimalité des codages ;
4. la détection et la correction d’erreurs.
Le poly du cours
Ce polycopié est une compilation de notes de cours de Codage. Il est encore incomplet, et doit
très certainement contenir des erreurs. Merci de signaler ces erreurs à l’adresse Mikael.Salson@
univ-lille.fr.
3
4
Le site du cours
Le site du cours se trouve à l’adresse :
http://www.fil.univ-lille1.fr/portail/ls3/codage
.
Vous pouvez y accéder à l’aide de votre « téléphone élégant » (smartphone pour les anglo-
phones) grâce au QR-code de la figure 1.
Exemple 1 :
Calculons l’écriture binaire de l’entier n = 2395. Pour cela procédons par divisions euclidiennes
successives jusqu’à obtenir un quotient plus petit que b = 2 (autrement dit 1).
2395 = 2 × 1197 + 1
1197 = 2 × 598 + 1
598 = 2 × 299 + 0
299 = 2 × 149 + 1
149 = 2 × 74 + 1
74 = 2 × 37 + 0
37 = 2 × 18 + 1
18 = 2 × 9 + 0
9=2×4+1
4=2×2+0
2=2×1+0
1001010110112 .
Exemple 2 :
Calculons maintenant l’écriture du même nombre en base b = 8 par divisions euclidiennes
5
6 CHAPITRE 1. REPRÉSENTATION DES NOMBRES
2395 = 8 × 299 + 3
299 = 8 × 37 + 3
37 = 8 × 4 + 5
45338 .
Exemple 3 :
Calculons enfin l’écriture du même nombre en base b = 16 par divisions euclidiennes successives
jusqu’à obtenir un quotient inférieur à 16.
2395 = 16 × 149 + 11
149 = 16 × 9 + 5
95B16 .
Les exemples 1, 2 et 3 sont des illustration parfaites de l’exécution de cet algorithme avec
n = 2395 dans les trois cas et b = 2, b = 8 et b = 16.
1.1. NUMÉRATION DE POSITION 7
Calcul d’un entier à partir de son écriture dans une base : Inversement à partir de
la connaissance de l’écriture xp−1 xp−2 . . . x1 x0 2 dans une base b d’un entier n, il est possible de
calculer cet entier par une évaluation de la somme
p−1
X
n= x k bk .
k=0
Algorithme 1.2 Calcul d’un entier n à partir de son écriture dans une base b
Entrée : b une base, x0 , x1 , . . . , xp−1 les chiffres de l’écriture en base b d’un entier.
Sortie : l’entier n dont on a eu l’écriture en base b.
1: n := l’entier correspondant au chiffre x0
2: pour k variant de 1 à p − 1 faire
3: n := b × n+ l’entier correspondant au chiffre xk
4: fin pour
5: renvoyer n
Remarque : L’algorithme 1.2 est un cas particulier d’un algorithme plus général d’évaluation
d’un polynôme en un point : l’algorithme de Horner.
Pour un entier n non nul, la minimalité de p implique que xp−1 6= 0. Autrement dit la taille de
n est la longueur de l’écriture de n en base b sans zéros superflus à gauche.
Nous noterons |n|b cette taille.
Partons d’un premier constat.
Lemme 1.1. Soit p ≥ 1 un entier.
Un entier n a une taille égale à p si et seulement s’il appartient à l’intervalle [[bp−1 , bp − 1]].
Autrement dit,
|n|b = p ⇐⇒ n ∈ [[bp−1 , bp − 1]].
8 CHAPITRE 1. REPRÉSENTATION DES NOMBRES
réel x, on a
p = blogb nc + 1.
Théorème 1.1. Pour tout entier n > 0 et toute base b ≥ 2, on a
|n|b = blogb nc + 1.
Ce théorème permet de quantifier les intuitions que nous pouvons avoir :
— Plus un entier grandit, plus la taille de son écriture augmente. La fonction logb est en
effet strictement croissante et tend vers l’infini quand la variable tend vers l’infini. Mais
on sait que la croissance de cette fonction est bien moins rapide que celle de la variable
(limx→+∞ logxb x = 0). On peut aussi simplifier l’expression de la taille d’un grand entier
par en se contentant de l’approximer par logb n, puisque pour n → +∞
|n|b ∼ logb n.
— Pour un même entier ses écritures sont d’autant plus courtes que la base est grande. En
effet si b > b0 , pour tout réel x, logb x < logb0 x et donc |n|b ≤ |n|b0 .
— On peut même quantifier le rapport des tailles dans deux bases différentes d’un grand
entier :
|n|b blogb nc + 1
=
|n|b0 blogb0 nc + 1
logb n
∼
logb0 n
ln b0
= .
ln b
Ce dernier point montre que le rapport des tailles d’un grand entier dans deux bases
différentes est approximativement égal au rapport des logarithmes de ces deux bases.
Par exemple, avec b = 2 et b0 = 10, on a
|n|2 ln 10
≈ = log2 10 ≈ 3, 332.
|n|10 ln 2
L’octal sert dans le cadre d’une représentation par paquets de 3 bits. Dans les années 1960,
des ordinateurs travaillaient avec des registres de 12 ou 18 bits (par exemple le DEC PDP-8)
De nos jours, l’hexadécimal est particulièrement utilisé car il sert à représenter des paquets
de 4 bits : les processeurs actuels travaillent avec des registres de 8, 16, 32 ou 64 bits.
La table 1.1 montre la représentation des 16 premiers entiers naturels dans ces trois bases
ainsi que dans la base décimale, couramment utilisée dans la vie quotidienne.
Biquinaire
La représentation BCD utilise un nombre fixe de bits pour représenter chacun des chiffres
décimaux par leur représentation binaire. Le nombre minimal de bits afin de représenter dix
valeurs étant de quatre 1 , un chiffre en BCD est représenté sur quatre bits, quelque soit sa valeur
(voir Table 1.2).
L’addition de deux nombres BCD peut donner des résultats semblant absurdes. Par exemple
si on additionne 7 et 8 en représentation BCD, cela nous donne 0111 + 1000 = 1111. Or 1111
n’est pas un chiffre en BCD. Dans une telle situation, lorsque le résultat dépasse le plus grand
chiffre représentable (1001), il faut ajouter six (0110) au chiffre dépassant la capacité. Dans le
cas présent cela nous donne 1111 + 0110 = 10101 qui, remis sur un multiple de quatre bits,
correspond à 00010101, soit la représentation de 15 en BCD.
Le BCD est notamment utilisé dans certains afficheurs à cristaux liquides pour représenter
les nombres décimaux affichés.
Exemple 4 :
3, 141592 × 101 ,
Dans les deux cas, on appelle exposant la puissance, et mantisse le nombre qui multiplie le
nombre 10 à la puissance de l’exposant (3, 141592 dans le premier cas, et 1, 732 dans le second).
Cette écriture permet dans un espace limité pour le nombre de chiffres d’écrire des nombres
d’ordres de grandeur très variables, ce que ne permettrait pas une écriture dans laquelle la virgule
serait toujours placée entre le chiffre des unités ou dernier chiffre de la partie entière et le premier
chiffre de la partie fractionnaire.
En informatique, une norme s’est imposée pour la représentation des nombres flottants. C’est
la norme IEEE 754.
12 CHAPITRE 1. REPRÉSENTATION DES NOMBRES
(s, e, m)
où
— la première composante s détermine le signe du nombre représenté, ce signe valant 0 pour
un nombre positif, et 1 pour un nombre négatif ;
— la deuxième e désigne l’exposant ;
— et la troisième m désigne la mantisse.
La norme établit deux bases possibles pour la représentation : b = 2 ou b = 10. La norme prévoit
sept formats possibles :
— quatre formats pour la représentation en base b = 2 : sur 16, 32, 64 ou 128 bits 2 ;
— et trois formats pour la base b = 10 : sur 32, 64 et 128 bits.
Dans la suite nous ne mentionnons que les formats de base b = 2.
Le nombre représenté par le triplet (s, e, m) est
(−1)s × 2e × m.
Ainsi, les deux nombres précédents sont représentés par les triplets (0, 4, 1.963495) (car
31, 41592 = 1, 963495 × 24 ) et (1, −6, 1.10848) (car −0, 01732 = −1, 10848 × 2−6 ).
Il reste à coder les trois composantes (s, e, m) dans un format binaire.
Le signe : La représentation du signe est simple, il suffit d’un bit pour le représenter : le bit
0 pour le signe + et le bit 1 pour le signe −. Ce bit de signe est le bit le plus significatif de la
représentation, c’est–à–dire le bit le plus à gauche.
L’exposant, représenté sur w bits, peut prendre toute valeur entière comprise entre deux
entiers emin et emax . Ces deux bornes doivent vérifier la relation emin = 1 − emax . De plus, e
n’est pas stocké directement, à la place c’est l’entier naturel E qui le codera. On doit avoir
1 ≤ E ≤ 2w − 2 et E = e + 2w−1 − 1
2. Le type float en Python suit la norme IEEE 754 en base b = 2 sur 64 bits.
1.4. NOMBRES FLOTTANTS 13
Ces contraintes donnent les expressions suivantes pour les bornes de l’exposant e
emax = 2w−1 − 1
emin = 2 − 2w−1 .
1≤m<2
et
x = (−1)s × 2e × m.
Dans la représentation décimale de m, le chiffre à gauche de la virgule est nécessairement un
1. Il est donc inutile de le représenter. Ce n’est donc pas m qui est directement représenté mais
un entier naturel M , sur t bits, tel que :
m = 1 + 2−t × M.
Autrement dit, le bit de poids fort de M représente la valeur 1/2 tandis que le bit de poids
faible représente la valeur 1/2t .
1.4.2 Un exemple
Soit à représenter le nombre réel
x = 29, 75.
Ce nombre peut s’écrire
x = (−1)0 × 24 × 1, 859375.
On a donc s = 0, e = 4 et m = 1, 859375.
Selon la norme IEEE 754, la représentation de x sur 32 bits s’écrira
1. 0 pour le bit le plus à gauche (le nombre est positif) ;
2. 10000011 pour l’exposant, en effet E = e + 2w−1 − 1 = 4 + 128 − 1 = 131 ;
3. et 110111 suivi de 17 fois le bit 0, puisque M = 2t × (m − 1) s’écrit de cette façon sur 23
bits (m = 1, 859375 s’écrit m = 1, 1101112 car 0, 859375 = 211 + 212 + 214 + 215 + 216 ).
14 CHAPITRE 1. REPRÉSENTATION DES NOMBRES
Mémoire
A A accès 8 bits
B A A B accès 16 bits
D C B A A B C D accès 32 bits
0 1 2 3 0 1 2 3
petit-boutiste gros-boutiste
On en déduit que l’écriture binaire de x sur 32 bits est (les espaces sont là pour aider à la
lecture du signe, de l’exposant et de la mantisse)
0 10000011 11011100000000000000000
ou plus lisiblement en représentation hexadécimale
41EE0000.
∨ 0 1 ∧ 0 1 ⊕ 0 1
0 0 1 0 0 0 0 0 1
1 1 1 1 0 1 1 1 0
Ces trois opérations booléennes peuvent être étendues aux nombres entiers, en les appliquant
sur les écritures binaires de ces nombres.
Soient donc n et p deux nombres entiers naturels.
Opération ou : l’entier n ∨ p est défini comme étant le nombre entier dont la représentation
binaire est obtenue en faisant agir l’opérateur ∨ bit à bit sur chacun des bits des repré-
sentations binaires de n et p. Si ces représentations binaires n’ont pas la même taille, on
ajoute des bits nuls superflus en tête de la représentation la plus petite.
Opération et : la définition de n ∧ p est analogue.
Opération ou-exclusif : idem pour n ⊕ p.
Exemple 5 :
Calculons n ∨ p, n ∧ p et n ⊕ p avec n = 21 et p = 12.
En binaire, n s’écrit n = 101012 , et p = 11002 . L’écriture binaire de p a un bit de moins que
n, on rajoute donc un bit nul en tête. Par conséquent, en posant les opérations
1 0 1 0 1 1 0 1 0 1 1 0 1 0 1
∨ 0 1 1 0 0 ∧ 0 1 1 0 0 ⊕ 0 1 1 0 0
= 1 1 1 0 1 = 0 0 1 0 0 = 1 1 0 0 1
on obtient
n ∨ p = 111012 = 29
n ∧ p = 001002 = 4
n ⊕ p = 110012 = 25.
(n ∨ p) ∨ q = n ∨ (p ∨ q)
(n ∧ p) ∧ q = n ∧ (p ∧ q)
(n ⊕ p) ⊕ q = n ⊕ (p ⊕ q).
16 CHAPITRE 1. REPRÉSENTATION DES NOMBRES
Commutativité : ces trois opérations sont commutatives. Autrement dit pout tout couple d’en-
tiers n et p, on a
n∨p=p∨n
n∧p=p∧n
n ⊕ p = p ⊕ n.
Élement neutre : 0 est un élément neutre pour les opérations ∨ et ⊕. En effet, pour tout entier
n on a
n∨0=n
n ⊕ 0 = n.
n ∧ (2p − 1) = n.
1.6.2 Et la négation ?
Une opération logique n’a pas été évoquée : la négation. Si on note ¬b la négation d’un bit,
cette opération se définit très simplement par :
¬0 = 1
¬1 = 0.
Définir cette opération sur n’importe quel entier naturel pose un petit problème. A priori, on
pourrait être tenté de définir la négation d’un entier comme étant l’entier obtenu en changeant
tous les bits de la représentation binaire de cet entier. Ainsi on aurait par exemple
En revanche, la négation peut être définie avec toutes les bonnes propriétés attendues si on
limite les entiers à un intervalle de la forme [[0, 2p − 1]], l’entier p pouvant être n’importe quel
entier positif. Si n ∈ [[0, 2p − 1]], son écriture binaire a une taille au maximum égale à p. Si cette
taille est strictement inférieure à p on complète l’écriture binaire avec des 0 à gauche pour obtenir
une écriture de taille p. La négation de n est le nombre entier dont l’écriture binaire est celle
obtenue en appliquant la négation sur chacun des bits de l’écriture de n.
Exemple 6 :
Avec n = 21 et p = 8, on a
n = 000101012 ,
et
¬n = 111010102 = 234.
n = 00000000000101012 ,
et
¬n = 11111111111010102 = 68054.
Ainsi la négation d’un entier n’est définie que relativement à une taille de représentation p
donnée.
¬n ∈ [[0, 2p − 1]].
¬¬n = n.
Exemple 7 :
Pour n = 21 = 101012 ,
n 2 = 1012 = 5,
n 2 = 10101002 = 84.
n k = n × 2k ,
Ainsi les opérations de décalage correspondent à des multiplications et divisions par des
puissances de 2.
(n ∧ 2k ) k = (n ∧ (1 k)) k
vaut le bit de rang k (le k + 1-ème bit de poids faible) de l’écriture binaire de n.
Dans le détail 1 k = 2k qui s’écrit, en binaire, avec un 1 suivi de k zéros. Cette valeur
va servir de masque. Les 0 de l’écriture binaire masquent les bits qui ne nous intéressent pas
dans la valeur de n. Pour appliquer ce masque il faut utiliser l’opérateur logique ∧ (et) car 0 ∧ x
donne toujours 0. C’est l’opérateur qu’il faut utiliser avec un masque. Ainsi n ∧ (1 k) permet
de mettre tous les bits à 0 sauf celui de rang k qui conserve sa valeur. Il reste enfin à décaler ce
bit de k rangs vers la droite afin de l’amener au rang 0.
Terminons avec un exemple. Notre valeur n est inconnue mais est composée de 6 bits :
n = b5 b4 b3 b2 b1 b0 2 . Nous souhaitons récupérer le bit b4 de n. Pour cela nous allons faire un
masque avec la valeur 100002 = 24 = 1 4. Le résultat du et entre ces deux nombres est :
b5 b4 b3 b2 b1 b0 2 ∧ 100002 = b4 00002
b4 00002 4 = b4 2
Cette idée peut être généralisée à un nombre quelconque de bits. Un masque sert à isoler les
bits qui nous intéressent dans un entier. Toutes les positions à 1 dans le masque correspondent
aux positions que l’on souhaite récupérer dans notre entier. Appliquer l’opérateur ∧ entre le
masque et l’entier permet d’obtenir le résultat voulu.
1.7. EXERCICES 19
Notre masque a imposé des bits à 1 aux positions auxquelles notre masque possédait des 1.
1.7 Exercices
1.7.1 Bases de numération
Exercice 1-1 Conversions
Soit b ≥ 2 un entier.
Question 1 Quels sont les nombres entiers naturels dont l’écriture en base b comprend n chiffres au
maximum ? Combien y en a–t–il ?
Question 2 Même question pour les entiers dont l’écriture en base b possède exactement n chiffres.
Exercice 1-3 Additions et multiplications
Question 1 Construisez les tables d’addition et de multiplication en base 2, puis effectuez les opérations
1110102 + 10012 et 1100102 × 10012 .
20 CHAPITRE 1. REPRÉSENTATION DES NOMBRES
Soit x le nombre entier naturel dont l’écriture binaire est 10 . . . 012 (n chiffres 0 encadrés par
deux 1, n étant non nul). Comment s’écrivent x2 et x3 en base 2 ?
pour approfondir Exercice 1-6 Miroirs
Dans le système de numération de base b, on considère deux entiers naturels non nuls c et d
différents de 1 et de b qui vérifient c + d = b + 1, avec b ≥ 3.
Question 1 Quel encadrement des valeurs de c et d peut-on proposer ? Que sont c et d ?
Question 2 Prouvez que les nombres n = c(b − 1) et m = d(b − 1) s’écrivent avec les mêmes chiffres
mais disposés en ordre inverse.
Question 3 Comment s’écrit la somme n + m en base b ?
Le plus grand nombre premier 4 connu ce jour (16 octobre 2019) est le 50-ème nombre premier
de Mersenne
N = 277232917 − 1.
Python, à l’inverse de beaucoup de langages, permet de représenter des entiers dont la seule
limite est fixée par les capacités mémoires de la machine.
Question 1 En supposant qu’un entier est stocké sur le nombre minimal de bits, de combien de bits
sera composé un entier occupant 1 Go de mémoire ?
Question 2 Quel est le plus grand entier qu’on peut représenter sur ce nombre de bits ?
Question 3 De combien de chiffres est composé cet entier en décimal ?
Exercice 1-9 Représentation binaire des entiers signés
Question 1 Représentez le nombre −10310 en binaire sur 8 bits dans le codage signe–valeur absolue et
en complément à deux.
Question 2 Suivant la représentation, quel est l’entier codé sur 8 bits par 110110012 ?
Question 3 Suivant la représentation, quel est l’entier codé sur 9 bits par 0110110012 ?
Question 4 Lorsque le codage s’effectue sur n bits, quels sont les entiers que l’on peut représenter avec
le codage signe–valeur absolue ? avec le codage en complément à deux ?
Exercice 1-10 Codage BCD
Codez en BCD les entiers 123 et 78. Puis effectuez en BCD l’addition 123 + 78.
Exercice 1-11 Bug de l’an 2010
Question 1 Le 1er janvier 2010 certains téléphones portables affichaient les SMS reçus avec une date
au 1er janvier 2016. Sur ces téléphones, les années étaient affichées sur deux chiffres. Les dates dans les
SMS sont codées en BCD. Comment expliquez-vous ce bug ?
pour approfondir Exercice 1-12 Les entiers de MAPLE
Le logiciel de calcul mathématique MAPLE travaille sur des entiers représentés dans une base
qui est la plus grande puissance de 10 dont le carré puisse s’écrire dans un registre du processeur.
Question 1 Déterminez cette base pour un processeur 32 bits.
Question 2 Quel intérêt peut avoir une telle représentation ?
Dans la norme IEEE-754, les nombres flottants peuvent être représentés en base b = 2 sous
la forme
x = (−1)s × 2e × m
où m est un réel compris entre 1 inclus et 2 exclu, appelé mantisse, et e est un entier relatif,
appelé exposant.
Il existe quatre codages :
1. sur 16 bits pour une demie précision ;
2. sur 32 bits pour une simple précision ;
3. sur 64 bits pour une double précision ;
4. sur 128 bits pour une quadruple précision.
Dans cet exercice, on va considérer la version sur 16 bits.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
s E m−1
— les dix bits de poids faible forment la représentation binaire de la partie fractionnaire de
la mantisse, c’est-à-dire de m − 1 , ainsi le bit de poids faible de la mantisse représente la
valeur 2110 alors que le bit de poids fort de la mantisse représente la valeur 12 ;
— les cinq bits suivants stockent E duquel on obtient l’exposant e en calculant e = E − 15 ;
22 CHAPITRE 1. REPRÉSENTATION DES NOMBRES
En Python, les entiers sont de précision illimitée, ce qui signifie qu’ils peuvent être aussi grands
que la capacité de la machine le permet. En revanche les flottants sont de précision limitée : ils
sont stockés sur 64 bits en suivant la norme IEEE-754.
Nous cherchons à trouver le plus petit entier naturel qui ne peut pas être représenté comme
un flottant, en suivant la norme IEEE-754. Autrement dit, nous cherchons le plus petit entier i
tel que l’expression Python suivante soit vraie : i != floor(float(i))
Question 1 Dans la représentation IEEE-754 sur 64 bits, il existe une seule valeur de l’exposant e
pour laquelle tous les flottants positifs ayant cette valeur d’exposant sont uniquement les entiers de 2e à
2e+1 − 1. Quelle est cette valeur de e ?
Question 2 Quel est le plus petit entier qui ne peut pas être représenté par un flottant dans la norme
IEEE-754 sur 64 bits ?
1.7.4 Boutisme
Exercice 1-15 Boutisme
Question 1 Donnez la représentation (en hexadécimal) de l’entier 21 + 210 + 219 + 228 en gros-boutiste
et en petit-boutiste.
Question 1 Calculez n ⊕ m, n ∧ m, n ∨ m, n << 2, n >> 2 pour n = 453 et m = 316, puis donnez les
résultats en décimal.
Question 2 L’opération ⊕ admet-elle un élément neutre dans N ? et ∧ ? et ∨ ? et si on se restreint à
l’intervalle des entiers compris entre 0 et 2p − 1 ?
Question 3 Comment tester si un entier est pair à l’aide des opérations logiques ?
Exercice 1-17 Le compte est bon
En utilisant les opérations logiques sur les entiers, arrivez au résultat demandé en utilisant
les nombres proposés au plus une fois.
Question 1
Nombres 218 86 15
Résultat 82
Question 2
1.7. EXERCICES 23
Nombres 1 13 23 67
Résultat 111
Exercice 1-18 Utilisation de masques
Soit n un entier représenté sur 8 bits que nous écrirons n = b7 b6 b5 b4 b3 b2 b1 b0 2 . Les valeurs
de b0 , . . . , b7 sont inconnues.
Question 1 Donnez une expression utilisant exclusivement n et des opérateurs logiques qui ait pour
résultat b4 b3 2 .
Question 2 Donnez une expression utilisant exclusivement n et des opérateurs logiques qui ait pour
résultat b7 b0 2 .
Question 3 Donnez une expression utilisant exclusivement n et des opérateurs logiques qui ait pour
résultat b7 b5 111b2 2 .
Question 1 Le plus grand entier évoqué à l’exercice 7 est stocké 5 dans un fichier texte de 23,7 Mo.
Comment expliquez-vous la différence avec le nombre de Mo nécessaires au stockage de ce nombre ?
Exercice 1-20
En utilisant la vue sur un fichier texte depuis un éditeur hexadécimal (cf figure 1.2), remplissez
le tableau suivant :
Car bin oct déc hexa
L
6c
32
105
1100010
Exercice 1-21 Halloween et Noël
Codes et codages
e t
2.1 Exemples de codages
2.1.1 Le codage Morse
Le codage Morse, plus communément code Morse, a été mis au point en 1838 par Samuel
Morse pour la télégraphie.
Il est d’usage d’utiliser deux symboles, le point et le tiret , pour représenter ce codage (cf
table B.1 page 91). Mais en réalité, il faut rajouter un symbole, non graphiquement représenté :
la coupure entre les codes, sans quoi ce codage ne serait pas décodable (cf page 37).
Ce codage permet de coder les 26 lettres de l’alphabet latin, les 10 chiffres décimaux, ainsi que
certains symboles de ponctuation et autres caractères accentués spécifiques à certaines langues.
25
26 CHAPITRE 2. CODES ET CODAGES
Ce codage ne code aucune version accentuée des lettres latines utilisée dans les langues euro-
péennes autre que l’anglais, et n’inclut encore moins les caractères spécifiques à d’autres alpha-
bets : arabe, cyrillique, grec, . . .
Dans le codage ASCII, tous les codes sont des mots binaires de 7 bits. Ils ont souvent été
complétés d’un huitième bit :
— soit un bit de parité pour pouvoir détecter certaines erreurs pouvant survenir dans les
communications (cf chapitre 4) ;
— soit un bit fixé à 0, les codes ASCII correspondant alors aux nombres de 0 à 127 codés en
binaire.
2.2.1 Alphabets
Un alphabet est un ensemble fini non vide dont les éléments sont appelés selon les contextes
symboles, caractères ou lettres. Nous désignerons les alphabets par des lettres majuscules de la
2.2. ALPHABETS, MOTS ET LANGAGES 27
forme A, B ...
Exemple 1 :
Selon les besoins les alphabets peuvent être très divers.
— Alphabet des 26 lettres latines (non accentuées) :
A = {A, B, C, . . . , Z}.
A = {I, V, X, L, C, D, M}.
A = {0, 1, 2, . . . , 9}.
A = {0, 1}.
Remarque : Rien n’interdit de concevoir un alphabet qui ne contient qu’un seul symbole,
mais un tel alphabet représente un intérêt extrêmement limité. Dans toute la suite, sauf mention
explicite du contraire, les alphabets que nous considérerons seront constitués d’au moins deux
symboles.
Nous noterons en général q le nombre de symboles qu’un alphabet contient.
card(A) = q.
2.2.2 Mots
Un mot sur un alphabet A est une suite finie éventuellement vide de symboles de A. La
longueur d’un mot est le nombre de symboles dans cette suite. Nous désignerons souvent les
mots par des lettres grasses de la forme u, v, w ..., et la longueur d’un mot sera notée entre deux
barres verticales (|).
|u| = longueur du mot u.
Exemple 2 :
Voici quelques exemples de mots correspondant aux alphabets de l’exemple 1.
— CODAGE, TIMOLEON, ZTAGHUR, G sont quatre mots sur l’alphabet latin de longueurs respec-
tives 6, 8, 9 et 1. Le troisième exemple montre qu’un mot peut être n’importe quelle
suite de symboles et pas seulement un mot figurant dans un dictionnaire.
— IV, CLII et IIDVLM sont trois mots sur l’alphabet de la numération romaine de longueurs
repectives 2, 4 et 6. Encore une fois le troisième exemple montre qu’un mot peut être
n’importe quelle suite de symboles.
Nous utiliserons les notations
1. ε pour désigner le mot vide ;
2. An , n ∈ N, pour désigner l’ensemble de tous les mots de longueur n sur l’alphabet A ;
28 CHAPITRE 2. CODES ET CODAGES
4. A+ pour désigner l’ensemble de tous les mots non vides sur l’alphabet A :
[
A+ = An .
n>0
u.v = CODAGE,
et
v.u = DAGECO.
Propriétés de la concaténation
— Associativité : pour tous mots u, v et w, on a
(u.v).w = u.(v.w).
Cette propriété assure la non ambiguïté du non usage des parenthèses lorsqu’on écrit
u.v.w pour la concaténation de trois mots.
— Élément neutre : le mot vide laisse tout mot inchangé par concaténation. Pour tout mot
u, on a
ε.u = u.ε = u.
— Non commutativité comme le montre l’exemple 3. En général
u.v 6= v.u.
Puissance n-ème d’un mot : Nous utiliserons la notation puissance pour désigner la conca-
ténation d’un mot avec lui-même plusieurs fois.
un = u.u.
| {z . . . .u} .
n fois
Lorsque n = 0,
u0 = ε.
2.2. ALPHABETS, MOTS ET LANGAGES 29
v = u.w.
Exemple 4 :
— Le mot vide est préfixe de tous les mots. En effet on a vu que pour tout mot u,
u = ε.u.
u = u.ε.
— Les préfixes du mot CODAGE sont les mots ε, C, CO, COD, CODA, CODAG et CODAGE.
Le nombre de préfixes d’un mot est égal à la longueur de ce mot plus un.
card(Pref(u)) = |u| + 1.
2.2.5 Langages
On appelle langage sur un alphabet A tout sous-ensemble de A∗ .
Exemple 5 :
Pour n’importe quel alphabet A, ∅ et A∗ sont deux langages sur A. Le premier ne contient
aucun mot, et le second contient tous les mots de A∗ : ce sont, pour un alphabet donné, le plus
petit et le plus gros langage.
Voici d’autres exemples de langages.
— Le langage des mots construits sur l’alphabet latin qui figure dans l’édition 2010 du Petit
Robert. Ce langage contient environ 60 000 mots.
— Le langage des mots construits sur l’alphabet binaire dont la première lettre est un 1, et
est suivie de n’importe quel nombre de 0. Ce langage contient une infinité de mots.
— An , n étant un entier naturel, est le langage des mots de longueur n sur l’alphabet A.
C’est un langage qui contient q n mots si l’alphabet contient q symboles.
Remarque : Comme le montre l’exemple 5, les langages peuvent être infinis ou non. Dans ce
cours nous condidèrerons essentiellement des langages finis.
30 CHAPITRE 2. CODES ET CODAGES
Exemple 6 :
Le dernier exemple ci-dessus montre que contrairement à ce qu’on pourrait être amené à
croire, le nombre de mots dans un langage concaténé de deux langages finis n’est pas égal au
produit des nombres de mots de chacun des deux langages. Mais, on a tout de même la relation
suivante
Puissance n-ème d’un langage : Comme pour les mots, on utilise la notation puissance
pour désigner un langage concaténé avec lui-même n fois.
Ln = L.L.
| {z . . . .L} .
n fois
Lorsque n = 0,
L0 = {ε}.
Étoile d’un langage : L’étoile d’un langage L, notée L∗ , est l’ensemble de tous les mots que
l’on peut former en concaténant des mots de L. Formellement, c’est le langage obtenu par réunion
de toutes les puissances de L.
[
L∗ = Ln .
n≥0
0 1
00 01 10 11
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
laquelle on peut joindre n’importe quel mot le long d’une branche. Dans le cas binaire, à partir
de n’importe quel mot partent deux arcs, et dans le cas ternaire il y en a trois.
Pour représenter graphiquement un langage, nous utiliserons cette représentation arbores-
cente, mais nous distiguerons les mots du langage de ceux qui n’en font pas partie en marquant
les premiers d’un grisé comme ceci : mot du langage . La figure 2.3 montre l’arbre du langage
binaire
L = {00, 01, 110, 001}.
Il faut remarquer qu’on trouve les préfixes d’un mot sur la branche qui sépare le mot vide du
mot lui-même. On reviendra sur cette remarque plus tard à propos des langages préfixes.
210 202
211 201
212 200
122
21 20 121
220 120
221 22 2 12
112
222
ε 1 11 111
000
110
001 00 0 10
002 102
01 02 101
100
010 022
011 021
012 020
0 1
00 01 11
001 110
Figure 2.3 – Arbres des mots du langage L = {00, 01, 110, 001}
seulement si u ∈ L∗ .
Exemple 7 :
u = 0.01.10,
et chaque mot de cette décomposition est dans L. De plus, cette décomposition est unique.
— Le mot v = 010 est factorisable dans L de deux façons :
v = 0.10 = 01.0.
— Le mot w = 1100 n’est pas factorisable dans L, car il est impossible d’obtenir un mot
débutant par deux 1 consécutifs en concaténant des mots de L.
2.3. CODES ET CODAGES 33
Exemple 8 :
Pour un alphabet A quelconque, si on prend L = A, alors tout mot possède une factorisation
unique dans L. Il suffit de prendre les mots d’une lettre pour la factorisation, et c’est évidemment
la seule façon d’obtenir une factorisation.
2.3.2 Codes
Un code est un langage dans lequel tous les mots ne possèdent au plus qu’une seule factori-
sation.
Commençons par donner des exemples de langages qui ne sont pas des codes.
Exemple 9 :
— Le langage de l’exemple 7 n’est pas un code, puisqu’il existe des mots ayant plusieurs
factorisations dans ce code.
— Un langage contenant le mot vide n’est pas un code, puisque dans un tel langage tout
mot ayant une factorisation dans L admet plusieurs factorisations dans L obtenues par
insertion du mot vide dans la factorisation initiale. En effet si u1 , u2 , ..., up est une
factorisation d’un mot u avec des mots de L, alors on obtient (une infinité) d’autres
factorisations de u par
ε=ε
= ε2
= ε3
= ...
— Le langage L = {10n | n ∈ N}, langage contenant tous les mots débutant par 1 suivi d’un
nombre (n) quelconque de 0, est un code. Tous les mots binaires débutant par 1 possèdent
une factorisation unique dans L, les autres n’en ont pas.
— Le langage de la figure 2.3 est un code.
card(C n ) = card(C)n .
Remarque : Contrairement aux nombres premiers qui permettent d’engendrer tous les nombres
entiers par multiplication, en général un code ne permet pas de composer tous les mots par conca-
ténation. Il peut exister des mots n’ayant pas de factorisation (cf exemple 10).
2.3.3 Codages
Intuitivement, un codage transforme des mots construits sur un alphabet source S en des
mots sur un alphabet cible A. Le codage ASCII transforme tout symbole d’un alphabet qui en
contient 128 en un mot binaire de 8 bits. Les codages ISO-LATIN transforment tous les symboles
d’un alphabet qui en contient 224 en un mot binaire de longueur 8. Le codage UTF-8 transforme
les symboles d’un alphabet qui en contient plus de deux millions en un mot binaire de 8, 16, 24
ou 32 bits.
Formellement, un codage est une application
c : S ∗ −→ A∗
c(ε) = ε.
La première de ces trois propriétés est nécessaire sans quoi il serait impossible de décoder
certains mots. La seconde et la troisième propriété sont des propriétés qui rendent effective la
procédure d’encodage (cf algorithmes 2.1 et 2.2) et qui permettent la caractérisation donnée par
le théorème suivant.
Definition 1. Caractérisation d’un codage
Un codage c : S ∗ −→ A∗ est entièrement caractérisé par les mots associés aux symboles de
S.
De plus, le langage
C = {c(x) | x ∈ S}
est un code qui sera appelé code associé au codage.
2.3. CODES ET CODAGES 35
Remarque : Dans cette définition d’un codage nous exigeons que la fonction c soit injective
pour des raisons évidentes liées à la nécessité de pouvoir décoder une information codée. Cela
implique en particulier que le nombre de mots du code associé soit au moins égal à celui du
nombre de symboles de l’alphabet source
card(S) ≤ card(C).
Si le nombre de mots du code est strictement plus grand que le nombre de symboles de l’alphabet
à coder, il y a des mots du code qui ne servent à rien. On peut donc supposer, sans perte de
généralité, que ces deux nombres sont égaux
card(S) = card(C),
et comme les alphabets que nous considérons sont des ensembles finis, cela explique le fait que
nous nous intéressions principalement aux codes finis. La fonction de codage établit alors une
bijection entre l’alphabet source et le code.
Autre remarque : La donnée d’un code seul ne suffit évidemment pas à caractériser le codage
d’un alphabet. Il faut expliciter la correspondance entre chaque symbole de l’alphabet à coder
et le mot du code qui lui est associé. C’est le rôle de la fonction c. Pour un alphabet et un code
de cardinal q donnés, cela donne q! = 1 × 2 × . . . × q codages possibles.
Exemple 11 :
— La table des caractères ASCII est un codage d’un alphabet de 128 symboles par des mots
binaires de 7 bits (cf l’annexe B.3 pour avoir la correspondance complète). Le code est
constitué des 128 mots binaires de longueur 8 dont le bit de poids fort est 0.
— Les codages ISO-8859 constituent bien des codages au sens où nous venons de le définir.
Pour le codage ISO-8859-1 (ou ISO-LATIN1), l’alphabet source est constitué de 224 ca-
ractères (les 128 caractères de l’alphabet ASCII, auxquels viennent s’ajouter 96 autres
caractères), et le code sous-jacent est formé de mots binaires de longueur 8 (cf l’annexe
B.4).
— Toute permutation des lettres d’un alphabet, c’est-à-dire toute fonction bijective qui à
une lettre d’un alphabet associe une lettre du même alphabet, est un codage. C’est par
exemple de tels codages qui ont été employés par le passé pour rendre confidentiels cer-
tains messages 1 . Ce domaine des codages est celui d’une discipline voisine qu’on nomme
cryptographie.
Algorithmes d’encodage : Les algorithmes 2.1 et 2.2 sont des algorithmes, récursif pour le
premier et itératif pour le second, d’encodage d’un mot quelconque par un codage quelconque.
Dans ces deux algorithmes, le codage d’une lettre (c(x)) peut être obtenu par consultation d’une
table de codage.
le décodage doit permettre de retrouver un mot de S ∗ à partir du mot de A∗ qui le code, d’où
(en notant d la fonction de décodage)
d : A∗ → S ∗ ,
d(c(u)) = u,
que
C ⊆ An .
Exemple 12 :
— Les 128 mots (octets) utilisé pour le codage ASCII forment un code de longueur fixe.
— Le code associé à l’un quelconque des codages ISO-8859 est un code de longueur fixe.
— Le code associé à l’UTF-8 n’est pas un code de longueur fixe.
Il est facile de décoder les mots obtenus par un codage de longueur fixe. L’algorithme 2.3
décrit la procédure de décodage.
v = v1 .v2 . . . . vp .
5: fin si
6: pour chaque vi faire
7: chercher xi ∈ S tel que c(xi ) = vi
8: si xi n’existe pas alors
9: renvoyer ECHEC
10: fin si
11: fin pour
12: renvoyer u = x1 .x2 . . . . xp .
e at e
est réservé pour marquer le début ou la fin des mots du code. Ce symbole particulier est appelé
ae
une virgule. Il permet de factoriser un message codé avec ce code.
en
Exemple 13 :
— Le Morse est un code à virgule. En effet, contrairement à ce qu’on pourrait croire, l’alpha-
bet cible n’est pas limité aux deux seuls symboles point et tiret , ce qui le rendrait
indécodable. En effet, le mot possède deux factorisations : ( ).( ) correspondant
à AE et ( ).( ) correspondant à EN. Le Morse est un code sonore dans lequel les silences
servent à séparer les mots du code. Le silence est donc un symbole particulier du code, la
virgule, qui marque la fin de tous les mots.
— Le troisième code de l’exemple 10 page 33 est un code à virgule, le symbole 1 fait office
de virgule.
Le décodage pour les codes à virgule est décrit par l’algorithme 2.4 page suivante.
38 CHAPITRE 2. CODES ET CODAGES
u 6∈ Pref(v) et v 6∈ Pref(u).
Exemple 14 :
u = u1 .u2 . . . . .up
= u01 .u02 . . . . .u0r ,
autrement dit,
u1 .u2 . . . . .up = u01 .u02 . . . . .u0r (2.1)
2.5. EXISTENCE DE CODES 39
Comme on a supposé que le mot u est de longueur minimale parmi ceux ayant une double
factorisation dans L, les deux mots u1 et u01 ont des longueurs différentes, car dans le cas contraire
l’équation 2.1 montre que ces deux mots sont égaux, et se simplifie en
Remarque : La réciproque du théorème 2.1 n’est pas vraie. Il existe des langages non préfixes
qui sont des codes. C’est par exemple le cas du langage L = {10n | n ∈ N} donné dans l’exemple 10
page 33. C’est aussi le cas du langage
qui n’est pas un langage préfixe (car 00 est préfixe de 001), mais néanmoins est un code comme
nous le verrons dans la section 2.6.1 page 43.
Arbre d’un code préfixe : L’arbre d’un code préfixe possède la particularité que le long
d’une branche issue de la racine, il ne peut y avoir qu’un seul mot du langage. Dans l’arbre d’un
code préfixe, les branches peuvent être délimitées par les mots du code. Ce n’est pas le cas pour
les langages non préfixes comme celui mentionné plus haut (cf figure 2.3 page 32).
La figure 2.4 montre l’arbre du premier code donné dans l’exemple 14 page ci-contre. On
constate que cet arbre est limité à cinq branches, chacune d’elles terminée par l’un des cinq mots
de ce code.
ε
0 1
00 01 10 11
Algorithme 2.5 decode_lettre(v,a) : Décodage récursif d’une lettre pour un codage préfixe
Entrée : Un sous-arbre non vide a d’un codage préfixe c : S → A∗ et un mot v ∈ A∗ non
vide.
Sortie : Le couple (x, v0 ) ∈ S × A∗ tel que v = c(x).v0 s’il existe.
1: si a est une feuille alors
2: renvoyer le couple (x,v) où x est la lettre attachée à a
3: sinon
4: soit y la première lettre de v et v0 tel que v = y.v0
5: si le sous-arbre de a correspondant à y est vide alors
6: renvoyer ECHEC
7: sinon
8: soit a0 le sous-arbre correspondant à y
9: renvoyer decode_lettre(v0 , a0 )
10: fin si
11: fin si
1. un alphabet A à q symboles,
2. un entier m ∈ N,
3. et m entiers l1 , l2 , ... et lm ,
existe-t-il un code C ⊂ A∗ contenant m mots dont les longueurs sont l1 , l2 , ...lm ?
Cette question apparaît naturellement lorsqu’on se demande s’il est possible de coder les
symboles d’un alphabet S avec des mots sur un alphabet A dont les longueurs sont imposées.
Nous allons traiter d’abord cette question pour les codes de longueur fixe pour lesquelles la
réponse est simple, puis nous allons répondre pour les codes préfixes, pour enfin terminer avec
les codes quelconques.
Dans toute la suite, nous appellerons distribution de longueurs d’un langage fini la donnée
des longueurs l1 , l2 , . . . lm des mots de ce langage, et nous la noterons [l1 , l2 , . . . , lm ].
La preuve du théorème nécessite de considérer les arbres q-aires (c’est-à-dire les arbres dont
chaque nœud possède au plus q descendants). Si on peut construire un arbre q-aire avec m feuilles
aux profondeurs [l1 , . . . , lm ] alors on peut construire un code préfixe avec des mots de longueurs
[l1 , . . . , lm ].
Lemme 2.1. Il existe un arbre q-aire disposant de m feuilles dont les profondeurs sont [p1 , p2 , . . . , pm ]
si et seulement si
Xm
q −pk ≤ 1
k=1
.
Démonstration. Soit un arbre q-aire A dont les m feuilles ont pour profondeur [p1 , p2 , . . . , pm ].
Une feuille à une profondeur p occupe une place sur les q p places en théorie possible
Pm à cette
profondeur. Il est donc impossible d’ajouter une feuille à un arbre q-aire lorsque k=1 q −pk = 1
puisque l’ensemble des feuilles occupent toute la place disponible. Donc
m
X
q −pk ≤ 1
k=1
Pm
Soit m profondeurs de feuilles [p1 , p2 , . . . , pm ] telles que k=1 q −pk ≤ 1. Il est possible de
construire un arbre q-aire avec cette distribution de profondeurs car une feuille à une profondeur
p occupe une place q1p dans l’arbre. La somme pour toutes les feuilles ne doit pas dépasser 1
(c’est-à-dire 100 % de l’arbre occupé), ce qui est le cas par hypothèse.
42 CHAPITRE 2. CODES ET CODAGES
La seule différence entre les deux théorèmes réside dans l’absence du qualificatif préfixe pour
le code dont une condition nécessaire et suffisante d’existence est donnée.
Voici un corollaire important du théorème de McMillan.
Corollaire 2.1. Pour tout code fini, il existe un code préfixe ayant la même distribution de
longueurs.
Ce corollaire montre donc qu’on ne perd rien à vouloir se limiter aux seuls codes préfixes.
On appelle somme de Kraft d’un langage fini L le nombre réel
X
K(L) = q −|u| .
u∈L
Pour un langage fixé, le théorème 2.3 donne une condition nécessaire, mais pas suffisante pour
que ce langage soit un code.
K(L) ≤ 1.
Cette condition n’est pas suffisante comme le montre l’exemple L = {0, 00} qui n’est pas
un code, mais dont la somme de Kraft vaut 3/4. Il faut donc bien faire attention. La somme
de Kraft ne permet pas d’affirmer qu’un langage particulier est un code. Elle permet seulement
d’affirmer que la distribution des longueurs des mots d’un langage est compatible avec un code.
Dans l’exemple ci-dessus, ce que permet de savoir la somme de Kraft est qu’il existe un code
avec un mot de longueur 1 et un mot de longueur 2.
2.6. ALGORITHME DE DÉCISION POUR UN CODE 43
L0 = L (2.4)
L1 = L −1
.L \ {ε} (2.5)
et pour tout n ≥ 1
Ln+1 = L−1 .Ln ∪ L−1
n .L (2.6)
∗
Théorème 2.4. Un langage L ⊂ A est un code si et seulement si le mot vide n’est dans aucun
des langages Ln de la suite définie ci-dessus.
Exemple 17 :
Voici quelques de suites de langages Ln obtenues sur divers exemples.
1. Lorsque L est un langage de longueur fixe (non nulle), alors L1 = L−1 .L \ {ε = ∅, et par
conséquent, pour tout entier n ≥ 2, Ln = ∅. Le mot vide n’est dans aucun langage Ln , et
L est bien évidemment un code.
2. Lorsque L est un langage préfixe (autre que le langage réduit au seul mot vide), L1 = ∅
et il en est de même pour tous les langages Ln avec n ≥ 2. Et tout langage préfixe est un
code.
3. Pour le langage L = {1, 00, 01, 10}, on a
L1 = {0}
L2 = {0, 1}
L3 = {0, 1, ε}
Comme ε ∈ L3 , L n’est pas un code. La raison pour laquelle ε ∈ L3 réside dans le fait
que 1 ∈ L et 1 ∈ L2 (1−1 .1 = ε). Et la raison pour laquelle 1 ∈ L2 provient du fait que
1 = 0−1 .01 avec 0 ∈ L1 et 01 ∈ L. Enfin 0 ∈ L1 parce que 0 = 1−1 .10 avec 1 ∈ L et 10 ∈ L.
Ainsi on a bien construit une double factorisation du mot 101 avec des mots de L :
101 = |{z}
1 . |{z}
01 = |{z}
10 . |{z}
1
L1 = {01}
L2 = {0, 1, 001}
L3 = {00, 10, 11, 1001}
L4 = {0}
L5 = {00, 10, 11, 1001}
L2n = L4 ,
46 CHAPITRE 2. CODES ET CODAGES
L2n+1 = L3 .
Ainsi, le mot vide n’est dans aucun des langages Ln , et L est un code.
Pour les langages finis on a la propriété importante décrite dans le lemme qui suit.
Lemme 2.2. Lorsque L est un langage fini, la suite (Ln ) est périodique, et la période est donné
par le premier indice n pour lequel il existe un indice k < n tel que Lk = Ln .
Preuve du lemme 2.2. Les langages Ln sont tous des langages inclus dans l’ensemble des suffixes
des mots de L. Si L est fini, alors il en est de même, et il n’y a qu’un nombre fini d’ensembles
possibles pour les Ln . On a donc nécessairement dans la suite de ces langages deux langages
égaux.
Soient donc k < n les deux plus petits indices pour lesquels Lk = Ln .
Puisque le calcul d’un langage de la suite ne fait intervenir que le langage qui précède et le
langage initial L, on en déduit que
Ln+1 = Lk+1 ,
Ln+i = Lk+i .
Le lemme 2.2 assure qu’en un nombre fini de calculs, on a déterminé tous les langages inter-
venant dans la suite (Ln ), ce qui donne un algorithme pour décider si un langage est ou non un
code. C’est l’algorithme 2.7 connu sous le nom d’algorithme de Sardinas et Patterson.
2.7 Exercices
2.7.1 Première série
Codages ASCII, ISO-8859-1 et UTF-8
Exercice 2-1 Avec le codage ASCII
00000000 4C 61 20 43 69 67 61 6C 65 20 65 74 20 6C 61 20
00000010 46 6F 75 72 6D 69 0A 0A 4C 61 20 43 69 67 61 6C
00000020 65 2C 20 61 79 61 6E 74 20 63 68 61 6E 74 65 0A
00000030 54 6F 75 74 20 6C 27 65 74 65 2C 0A 53 65 20 74
On rappelle que le codage ISO-8859-1 (encore appelé ISO-LATIN-1), est un codage de 224
caractères tous codés sur un octet (codes 0 à 127, et 160 à 255. Les 128 premiers caractères sont
identiques aux caractères du codage ASCII, les 96 suivants contiennent (presque) tous les autres
caractères utilisés en français comme par exemple les caractères accentués.
Voici une vue hexadécimale sur le début de la fable de La Fontaine « La cigale et la fourmi »
codée en ISO-LATIN-1.
00000000 4C 61 20 43 69 67 61 6C 65 20 65 74 20 6C 61 20 La Cigale et la
00000010 46 6F 75 72 6D 69 0A 0A 4C 61 20 43 69 67 61 6C Fourmi..La Cigal
00000020 65 2C 20 61 79 61 6E 74 20 63 68 61 6E 74 E9 0A e, ayant chant..
00000030 54 6F 75 74 20 6C 27 E9 74 E9 2C 0A 53 65 20 74 Tout l’.t.,.Se t
On rappelle que le codage UTF-8 est un codage de longueurs variables, dont les mots du code
sont constitués de 1, 2, 3 ou 4 octets. La table 2.1 (page 26) donne le format des codes selon le
nombre d’octets.
Question 1 Combien de caractères le codage UTF-8 permet-il de coder ?
Voici une vue hexadécimale sur le début de la fable de La Fontaine « La cigale et la fourmi »
codée en UTF-8.
00000000 4C 61 20 43 69 67 61 6C 65 20 65 74 20 6C 61 20 La Cigale et la
00000010 46 6F 75 72 6D 69 0A 0A 4C 61 20 43 69 67 61 6C Fourmi..La Cigal
00000020 65 2C 20 61 79 61 6E 74 20 63 68 61 6E 74 C3 A9 e, ayant chant..
00000030 0A 54 6F 75 74 20 6C 27 C3 A9 74 C3 A9 2C 0A 53 .Tout l’..t..,.S
48 CHAPITRE 2. CODES ET CODAGES
Question 2 Quel est le code du caractère é ? Ce code a-t-il un rapport avec le code du même caractère
dans le codage ISO-LATIN-1 ?
Question 1 Sur combien d’octets est codé un caractère avec le codage ISO-8859-1 ?
Question 2 En UTF-8, sur combien d’octets sont codés les caractères correspondants à ceux de l’ISO-
8859-1 ?
Question 3 Prenons un caractère ISO-8859-1 qui est codé sur un seul octet en UTF-8. Comment
convertir ce caractère en UTF-8 ?
Question 4 Prenons maintenant un caractère ISO-8859-1 qui est codé sur deux octets en UTF-8.
Comment convertir ce caractère en UTF-8 en utilisant uniquement des opérations logiques ?
A B C D E F G
1010 0010011 01001 01110 110 0111100 0111110
H I J K L M N
0010010 1000 011111110 011111111001 0001 00101 1001
0 P Q R S T U
0000 01000 0111101 0101 1011 0110 0011
V W X Y Z ESP
001000 011111111000 01111110 0111111111 01111111101 111
Exercice 2-6
00000000 26 12 FE 03 50
Question 1 Sachant que ce fichier contient une information textuelle codée avec le codage de longueur
variable (cf table 2.2), trouvez l’information codée.
Question 2 Quelle taille (en octets) aurait cette information si elle avait été codée à l’aide du code
ASCII ?
Question 3 Quelle serait cette taille si on utilisait un codage de longueur fixe minimale ?
2.7. EXERCICES 49
Codage d’images
pour approfondir Exercice 2-7 Codage bitmap des images
Le codage bitmap d’une image consiste à coder la couleur de chaque pixel (point) de l’image
par une chaîne binaire de longueur fixée. Ainsi, pour représenter une image ne contenant que du
noir et du blanc, il suffit de coder chacune de ces deux couleurs sur un bit. Les formats les plus
fréquents codent chaque pixel sur 1 bit (2 couleurs), 4 bits (16 couleurs), 8 bits (256 couleurs) et
24 bits (≈ 16 × 106 couleurs).
Question 1
Une image Noir et Blanc de 10 lignes de 16 pixels est codée en bitmap. Voici la représentation
hexadecimale de cette image
0000 0F00 1088 0388 0CBE 1088 1188 0E80 0000 7FFE
Dessinez l’image.
Question 2
Calculez la taille (en nombre d’octets) de la plus petite représentation possible en bitmap d’une
image comprenant 200 × 300 pixels et 100 couleurs.
Question 3 Images compressibles
La représentation "bitmap" d’une image peut être inutilement gourmande en espace mémoire (Pensez
à une image blanche).
Proposez une représentation plus compacte des images.
Exercice 2-8 Espace mémoire d’un film non compressé
Prenons un film HD muet (d’une résolution de 1920 × 1080 pixels à 25 images par seconde)
d’une durée de 1h23m20s.
Question 1 Combien d’octets occuperait un tel film en supposant que chaque pixel est représenté par
trois octets (un pour le rouge, le vert et le bleu) ?
Pour les deux questions qui suivent l’alphabet contient au moins les deux lettres a et b.
Question 1 Combien y a-t-il de mots de 5 lettres commençant par a et terminant par b ?
Question 2 Combien y a-t-il de mots de 10 lettres comprenant trois a et 2 b ?
Exercice 2-10 Peut-on tout compresser ?
Un fichier est une suite finie d’octets. On peut considérer que c’est un mot sur l’alphabet A
des 256 octets.
Un logiciel de compression transforme un fichier en un autre fichier qu’on espère être plus
petit. Bien entendu une compression n’est utile que si l’opération inverse, la décompression,
50 CHAPITRE 2. CODES ET CODAGES
existe. On peut modéliser un logiciel de compression comme une fonction z de l’ensemble des
mots dans lui-même :
z : A+ → A∗ ,
telle que pour tout mot u ∈ A+ , on a
autrement dit le fichier obtenu par compression est strictement plus petit que le fichier d’origine.
Question 2 Quelle propriété mathématique la fonction z doit-elle posséder pour assurer l’existence de
l’opéation de décompression ?
Question 3 En considérant la compression des fichiers de taille n, n étant un entier fixé, déduisez de la
propriété trouvée pour z l’inexistence d’une telle fonction, et concluez.
Exercice 2-11 Mots commutants
Les langages ci-dessous sont-ils des codes ? Si non, existe-t-il un code ayant le même alphabet
et la même distribution de longueurs de mots ?
1. L1 = {0, 01, 101, 110}
2. L2 = {0, 01, 101, 110, 111}
2.7. EXERCICES 51
Parmi les mots de code utilisés par un codage binaire préfixe, on trouve 0, 10 et 1100. Combien
de mots de code de longueur 6 ce codage peut-il avoir ? Donnez un exemple d’un tel code préfixe.
On désire coder, à l’aide d’un alphabet A = {0, 1, 2}, un alphabet S de dix lettres avec un
mot-code d’une lettre, les neuf autres ayant trois lettres au maximum. On désire de plus que ce
codage soit préfixe.
Question 1 Cela est-il possible ?
Question 2 Combien de mots-code de trois lettres faut-il au minimum ?
Exercice 2-17
Question 1 Vérifier que l’on peut raccourcir la longueur d’un mot d’un code binaire si et seulement si
l’inégalité de Kraft est stricte.
Question 2 Qu’en est-il pour des codes sur un alphabet à plus de deux lettres ?
Exercice 2-18
Soient u et v deux mots sur un alphabet A. À quelle condition le langage constitué des deux
mots u et v est-il un code ?
Exercice 2-20
52 CHAPITRE 2. CODES ET CODAGES
Parmi les langages suivants sur l’alphabet A = {0, 1} indiquez ceux qui sont des codes.
1. L = ∅
2. L = {ε}
3. L = {u}, où u est un mot non vide sur l’alphabet A
4. L = {0011, 1001, 0110}
5. L = {00, 010, 111, 01101, 1100}
6. L = {010101, 0101}
7. L = {0, 01, 110, 1101, 1111}
8. L = {0, 01, 100}
Exercice 2-22
Question 1 Peut-on trouver un sous-ensemble strict de Y = {0, 01, 110, 1101, 1111} qui ne soit pas un
code ?
Question 2 Peut-on trouver un code contenant strictement Y ?
Question 3 Reprendre les deux questions avec Y = {0, 01, 100}.
pour approfondir Exercice 2-23
est-il un code ?
Exercice 2-24 Codes maximaux
Un code C est dit maximal si pour tout mot u ∈ A∗ , C ∪ {u} n’est pas un code.
Question 1 Montrez qu’un code préfixe fini est maximal si et seulement si K(C) = 1.
Question 2 Qu’en est-il pour un code sur un alphabet dont le cardinal q > 2 ?
Chapitre 3
Codages optimaux
3.1 Source
3.1.1 Source d’information
Une source d’information est caractérisée par
1. un alphabet de source S = {s1 , s2 , . . . , sm } décrivant quels sont les symboles si que cette
source peut émettre ;
2. une distribution de probabilité P = {p1 , p2 , . . . , pm }, chaque pi étant un réel compris
Pm entre 0
et 1 donnant la probabilité que la source délivre le symbole si ∈ S et telle que i=0 pi = 1.
Plus formellement, une source est une variable aléatoire S prenant ses valeurs dans un en-
semble fini S et dont la loi de probabilité est donnée par P. Ainsi pour tout symbole si ∈ S
Pr(S = si ) = pi .
Dans la suite, nous noterons (S, P) les sources d’information, c’est-à-dire sous la forme du
couple (alphabet, distirbution de probabilité).
Exemple 1 :
— Les caractères utilisés dans différentes langues. L’alphabet peut être le même, mais les
distributions de probabilité diffèrent (par exemple le caractère le plus fréquent en français
est le e alors qu’en turc il s’agit du a).
— Les caractères utilisés dans différents langages de programmation. L’alphabet est toujours
le même, mais les distributions de probabilité diffèrent.
— Source uniforme : source pour laquelle la distribution de probabilité est uniforme, c’est-à-
dire pour laquelle la probabilité de chaque symbole est la même, ou autrement dit, pour
tout symbole s ∈ S, on a
1
Pr(S = s) = .
m
— Les octets successifs d’un fichier. L’alphabet source est l’ensemble des 256 octets, S =
[[0, 255]]. La distribution de probabilités est définie par le nombre d’occurrences de chacun
des octets. Si un octet s apparaît ns fois dans le fichier, la probabilité associée est ps = nNs ,
où N désigne le nombre d’octets de ce fichier.
53
54 CHAPITRE 3. CODAGES OPTIMAUX
Propriétés :
1. Pour toute source S et tout symbole s de cette source, on a
0 ≤ I(s).
En remarquant que limx→0 x log2 (x) = 0, on peut poser par prolongement par continuité que
0 log2 (0) = 0. Ainsi, la définition de l’entropie est valable lorsqu’une des probabilités pi est nulle.
Exemple 3 :
La quantité d’information contenue dans chacun des symboles est la même et vaut
1
I(s) = − log2 = log2 4 = 2.
4
L’entropie de la source est donc égale à
H(S) = 2.
2. Avec la distribution de probabilités
s s1 s2 s3 s4
1 1 1 1 ,
Pr(S = s) 2 4 8 8
les quantités d’information contenues dans chacun des symboles sont
1
I(s1 ) = − log2 =1
2
1
I(s2 ) = − log2 =2
4
1
I(s3 ) = − log2 =3
8
1
I(s4 ) = − log2 =3
8
I(s1 ) = − log2 1 = 0
I(s2 ) = +∞
I(s3 ) = +∞
I(s4 ) = +∞
et l’entropie de la source vaut
H(S) = 1 × 0 + 0 + 0 + 0 = 0.
56 CHAPITRE 3. CODAGES OPTIMAUX
Propriétés :
1. L’entropie d’une source ne dépend que des valeurs pi des probabilités des symboles et non
des symboles eux-mêmes.
2. Pour toute source on a
0 ≤ H(S) ≤ log2 m.
3. L’entropie d’une source est nulle si et seulement si un symbole de la source a une probabilité
égale à 1, les autres ayant tous une probabilité nulle.
4. L’entropie d’une source est maximale, c’est-à-dire égale à log2 m si et seulement si la dis-
tribution de probabilité est uniforme.
L’unité de l’entropie d’une source est le bit.
On peut aussi exprimer cette longueur moyenne comme étant l’espérance mathématique de
la longueur des mots associés à chaque symbole de la source
X
nc = Pr(S = s)|c(s)|.
s∈S
Exemple 4 :
Considérons à nouveau l’alphabet source S = {s1 , s2 , s3 , s4 }, et les deux codages binaires des
symboles de S définis par
s s1 s2 s3 s4
c1 (s) 00 01 10 11
c2 (s) 0 11 100 101
Il est évident que la longueur moyenne du codage c1 est égale à 2 quelque soit la distribution
de probabilités de la source.
nc1 = 2.
Propriétés :
1. La longueur moyenne d’un codage est toujours comprise entre les longueurs extrêmes des
mots utilisés par le codage.
l ≤ nc ≤ L
si l (resp. L) est la longueur minimale (resp. maximale) d’un mot du code associé à c.
2. Pour tout codage de longueur fixe égale à L, la longueur moyenne est égale à L :
nc = L.
3. Pour toute source uniforme, la longueur moyenne de tout codage c est la moyenne arith-
métique des longueurs des mots du code associé :
m
1 X
nc = |c(si )|.
m i=1
4. Si avec un codage c, on code une longue séquence de symboles de la source, on peut estimer
la longueur du message ainsi codé à nc × N , où N est le nombre de symboles de source
codés dans le message. Cette estimation est d’autant meilleure que N est grand.
Lorsque l’alphabet cible est l’alphabet binaire A = {0, 1}, la longueur moyenne d’un codage
s’exprime en bits par caractère.
H(S)
≤ nc ,
log2 q
Remarque : lorsque l’alphabet cible est l’alphabet binaire (q = 2), le théorème s’énonce
— Pour tout codage binaire c de S, on a
H(S) ≤ nc ,
3.3.2 Un lemme
Avant de prouver ce théorème nous allons d’abord démontrer le lemme suivant.
Lemme 3.1. Soit (p1 , p2 , . . . , pm ) et (q1 , q2 , . . . , qm ) deux suites de m nombres réels positifs telles
que
m
X
pi = 1
i=1
Xm
et qi ≤ 1.
i=1
Alors
m
X m
X
pi ln qi ≤ pi ln pi ,
i=1 i=1
Démonstration. La preuve s’appuie sur le fait que pour tout réel x > 0, on a
ln x ≤ x − 1,
Par conséquent
m
X m
X
pi ln qi − pi ln pi ≤ 0,
i=1 i=1
qi = q −ni .
H(S)
= nc ,
log2 q
S = {s1 , s2 }
et
s s1 s2
3 1 ,
Pr(S = s) 4 4
et les codages binaires optimaux sont les codages de longueur fixe égale à 1, dont la longueur
moyenne est évidemment strictement plus grande que H(S).
Une conséquence de cette convention est qu’hormis pour le cas d’une source ne comprenant
qu’un seul symbole, aucun symbole n’a une probabilité égale à 1.
Convention 2. Toutes les sources considérées par la suite comprendront au moins deux symboles
(m ≥ 2).
En conséquence, la quantité d’information contenue dans un symbole d’une source est finie
et non nulle.
H(S)
nc < + 1.
log2 q
3.4. CONSTRUCTION DE CODAGES OPTIMAUX 61
Démonstration. Compte tenu des conventions adoptées pour les sources, pour i compris entre 1
et m, il existe un entier ni tel que
− logq pi ≤ ni < − logq pi + 1.
On peut déduire de l’inégalité gauche de cet encadrement, que
logq pi ≥ −ni ⇐⇒ pi ≥ q −ni
Ce qui nous donne, en faisant la somme sur tous les symboles :
m
X
q −ni ≤ 1
i=1
et par conséquent, d’après le théorème de MacMillan (resp. Kraft), qu’il existe un code (resp.
code préfixe) contenant des mots de longueur n1 , n2 , . . . , nm .
Si on code le symbole de probabilité pi avec un mot de longueur ni d’un tel code, on obtient
un codage c de la source S dont la longueur moyenne est majorée par
m
X H(S)
nc < pi (− logq pi + 1) = + 1.
i=1
log2 q
Le théorème est ainsi démontré.
Remarque : lorsque l’alphabet cible est l’alphabet binaire (q = 2), le théorème s’énonce
— Il existe un codage binaire c de S, tel que
nc < H(S) + 1.
nc0 − nc = pi × nj + pj × ni − pi × ni − pj × nj
= (pi − pj )(nj − ni ).
On en déduit que
nc0 < nc ,
ce qui contredit l’optimalité de c.
D’après ce lemme, on peut toujours supposer que les longueurs des mots d’un codage optimal
sont dans l’ordre croissant des indices
n1 ≤ n2 ≤ . . . ≤ nm .
Lemme 3.3. Dans un codage préfixe optimal, les deux symboles les moins probables sont codés
par des mots de même longueur. Autrement dit,
nm−1 = nm .
Démonstration. Compte tenu de la remarque qui suit le lemme 3.2, il suffit de prouver qu’il n’est
pas possible d’avoir nm−1 < nm pour un codage préfixe optimal.
En effet, si on a nm−1 < nm , alors on peut construire le codage c0 défini par
c0 (s) = c(s)
pour tout symbole s autre que sm , et pour le symbole sm par
c0 (sm ) = u
où u est le mot obtenu en retirant la dernière lettre de c(sm ).
Il est clair que c0 est un codage préfixe dont la longueur moyenne est strictement plus petite
que celle de c. Ce qui achève la démonstration.
Lemme 3.4. Parmi les mots de longueur maximale d’un codage préfixe optimal, il en existe
deux qui ne diffèrent que par la dernière lettre.
Démonstration. Si ce n’était pas le cas, on obtiendrait un codage de longueur moyenne stricte-
ment plus petite en remplaçant tous les mots de longueur maximale par ces mots privés de leur
dernière lettre. Ce qui contredirait l’optimalité du codage initial.
3.4. CONSTRUCTION DE CODAGES OPTIMAUX 63
Une conséquence de ces deux lemmes est qu’un codage préfixe binaire optimal peut être
construit de proche en proche par un algorithme appelé algorithme de Huffman, et le codage
produit par cet algorithme est appelé codage de Huffman.
Soit la source S = (S, P)
s s1 s2 s3 s4 s5 s6
Pr(S = s) 0, 3 0, 2 0, 15 0, 15 0, 1 0, 1
L’entropie de cette source vaut
H(S) ≈ 2, 471.
La construction d’un codage de Huffman pour cette source est :
symboles s1 s2 s3 s4 s5 s6
proba 0, 3 0, 2 0, 15 0, 15 0, 1 0, 1
lettres 0 1
symboles s1 s2 s56 s3 s4
proba 0, 3 0, 2 0, 2 0, 15 0, 15
lettres 0 1
symboles s1 s34 s2 s56
proba 0, 3 0, 3 0, 2 0, 2
lettres 0 1
symboles s256 s1 s34
proba 0, 4 0, 3 0, 3
lettres 0 1
symboles s134 s256
proba 0, 6 0, 4
lettres 0 1
Il suffit ensuite de reconstruire les mots de code :
symboles s134 s256
codages 0 1
symboles s256 s1 s34
codages 1 00 01
symboles s1 s34 s2 s56
codages 00 01 10 11
symboles s1 s2 s56 s3 s4
codages 00 10 11 010 011
symboles s1 s2 s3 s4 s5 s6
codages 00 10 010 011 110 111
La longueur moyenne de ce codage est
nc = 2, 5.
Une autre façon de présenter la construction d’un codage de Huffman consiste à associer à
chaque symbole des sources successives un arbre binaire.
Pour la première source, on associe à chaque symbole un arbre réduit à un seul nœud. Ainsi
pour notre exemple, la « forêt » initiale est constituée de six arbres (voir figure 3.1).
On réunit les deux arbres de probabilité les plus petites en un unique arbre, sa probabilité
étant égale à la somme des deux probabilités des arbres réunis. Sur notre exemple, la forêt ne
comprend alors plus que cinq arbres (voir figure 3.2).
3.4. CONSTRUCTION DE CODAGES OPTIMAUX 65
s1 : 0, 3 s2 : 0, 2 s3 : 0, 15 s4 : 0, 15 s5 : 0, 1 s6 : 0, 1
s1 : 0, 3 s2 : 0, 2 s56 : 0, 2 s3 : 0, 15 s4 : 0, 15
s5 : 0, 1 s6 : 0, 1
On procède ensuite de la même façon jusqu’à obtenir une forêt ne contenant plus qu’un seul
arbre : c’est un arbre du codage de Huffman (voir figures 3.3, 3.4, 3.5, 3.6).
s1 : 0, 3 s34 : 0, 3 s2 : 0, 2 s56 : 0, 2
s3 : 0, 15 s4 : 0, 15 s5 : 0, 1 s6 : 0, 1
3.4.3 Application
Le codage de Huffman est couramment utilisé en compression des données. Il peut être utilisé
seul ou en complément d’autres méthodes.
L’algorithme 3.1 page suivante donne dans les grandes lignes une méthode de compression
d’un fichier vu comme une suite de N octets (l’alphabet source est donc l’ensemble des 256
octets).
La taille en octets du fichier compressé sera approximativement
N × nc
T = + K.
8
À titre d’exemple, un fichier contenant un texte français, codé en ISO-8859-1, a une entropie
de 4,43 bits/octet approximativement. Par conséquent, la longueur moyenne d’un codage de
Huffman des octets de ce fichier est comprise entre 4,43 et 5,43 bits/octet. Cela donne un taux
8 = 44, 6% et 1 − 8 = 32, 1%.
de compression compris entre 1 − 4,43 5,43
Si au lieu de considérer un tel fichier comme une suite d’octets mais comme une suite de
couple d’octets (la source est alors constitué des 216 = 65536 couples d’octets), l’entropie d’un
texte français codé en ISO-8859-1 est de 7,77 bits par couple d’octets. Le taux de compression
obtenu par un codage de Huffman est alors compris entre 1 − 7,7716 = 51, 4% et 16 = 45, 2%.
8,77
66 CHAPITRE 3. CODAGES OPTIMAUX
s256 : 0, 4 s1 : 0, 3 s34 : 0, 3
s2 : 0, 2 s56 : 0, 2 s3 : 0, 15 s4 : 0, 15
s5 : 0, 1 s6 : 0, 1
s134 : 0, 6 s256 : 0, 4
s1 : 0, 3 s34 : 0, 3 s2 : 0, 2 s56 : 0, 2
s3 : 0, 15 s4 : 0, 15 s5 : 0, 1 s6 : 0, 1
s123456 : 1
s134 : 0, 6 s256 : 0, 4
s1 : 0, 3 s34 : 0, 3 s2 : 0, 2 s56 : 0, 2
s3 : 0, 15 s4 : 0, 15 s5 : 0, 1 s6 : 0, 1
3.5 Exercices
Exercice 3-1 Pour s’échauffer
Question 1
Montrez que dans un codage binaire optimal, l’inégalité de Kraft devient une égalité.
Question 2 Dans un codage binaire optimal peut–il y avoir trois mots de longueur maximale ?
Exercice 3-3
Soit S = (S, P ) une source d’information. Montrez qu’il existe un codage préfixe binaire de
cette source dans lequel tout symbole s ∈ S est codé par un mot de longueur dI(s)e.
Exercice 3-4
La distribution des longueurs des mots d’un codage préfixe binaire optimal est-elle unique ?
Exercice 3-5
Quels sont les arbres des codages préfixes binaires optimaux d’une source de trois symboles ?
de quatre symboles ?
Exercice 3-6
Dans le cas où tous les caractères de l’alphabet S à coder sont équiprobables, quels sont les
codages optimaux ?
Exercice 3-7 Entropie d’un message
Question 1 Calculez la quantité d’information contenue dans chacun des huit symboles, puis l’entropie
de la source d’information (S, f ).
Question 2 Calculez un codage de Huffman de cette source, puis la longueur moyenne de ce codage.
Comparez cette longueur moyenne à l’entropie.
pour approfondir Exercice 3-10
Question 1 Même exercice pour la source (les données ne sont pas des fréquences mais des effectifs)
x a b c d e f g h
f (x) 1 1 2 3 5 8 13 21
Question 2 Les effectifs donnés dans le tableau ci–dessous sont les premiers termes de la suite de
Fibonacci. Peut–on généraliser le codage pour un alphabet source de n symboles dont les fréquences sont
les n premiers termes de la suite de Fibonacci ?
Exercice 3-11
x1 x2 x3 x4 x5 x6 x7
1/8 1/32 1/4 1/8 1/16 5/32 1/4
Question 1 Pour coder sept symboles, existe-t-il un codage binaire optimal comprenant
1. trois mots de longueur 2, deux mots de longueur 3 et deux mots de longueur 4 ?
2. un mot de longueur 2, cinq mots de longueur 3 et un mot de longueur 4 ?
Question 2 Construisez un codage binaire optimal pour S.
x1 x2 x3 x4 x5 x6 x7
c1 (x) 0011 0000 10 01 0010 0001 11
c2 (x) 001 000000 1 0001 00001 000001 01
Question 3 Combien de bits faut–il en moyenne pour coder une séquence de 16 000 symboles à l’aide
de ces deux codages ?
L’analyse des caractères d’un fichier de programmes en Pascal donne la répartition suivante
(par ordre croissant des effectifs) :
3.5. EXERCICES 69
W $ Y F 5 à X > * "
1 1 1 1 2 2 2 2 2 2
q 3 z + 4 O P y S V
2 3 3 3 4 5 6 6 8 8
M j R 2 - . < U D B
8 10 10 11 11 13 15 16 17 17
é C v x { L } [ ] I
18 20 21 23 25 25 25 27 27 34
E N A k h 0 1 T g w
35 35 36 36 37 40 40 42 43 46
m ’ b u P = _ l , d
58 58 66 70 74 78 79 89 90 93
: s f ( ) c a o n ;
96 107 123 128 128 131 157 158 199 200
r t i e / <ESP>
216 273 278 283 304 1972
Soit un fichier de données contenant une séquence de caractères codés sur 8 bits telle que les
256 caractères apparaissent à peu près aussi souvent : la fréquence maximale d’un caractère est
moins du double de la fréquence minimale. Prouvez que dans ce cas, le codage de Huffman n’est
pas plus efficace que le codage de longueur fixe sur 8 bits.
Exercice 3-14 Stratégie
s1 s1
s2 s2
.. ..
. .
sm sm
Un canal de communication est caractérisé par la donnée des probabilités d’erreurs de trans-
mission pour chacun de ses symboles. On note Pr(s0 reçu|s envoyé) la probabilité que le symbole
71
72 CHAPITRE 4. DÉTECTION ET CORRECTION DES ERREURS
Le canal représenté par la figure 4.2 permet la communication de trois symboles : S = {0, 1, 2}.
0, 9
0 0
0, 1
0, 0
3
0, 8
1 0, 1 1
5
0, 0
15
0,
07
0,
0, 8
2 2
p1 = Pr(0|1).
q0 = 1 − p0
0 0
p0
p1
1 1
q1 = 1 − p1
p0 = p1 = p.
4.2. CANAL BINAIRE SYMÉTRIQUE SANS MÉMOIRE 73
q =1−p
0 0
p
1 1
q =1−p
Un canal binaire symétrique est donc entièrement caractérisé par la probabilité p d’erreur lors
de la transmission d’un bit.
On note q = 1 − p la probabilité de transmission correcte d’un bit.
Exemple 2 :
En prenant le canal décrit dans l’exemple 1, si ce canal est sans mémoire, alors la probabilité
de recevoir le mot v0 = 021, alors que le mot v = 012 est envoyé est
Pour désigner les canaux binaires symétriques sans mémoire nous utiliserons l’acronyme
CBSSM.
Théorème 4.1. Dans un CBSSM de probabilité d’erreur p, la probabilité qu’un mot binaire de
longueur n, v = v1 , v2 , . . . , vn , soit reçu en un mot binaire v0 = v10 , v20 , . . . , vn0 est égale à
lorsque 0 ≤ q < 1, hormis dans le cas d’un CBSSM de probabilité d’erreur p = 0, il est virtuelle-
ment certain que des erreurs se produisent lorsqu’un très grand nombre de bits sont transmis.
n = k + r.
Les codages par blocs sont donc des codages de longueur fixes, et par conséquent peuvent a
priori être n’importe quelle application injective de l’ensemble des mots binaires de longueur k
dans celui des mots de longueur n.
c : Fk2 −→ Fn2 .
Le rendement (ou encore taux de transmission) d’un codage est le rapport de la longueur des
mots à coder à celle des mots du code
k
R= .
n
Il exprime en quelque sorte la quantité d’information par bit transmis.
Il est bien entendu souhaitable que le rendement d’un code soit le plus élevé possible. Mais
pour une longueur fixée des mots du code, cet objectif est contradictoire avec celui de la capacité
à détecter/corriger les erreurs.
Le poids de Hamming d’un mot v de Fn2 est le nombre d’indices i pour lesquels vi 6= 0. Le
poids de Hamming d’un mot est noté ωH (v).
dH (v, v0 ) = ωH (v ⊕ v0 ).
Exemple 3 :
Avec k = 3, on obtient le codage suivant.
u v = c(u)
000 0000
001 0011
010 0101
011 0110
100 1001
101 1010
110 1100
111 1111
76 CHAPITRE 4. DÉTECTION ET CORRECTION DES ERREURS
Tous les mots du code associé sont donc de poids pair. Inversement tout mot v de poids pair
est un mot du code, c’est le mot qui code le mot u obtenu en supprimant le dernier bit de v.
Ainsi le code est l’ensemble des mots de poids pair et de longueur n = k + 1. Nous noterons
Parite(k) ce code. Par exemple, Parite(3) est constitué de l’ensemble des 8 mots de longueur 4
et de poids pair.
Lorsqu’un mot v0 ∈ Fn2 est reçu, en vérifiant la parité de son poids, on sait si ce mot est ou
n’est pas dans le code :
— Si ωH (v0 ) est impair, alors v 0 6∈ Parite(k), et il est alors certain que le mot envoyé a subi
des erreurs. Dit autrement, la probabilité que le mot v0 soit correct, c.-à-d. égal au mot
envoyé, est nulle.
Pr(v0 correct) = 0.
4.3.6 Répétition
Les codages par répétition forment une autre famille de codages systématiques dans lesquels
le mot à coder u ∈ Fk2 est répété p fois, p étant un nombre entier qui détermine le codage.
c(u) = u.u. . . . .u = up .
Exemple 4 :
Avec k = 1 et p = 3, on obtient le codage suivant
u v = c(u)
0 000
1 111
1. Avec le code de parité C = Parite(k), si un mot v ∈ C est envoyé et qu’un mot d’erreur
e de poids impair produit le mot v0 = v ⊕ e, comme v0 6∈ C (puisque de poids impair),
l’erreur est détectée.
2. Avec le code de répétition C = Rep(k, p), si un mot v ∈ C est envoyé et qu’un mot d’erreur
e de poids inférieur ou égal à p − 1 produit le mot v0 = v ⊕ e, comme v0 6∈ C (puisque pas
de la forme up ), l’erreur est détectée.
Un code est au moins t-détecteur si toute erreur de poids au plus t est détectée. Autrement
dit si
∀v ∈ C, ∀e ∈ Fn2 , 1 ≤ ωH (e) ≤ t ⇒ v0 = v ⊕ e 6∈ C.
Un code est exactement t-détecteur s’il est au moins t-détecteur mais pas t + 1-détecteur.
Exemple 6 :
1. Parite(k) est un code au moins 1-détecteur, car toute erreur de poids égal à 1 survenant
sur un mot de poids pair produit un mot de poids impair qui n’est pas dans le code. En
revanche, les erreurs de poids 2 produisent des mots de poids pair, et ces erreurs ne sont
donc pas détectées. Parite(k) est donc un code exactement 1-détecteur.
2. Rep(k, p) est un code au moins p − 1-détecteur. Mais il n’est pas au moins p-détecteur, car
si v ∈ Rep(k, p) et si e = up avec ωH (u) = 1, alors v0 = v ⊕ e ∈ Rep(k, p). Donc Rep(k, p)
est exactement p − 1-détecteur.
3. Le code C = {0000, 0111, 1010, 1111} n’est pas au 1-détecteur (car 0000 et 0111 sont à
une distance 1).
4. Le code C = {00000, 01101, 10110, 11011} est exactement 2-détecteur.
v0 = v ⊕ e,
dans laquelle il y a deux inconnues : v et e. Il est clair qu’on ne peut pas le résoudre au sens
classique, puisque pour tout mot v du code, il existe toujours un mot e de longueur n pour lequel
l’équation précédente est satisfaite. Il suffit de prendre
e = v ⊕ v0 .
Alors que faire ? Comment corriger un mot erroné ? Parmi tous les mots v du code, lequel
choisir ? Peut-on toujours le faire ?
Pour répondre à ces questions nous allons donner deux réponses équivalentes sous certaines
hypothèses.
78 CHAPITRE 4. DÉTECTION ET CORRECTION DES ERREURS
Exemple 7 :
Prenons le codage par répétition 3 fois d’un bit. Le code est
C = Rep(1, 3) = {000, 111}.
Supposons que nous ayons reçu le mot v0 = 010. Calculons les probabilités respectives que
l’un des deux mots aient été envoyés en sachant qu’on a reçu le mot v0 .
— Pour le mot 000, on a
Pr(v0 reçu|000 env) · Pr(000 env)
Pr(000 env|v0 reçu) = ,
Pr(v0 reçu|000 env) · Pr(000 env) + Pr(v0 reçu|111 env) · Pr(111 env)
ce qui donne après simplification en supposant l’équiprobabilité d’envoi des deux mots du
code
Pr(v0 reçu|000 env)
Pr(000 env|v0 reçu) = .
Pr(v0 reçu|000 env) + Pr(v0 reçu|111 env)
On a bien entendu
Pr(v0 reçu|000 env) = Pr(e = 010) = p(1 − p)2 ,
et
Pr(v0 reçu|111 env) = Pr(e = 101) = p2 (1 − p).
Ce qui donne finalement
Pr(v0 reçu|000 env) = 1 − p.
— Pour le mot 111, par un calcul analogue, on a
Pr(000 env|v0 reçu) = p.
La plus petite des deux probabilités est la deuxième si on fait l’hypothèse raisonnable que p < 21 .
Selon le principe de correction par lmaximum de vraisemblance, on corrige le mot v0 en le
remplaçant par 000.
1. Dans l’exemple 7, la correction du mot v0 = 010 donne le mot 000. On peut remarquer
que ce dernier mot est de tous les mots du code celui qui est le plus proche de v0 .
Théorème 4.2. Pour un CBSSM de probabilité p < 21 , et sous l’hypothèse que les 2k mots de
Fk2 sont équiprobables, alors la correction par maximum de vraisemblance est équivalente à la
correction par proximité. Autrement dit, le mot v du code le plus proche d’un mot v0 est aussi
celui qui maximise la probabilité Pr(v envoyé|v0 reçu).
4.6. DISTANCE MINIMALE D’UN CODE 79
4.5.3 Boules
Étant donnés un mot v ∈ Fn2 et un réel r ≥ 0, on appelle boule de centre v et de rayon r,
l’ensemble de tous les mots de Fn2 situés à une distance de Hamming de v inférieure ou égale à
r. En notant les boules B(v, r), on a
B(v, r) = {w ∈ Fn2 | dH (v, w) ≤ r}.
Exemple 9 :
Avec n = 3 et v = 010, on a
1. B(v, r) = {010} si 0 ≤ r < 1.
2. B(v, r) = {010, 110, 000, 011} si 1 ≤ r < 2.
3. B(v, r) = {010, 110, 000, 011, 100, 111, 001} = F32 \ {101} si 2 ≤ r < 3.
4. B(v, r) = F32 si 3 ≤ r.
Exemple 11 :
c : Fk2 −→ Fn2
est une application linéaire (injective), autrement dit si pour tous mots u et u0 de Fk2 on a
Remarque : En algèbre linéaire, une application linéaire est une application qui préserve les
combinaisons linéaires, autrement dit telle que pour tous scalaires λ et µ et tous vecteurs u et
u0 on a
f (λu + µu0 ) = λf (u) + µf (u0 ).
Le corps de base des espaces vectoriels Fn2 étant le corps à deux éléments F2 , les seules valeurs
que peuvent prendre les scalaires λ et µ sont 0 et 1. La définition de codage linéaire donnée
ci-dessus correspond donc bien à la notion générale d’application linéaire. Les notions d’images,
noyaux et matrices s’appliquent donc aux codages linéaires.
1. Le codage par ajout d’un bit de parité est une application linéaire de Fk2 dans Fn2 avec
n = k + 1. C’est donc un codage linéaire, et le code Parite(k) est un [k + 1, k, 2]-code
linéaire.
4.7. CODAGE LINÉAIRE 81
2. Le codage par répétition p fois d’un mot de Fk2 est un codage linéaire dans Fn2 avec n = p·k.
Le code associé Rep(k, p) est un [pk, k, p]-code linéaire.
3. Le codage des mots de longueur 2 en des mots de longueur 5 défini par
c : F22 → F52
00 7→ c(00) = 00000
01 7→ c(01) = 01101
10 7→ c(10) = 10110
11 7→ c(11) = 11011
est un codage linéaire dont le code associé C = {00000, 01101, 10110, 11011} est un [5, 2, 3]-
code linéaire.
Cette propriété des codes linéaires permet de réduire le nombre de calculs à effectuer pour
déterminer leur distance minimale. En effet, déterminer la distance minimale d’un code en général
nécessite de calculer toutes les distances séparant deux mots du code. Si le code contient K mots,
il s’agit donc de calculer K(K−1)
2 distances. Pour un code linéaire de dimension k, on a K = 2k et
k
le nombre de distances à calculer s’élèvent alors à 22k−1 − 2k−1 ∼ 42 . En revanche, déterminer la
distance minimale d’un code linéaire de dimension k par la recherche du plus petit poids de ses
mots non nuls nécessite 2k−1 calculs seulement, ce qui représente un gain appréciable par rapport
à l’autre méthode. Cependant, la quantité de calculs à fournir augmente encore exponentiellement
avec la dimension du code 2 .
Exemple 13 :
2. Il est prouvé que le problème de la détermination de la distance minimale d’un code est un problème qui fait
partie d’une classe générale de problèmes informatiques considérés comme difficiles : les problèmes NP-complets
82 CHAPITRE 4. DÉTECTION ET CORRECTION DES ERREURS
1. La matrice génératrice du codage par ajout d’un bit de parité aux mots de longueur k
est une matrice k × k + 1 dont les k premières colonnes forment la matrice identité, et la
dernière colonne est constituée de 1.
1 0 ... 0 1
. .
0 1 . . . .. ..
G = . .. .
. .
.. . . . . 0 .
0 ... 0 1 1
2. La matrice génératrice du codage par répétition p fois des mots de k bits est une matrice
k × pk constituée de p blocs identité k × k.
G = Ik Ik . . . Ik .
La représentation d’un codage linéaire par sa matrice génératrice offre une méthode efficace
et concise pour représenter les 2k mots du code. L’opération de codage d’un mot u ∈ Fk2 est une
simple multiplication de ce mot (considéré comme un vecteur ligne) par la matrice génératrice
du codage :
c(u) = u · G.
Cette multiplication revient à additionner (modulo 2) les lignes de la matrice G correspondant
aux bits non nuls du mot u.
Matrice génératrice des codages linéaires systématiques Pour les codages linéaires qui
sont de surcroît systématiques (cf page 74), la matrice génératrice a une forme particulière
puisqu’elle est constituée d’un bloc identité k × k et de n − k colonnes supplémentaires pour
l’ajout des bits de contrôle. Les trois exemples de codage ci-dessus sont systématiques.
G ·t H = 0,
1. Pour le codage de parité, on peut prendre pour matrice H la matrice 1 × (k + 1) dont tous
les termes valent 1.
H = 1 1 ... 1 .
En effet, cette matrice est bien de rang n − k = 1 et on a bien
G ·t H = 0.
4.7. CODAGE LINÉAIRE 83
2. Pour le codage par répétition 3 fois des mots de 2 bits, on peut prendre la matrice 4 × 6
1 0 1 0 0 0
0 1 0 1 0 0
H= 1 0 0
0 1 0
0 1 0 0 0 1
G ·t H = 0.
G ·t H = 0.
Théorème 4.4. Soit C un [n, k]-code linéaire, H une matrice de contrôle de ce code et v ∈ Fn2 .
Alors
v ∈ C ⇐⇒ v ·t H = 0.
Le mot v ·t H est appelé syndrome du mot v que l’on note s(v). C’est un mot de longueur
n − k.
Ce théorème signifie que pour détecter qu’un mot v0 est erroné, il suffit de calculer le syndrome
du mot v0 et de vérifier qu’il est bien nul. Si c’est le cas, le mot v0 est dans le code, aucune erreur
n’est détectée. Si ce n’est pas le cas, le mot v0 n’est pas dans le code, une erreur est détectée
et on peut le cas échéant tenter de le corriger. C’est évidemment une méthode de détection
particulièrement efficace par rapport à celle consistant à comparer le mot v0 à chacun des 2k
mots du code.
Exemple 15 :
Avec le troisième codage de l’exemple 12,
1. considérons le mot v0 = 01101 et calculons son syndrome :
Théorème 4.5. Un codage linéaire est au moins 1-détecteur si et seulement si une matrice de
contrôle ne possède aucune colonne nulle.
Plus généralement, avec 1 ≤ t ≤ n il est au moins t-détecteur si et seulement si pour tout
entier 1 ≤ p ≤ t les sommes de p colonnes d’une matrice de contrôle ne sont pas nulles.
Démonstration. Soit c : Fk2 → Fn2 un codage linéaire, C son code associé, et H une matrice de
contrôle. Soit v ∈ C et e ∈ Fn2 un mot de poids compris entre 1 et t. Posons v0 = v ⊕ e. Le mot
v0 est détecté comme erroné si et seulement s’il n’est pas dans le code C. Or
v0 6∈ C ⇔ s(v0 ) 6= 0
⇔ (v ⊕ e) ·t H 6= 0
⇔ v ·t H ⊕ e ·t H 6= 0
⇔ e ·t H 6= 0 6= 0
Or e ·t H est la somme des lignes de la matrice t H correspondant aux bits non nuls de e.
Matrice de contrôle des codages linéaires systématiques Pour un codage linéaire sys-
tématique dont la matrice génératice peut donc s’écrire
G = Ik A
G ·t H = A ⊕ A = 0.
e ⊕ C = {e ⊕ v | v ∈ C}.
Exemple 16 :
Avec le [5, 2]-code linéaire
les 25 = 32 mots de F52 sont répartis dans un tableau de 8 lignes et 4 colonnes (cf tableau 4.1).
Chacune des lignes de ce tableau montre les mots d’un ensemble de la forme e ⊕ C, le mot e
étant celui de la deuxième colonne, la première colonne donnant le poids de ce mot. La première
ligne correspond à e = 0. Ce sont donc les mots du code. Les 5 lignes qui suivent correspondent
à des mots e de poids 1. Ces mots sont donc à distance 1 du code. Les deux dernières lignes
4.8. CODAGE DE HAMMING 85
Table 4.1 – Partition de F52 par le code C. La dernière colonne représente l’ajout qui a été fait
aux mots de la première ligne pour obtenir la ligne courante.
contiennent les mots de F52 à distance 2 du code. Aucun mot de F52 n’est à une distance plus
grande que 2 du code.
Ce tableau peut servir à corriger des erreurs. Lorsqu’on reçoit un mot v0 on cherche ce mot
dans le tableau, et après l’avoir repéré on le corrige en choisissant le mot de la première ligne
situé dans la même colonne que v0 .
Exemple 17 :
Supposons que v0 = 10010. Ce mot est situé dans la 4-ème ligne du tableau 4.1. On le corrige
en le mot du code v = 10110.
Malheureusement cette technique devient très vite impraticable lorsque n devient grand.
Aucune colonne de H n’est nulle, le codage est donc au moins 1-détecteur. Toutes les colonnes
de H sont différentes, et donc aucune somme de deux colonnes de H n’est nulle. Le codage est
donc au moins 2-détecteur. Mais il existe des sommes nulles de trois colonnes (les trois premières
par exemple). Le codage n’est donc pas au moins 3-détecteur. Il est donc exactement 2-détecteur
et la distance minimale du code C associé est donc égale à 3.
On en déduit que ce codage est exactement 1-correcteur. Par conséquent pour tout mot v ∈ C
et tout mot e ∈ F72 de poids 1, le mot v0 = v ⊕ e n’est pas dans le code, et v est le mot du code
le plus proche de v0 . Comment effectuer la correction, c.-à-d. comment retrouver v à partir de
v?
On peut toujours recourir à la technique du tableau (cf section 4.7.6), mais cette technique
nécessite la construction d’un tableau partionnant les 128 mots binaires de longueur 7.
Une autre technique consiste à remarquer que si e est de poids 1, alors le syndrome de v0
permet de localiser l’erreur. En effet
s(v0 ) = s(e) = e ·t H,
et donc le syndrome de v0 est égal à une ligne de t H, autrement dit à une colonne de H. Or
toutes les colonnes de H sont différentes.
Exemple 18 :
Le mot v0 = 1100010 a pour syndrome
s(v0 ) = 111.
Ce syndrome n’est pas nul, le mot v0 n’est donc pas dans le code. De plus le ce syndrome
correspond à la quatrième colonne de H, ce qui signifie que le mot du code le plus proche de v0
est le mot
v = v0 ⊕ 0001000 = 1101010.
4.9 Exercices
4.9.1 Canal de communication
Exercice 4-1 Un canal inutile
Expliquez pourquoi le canal représenté à la figure 4.5 est appelé canal inutile.
p
0 1− 0
p
1 1
1−p
Supposons qu’un CBSSM soit vraiment très bruité, c’est–à–dire un canal dans lequel la pro-
babilité p d’erreur lors de la transmission d’un bit soit strictement supérieure à 1/2.
Question 1 Que dire de ce canal si p = 1 ? Est-il vraiment si bruité ?
Question 2 Que faire si 1/2 < p < 1 ?
Le numéro INSEE est un numéro composé de 13 chiffres auquel on ajoute une clé de deux
chiffres pour contrôler d’éventuelles erreurs de saisie.
On obtient cette clé
1. en réduisant le numéro N modulo 97 :r = N (mod 97) ;
2. en retranchant r à 97 : la clé est k = 97 − r.
Par exemple, pour le numéro INSEE N = 2 90 02 59 350 112 on a
1. r = N (mod 97) = 96 ;
2. k = 97 − 96 = 01.
La clé est un entier compris 1 et 97. On l’écrit en base 10 sur deux chiffres.
Question 1 Comment contrôler la validité d’un couple numéro/clé (N, k) ?
Question 2 Vérifiez que l’ajout de cette clé au numéro INSEE permet de détecter toutes les erreurs
simples (modification d’un chiffre, permutation de deux chiffres consécutifs).
Question 3 Permet-il de détecter davantage d’erreurs ?
Exercice 4-4 Codage de parité à deux dimensions
0010 1
1110 1
0101 0
0001 1
0110 0
1110 1
88 CHAPITRE 4. DÉTECTION ET CORRECTION DES ERREURS
On veut un codage binaire au moins 1-correcteur pour coder 16 mots. Quelle est la longueur
minimale des mots du code ?
Exercice 4-7 Codage de Hamming
Le mot v0 = 1100110 a été reçu. En sachant que le mot émis a été codé avec le codage de
Hamming [7, 4, 3] (cf section 4.8.1), et en faisant l’hypothèse qu’au plus un bit est erroné, quel
est le mot qui a été émis ?
Annexe A
Autour du binaire
A.1 Puissances de 2
n 2n Ordre de grandeur
0 1
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1 024 103 (kilo)
11 2 048
12 4 096
13 8 192
14 16 384
15 32 768
16 65 536
17 131 072
18 262 144
19 524 288
20 1 048 576 106 (méga)
30 1 073 741 824 109 (giga)
40 1 099 511 627 776 1012 (téra)
50 1 125 899 906 842 624 1015 (péta)
Remarque : Longtemps les préfixes kilo, méga, ..., appliqués aux octets pour mesurer des
tailles de mémoire désignaient des puissances de 2. Or pour toute autre mesure dans le système
89
90 ANNEXE A. AUTOUR DU BINAIRE
international, ces mêmes préfixes désignent des puissances de 10. Pour rémédier à cela, la com-
mission électronique internationale (IEC) a spécifié de nouveaux préfixes pour les puissances de
2 (cf table A.2).
Table A.2 – Préfixes des puissances binaires et décimales appliqués aux octets
log2 1 = 0
log2 2 = 1
lim log2 x = +∞
x→+∞
Les relations algébriques valables pour la fonction ln le sont aussi pour log2 : pour tous réels
x, y > 0, et tout réel α on a
En particulier, on a
log2 x = n ∈ Z ⇐⇒ x = 2n .
Annexe B
Quelques codages
B.1 Le Morse
e t
Table B.1 – Le codage Morse
Remarque : Contrairement aux apparences, l’alphabet utilisé par le Morse n’est pas limité
aux deux seuls symboles point et tiret . Un troisième symbole est nécessaire représentant
le silence 1 (voir page 37).
91
92 ANNEXE B. QUELQUES CODAGES
ftp://std.dkuug.dk/JTC1/sc2/wg3/docs/n411.pdf
B.4. LE CODAGE ISO-8859-1 93
Code Caractères en
binaire octal hexadécimal décimal mode lettres mode chiffres
00000 00 00 0 Rien (NUL)
00001 01 01 1 T 5
00010 02 02 2 Retour chariot (CR)
00011 03 03 3 O 9
00100 04 04 4 Espace (SP) =
00101 05 05 5 H £
00110 06 06 6 N ,
00111 07 07 7 M .
01000 10 08 8 Saut de ligne (LF)
01001 11 09 9 L )
01010 12 0A 10 R 4
01011 13 0B 11 G &
01100 14 0C 12 I 8
01101 15 0D 13 P 0
01110 16 0E 14 C :
01111 17 0F 15 V ;
Code Caractères en
binaire octal hexadécimal décimal mode lettres mode chiffres
10000 20 10 16 E 3
10001 21 11 17 Z "
10010 22 12 18 D $
10011 23 13 19 B ?
10100 24 14 20 S Sonnerie (BEL)
10101 25 15 21 Y 6
10110 26 16 22 F !
10111 27 17 23 X /
11000 30 18 24 A -
11001 31 19 25 W 2
11010 32 1A 26 J ’
11011 33 1B 27 Active le mode chiffres
11100 34 1C 28 U 7
11101 35 1D 29 Q 1
11110 36 1E 30 K (
11111 37 1F 31 Active le mode lettres
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
1 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
2 ESP ! " # $ % & ’ ( ) * + , - . /
3 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4 @ A B C D E F G H I J K L M N O
5 P Q R S T U V W X Y Z [ \ ] ^ _
6 ‘ a b c d e f g h i j k l m n o
7 p q r s t u v w x y z { | } ~ DEL
Introduction 3
2 Codes et codages 25
2.1 Exemples de codages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.1 Le codage Morse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.2 Le codage Baudot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.3 Le codage ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.4 Les codages ISO-8859 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
95
96 TABLE DES MATIÈRES
3 Codages optimaux 53
3.1 Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.1.1 Source d’information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.1.2 Quantité d’information . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.1.3 Entropie d’une source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.2 Codages optimaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.2.1 Longueur moyenne d’un codage de source . . . . . . . . . . . . . . . . . . 56
3.2.2 Codage optimal d’une source . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.3 Théorème du codage sans bruit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.3.1 Première partie du théorème . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.3.2 Un lemme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.3.3 Preuve du théorème 3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.3.4 Remarque sur le cas d’égalité . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.3.5 Remarques sur la distribution de probabilité d’une source . . . . . . . . . 60
3.3.6 Seconde partie du théorème . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.3.7 Conséquence des théorèmes 3.1 et 3.2 . . . . . . . . . . . . . . . . . . . . 61
TABLE DES MATIÈRES 97
A Autour du binaire 89
A.1 Puissances de 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
A.2 Logarithme binaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
B Quelques codages 91
B.1 Le Morse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
B.2 Le code Baudot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
B.3 Le codage ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
B.4 Le codage ISO-8859-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
98 TABLE DES MATIÈRES