Ce formulaire rassemble, chapitre par chapitre, les définitions, les formules et les théorèmes essentiels du cours, avec la notation des chapitres correspondants: les numéros d'équations et de théorèmes y renvoient directement. Chaque formule est suivie de la signification des symboles, de ses conditions de validité et du résultat numéroté dont elle provient; les démonstrations, les exemples chiffrés et les pièges classiques restent dans les chapitres. Les rappels de mathématiques — puissances de deux, logarithmes, sommes usuelles, dénombrement, congruences, Stirling — sont à l'annexe A et ne sont pas répétés ici.
Conventions du cours, fixées une fois pour toutes: le logarithme est toujours en base 2 et la base est écrite, , sauf à l'intérieur d'une classe de complexité où elle ne change rien (on écrit alors , la formule de changement de base faisant que la classe ne dépend pas de la base); est le logarithme naturel. L'unité d'information est le bit (symbole b), le groupe de huit bits est l'octet (symbole o) — le mot anglais n'est jamais employé. Les préfixes décimaux (ko o, Mo, Go, To) servent aux tailles de fichiers et aux débits, les préfixes binaires (Kio o, Mio, Gio, Tio) là où le matériel est binaire; chaque fois, on dit lequel. Une base s'écrit en indice, , , . La taille de l'entrée est , son nombre de bits , la taille d'un alphabet ou . Décimales à la virgule (), milliers séparés par une espace fine ().
Tableau I – Toutes les complexités établies dans le cours
Les coûts ci-dessous sont ceux que les chapitres démontrent ou mesurent, avec l'opération comptée. Rappel du chapitre 2: une affirmation de complexité utile précise quel algorithme, quelle opération, en fonction de quelle taille, dans quel cas et avec quelle notation.
| Algorithme ou opération | Opération comptée | Coût | Chapitre |
|---|---|---|---|
| Recherche séquentielle | comparaisons | au mieux, en moyenne, au pire | 2 |
| Tri par sélection | comparaisons | , |
Trois lectures de ce tableau. D'abord, la classe de croissance décide de ce qui est faisable: à l'hypothèse de travail de opérations élémentaires par seconde, une seconde traite en linéaire, en quasi-linéaire, en quadratique, en cubique, en exponentiel et en factoriel (chapitre 2). Ensuite, : avec les constantes et , le tri quadratique l'emporte jusqu'à (exemple 2.4). Enfin, : la même recherche répétée coûte milliards de comparaisons dans un tableau non trié, par dichotomie et quelques dizaines de milliers en table de hachage (chapitre 4).
Tableau II – Tous les codes et toutes les bornes
| Objet | Formule | Conditions | Chapitre |
|---|---|---|---|
| Code de longueur fixe | bits par symbole | symboles distincts | 1, 7 |
| Entropie de Shannon |
Le fil qui relie les trois familles: le chapitre 7 retire de la redondance jusqu'au plancher , le chapitre 8 en rajoute une, choisie et mesurée, jusqu'au plafond , et le chapitre 10 en ajoute une troisième, les octets d'en-têtes, qui ne portent ni information ni protection mais organisation. Sur ABRACADABRA, les quatre nombres à retenir sont bits en longueur fixe, bits par Huffman, bits de plancher d'entropie, et pour le taux de compression.
Chapitre 1 – Représentation de l'information
Définition du bit et relation (1.1): une information est la désignation d'une possibilité parmi plusieurs, également plausibles — hypothèse que le chapitre 6 lèvera. Repères à connaître: , , , .
Écriture positionnelle en base (1.2). L'entier se convertit par divisions successives (les restes lus du dernier au premier), la partie fractionnaire par multiplications successives (les parties entières lues du premier au dernier). Puisque et , un chiffre octal vaut trois bits et un chiffre hexadécimal quatre: l'hexadécimal est une abréviation du binaire, pas une base de calcul.
Critère de finitude (exemple 1.2). En base 2, seules les fractions dyadiques s'écrivent exactement: est finie, ne l'est pas.
Complément à deux (1.3) et théorème 1.1 avec sa relation (1.4): le bit de poids fort porte un poids négatif, l'opposé s'obtient en inversant tous les bits et en ajoutant 1, et la soustraction devient une addition, donc un seul circuit additionneur suffit. La plage est asymétrique: sur huit bits , et n'est pas représentable. Un même motif n'a aucun sens en soi: vaut non signé et en complément à deux.
Format binary64 de la norme IEEE 754 (1.5): 1 bit de signe, 11 bits d'exposant biaisé de , 52 bits de mantisse plus un bit implicite, soit 53 bits significatifs. Les valeurs et sont réservées (dénormalisés, zéros, infinis, NaN). Le double le plus proche de vaut exactement , c'est-à-dire , et rend : ce n'est pas un bogue, c'est un arrondi correct. L'écart relatif entre deux doubles voisins au voisinage de 1 vaut , et l'erreur relative d'un arrondi ne dépasse jamais . Le premier entier non représentable est .
Deux pièges. L'absorption: dès que est inférieur à la moitié du pas au voisinage de ; 1e16 + 1.0 rend 1e16, et additionner dix fois donne 0.9999999999999999. L'élimination catastrophique: soustraire deux nombres proches promeut en tête les chiffres faux déjà présents; sur , la formule scolaire rend au lieu de , soit plus de d'erreur relative, que la forme corrige.
Taille d'une image matricielle de pixels sur bits (1.6), débit et taille d'un son échantillonné à hertz sur bits pour canaux pendant secondes (1.7). Valeurs de référence: une image en couleur vraie pèse Mo; une minute au format du disque compact ( Hz, 16 bits, 2 canaux) pèse Mo, soit Mio, à un débit de Mbit/s. Le théorème d'échantillonnage de Nyquist–Shannon, ici parce que sa démonstration relève de l'analyse de Fourier, exige .
Texte: ASCII code 128 caractères sur sept bits (majuscules et minuscules décalées de , donc un bit à basculer pour changer la casse). Unicode attribue un point de code de U+0000 à U+10FFFF; UTF-8 (RFC 3629) l'écrit sur 1 à 4 octets selon les gabarits 0xxxxxxx, 110xxxxx 10xxxxxx, 1110xxxx 10xxxxxx 10xxxxxx, 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. Trois conséquences: tout fichier ASCII est déjà de l'UTF-8 valide; un octet de continuation se reconnaît à ses bits de tête 10; et aucun mot n'est le préfixe d'un autre — c'est un code préfixe au sens du chapitre 7. Ainsi é (U+00E9) s'écrit C3 A9 et € (U+20AC) s'écrit E2 82 AC. Lire de l'UTF-8 comme du latin-1 produit du mojibake — é devient é — sans qu'aucun bit n'ait changé.
Norme ISO/IEC 80000-13. Excès du binaire sur le décimal: au kilo, au méga, au giga, au téra. Un disque annoncé à Go contient exactement octets et s'affiche : l'écart apparent de n'est aucune perte, c'est le rapport . Et un abonnement à «100 Mbit/s» transfère au mieux Mo/s: un facteur 8 se cache dans la minuscule du symbole.
Chapitre 2 – Algorithmes et complexité
Identité d'Euclide (2.1). L'algorithme s'écrit tant que b ≠ 0: (a, b) ← (b, a mod b). Sa correction et sa terminaison (théorème 2.2) illustrent la méthode du chapitre: invariant pour la correction, variant , entier positif strictement décroissant dans bien fondé, pour la terminaison. Le majorant grossier est divisions; le vrai majorant, obtenu en montrant que (exercice 2.1), est : le coût d'Euclide est , donc , ce qui le rend utilisable sur les entiers de 2048 bits du chapitre 9.
Un invariant est vrai avant le premier tour, conservé par un tour, et donne le résultat une fois joint à la négation de la condition de boucle. Un ensemble bien fondé ne contient aucune suite infinie strictement décroissante; un variant prend ses valeurs dans un tel ensemble et décroît strictement à chaque tour. Les deux mots comptent: une décroissance large autorise la stagnation, et décroît strictement dans , qui n'est pas bien fondé, sans jamais s'arrêter.
Définitions (2.2) et (2.3). Le premier quantificateur autorise à ignorer tout facteur constant, le second tout comportement en petites tailles: est une propriété de la queue, à une constante multiplicative près. L'écriture avec un signe égal est un abus toléré — est un ensemble de fonctions — et elle ne se retourne pas.
Définition (2.4) et théorème 2.3: ; tout polynôme de degré à coefficient dominant positif vérifie ; et si avec , alors . : dire qu'un algorithme est en n'affirme pas qu'il coûte , et tout algorithme en est aussi en .
Coût du tri par sélection (2.5), identique au meilleur, au pire et en moyenne: les deux boucles sont bornées et sans sortie anticipée, donc le contenu du tableau n'y change rien. Son seul atout est le nombre d'échanges, au plus .
Coût en comparaisons du tri par insertion (théorème 2.4), sur des éléments deux à deux distincts; le cas moyen (2.6), sous la loi uniforme sur les permutations, vaut environ , soit la moitié du pire cas — même classe. Le tri par insertion est donc adaptatif et le tri par sélection ne l'est pas, ce qui est la seule différence qui compte en pratique.
Le tableau du cours, , trié , sert de référence commune aux chapitres 2, 3 et 4 (et au chapitre 10 du cours Introduction à la programmation). Comptages d'exécution:
| Algorithme | Comparaisons sur le tableau du cours | Meilleur cas | Pire cas | Moyenne sur les permutations |
|---|---|---|---|---|
| Tri par sélection | (et 5 échanges) | |||
| Tri par insertion | (et 11 décalages) | |||
| Tri fusion (chapitre 3) |
Les comparaisons du tri par insertion se décomposent en , une étape par élément inséré. La borne d'information du chapitre 3 vaut ici : le tri fusion est à de l'optimum théorique pour .
À opérations élémentaires par seconde — hypothèse de travail, jamais une mesure —, la plus grande taille traitable en une seconde vaut en , en , en , en , en et en . Multiplier la machine par mille fait passer à et à :
Chapitre 3 – Récursivité et diviser pour régner
Définitions récursives (3.1) et (3.2). Une définition récursive bien fondée comporte un cas de base, un cas récursif et une taille qui décroît strictement; les trois sont nécessaires, et les cas de base doivent couvrir toutes les valeurs que le cas récursif peut atteindre par le bas — d'où deux cas de base pour Fibonacci. Prouver un algorithme récursif, c'est faire une récurrence: le cas de base est l'initialisation, l'appel récursif est l'hypothèse de récurrence (théorème 3.1).
Nombre total d'appels de Fibonacci récursif naïf (théorème 3.2, relations (3.3) et (3.4)): appels pour , pour , pour . L'arbre a feuilles et nœuds internes, donc autant d'additions: . La mémoïsation ramène le coût à temps et mémoire, la boucle à deux variables à temps et mémoire.
Chaque appel en cours occupe un cadre sur la pile d'appels (paramètres, variables locales, adresse de retour), en discipline «dernier entré, premier sorti». La pile est de taille fixe: une récursion de profondeur linéaire finit par déborder — en Python, dès appels avec la limite par défaut — alors qu'une récursion qui divise reste à une vingtaine de cadres pour un million d'éléments. Règle pratique: une récursion qui divise la taille est presque toujours bonne, une récursion qui la décrémente est une boucle mal écrite, et une récursion qui recalcule les mêmes sous-problèmes doit être mémoïsée.
Coût de la recherche dichotomique sur un tableau trié (théorème 3.3, relation (3.5)): pour sept éléments, pour un million, pour un milliard. Son invariant: si figure dans , alors son indice appartient à . Deux avertissements: le tri est un prérequis que rien dans le code ne vérifie, et m ← (bas + haut) / 2 peut déborder — écrire m ← bas + (haut − bas) / 2.
Récurrence du schéma diviser pour régner (3.6): sous-problèmes de taille , plus pour diviser et combiner. Dichotomie: , , . Tri fusion: , , .
Résolution par l'arbre de récursion (3.7): au niveau il y a sous-problèmes de taille , et il y a feuilles. Tout se joue dans la comparaison entre le coût des feuilles et celui de la racine.
Théorème maître (théorème 3.5), admis: sa démonstration ne contient aucune idée que l'arbre n'ait déjà livrée, mais elle exige de traiter les parties entières et de majorer (3.7) par une série géométrique dans chacun des trois cas. La condition de régularité du cas 3 est pour un . Trois limitations: il laisse un trou entre les cas 1 et 2 (ainsi donne et échappe au théorème), la régularité n'est pas décorative, et il ne s'applique aux récurrences qui décrémentent — ou .
Applications: tri fusion (cas 2); dichotomie (cas 2 avec ); multiplication de matrices naïve par blocs (cas 1, aucun gain), et avec ; Karatsuba , .
Borne inférieure des tris par comparaisons (théorème 3.6, relations (3.8) et (3.9)). L'argument est celui de l'arbre de décision: chaque nœud interne porte une comparaison, chaque feuille une permutation; l'arbre a au moins feuilles puisque l'algorithme doit être correct sur chacune des entrées, et un arbre binaire de hauteur en a au plus ; donc . La minoration élémentaire donne , et Stirling la valeur exacte avec . — à , contre une borne de , soit . Attention: une borne inférieure n'est pas toujours atteignable; elle l'est pour et , elle ne l'est pas pour où le minimum vrai vaut alors que .
Tours de Hanoï (3.10, théorème 3.7). La formule est atteinte par la procédure récursive, et aucune stratégie ne fait mieux: le plus grand disque doit quitter vers à un instant où les autres sont tous sur , d'où . Pour , déplacements, soit milliards d'années à un par seconde.
Chapitre 4 – Structures de données et graphes
Adressage d'un tableau (4.1): une multiplication et une addition, indépendantes de , de et du contenu — d'où l'accès en , et d'où la possibilité même de la dichotomie. La contrepartie est la contiguïté: insérer en position décale éléments. L'ajout en fin avec doublement de capacité coûte amorti: construire éléments déclenche recopies, moins de deux par élément, quelle que soit la taille finale. La liste chaînée échange exactement l'inverse: pour atteindre le -ème, pour insérer à une position déjà tenue, au prix d'une ou deux adresses par cellule.
Une pile (LIFO) et une file (FIFO) ont les mêmes coûts, partout, et pas le même ordre de sortie: sur la séquence «ajouter 3, 7, 5, retirer, ajouter 9, retirer trois fois», la pile rend et la file rend . Cette seule différence sépare la pile d'appels d'une file d'attente, et — à la fin du chapitre — le parcours en profondeur du parcours en largeur.
Borne inférieure sur la hauteur d'un arbre binaire (théorème 4.1, relation (4.2)). Un arbre binaire de recherche vérifie en tout nœud la propriété d'ordre (sous-arbre gauche plus petit, droit plus grand) et se cherche en au plus comparaisons. Le coût est , pas : la hauteur dépend de l'ordre d'insertion, pas de l'ensemble des clefs. Le tableau du cours inséré dans l'ordre donne un arbre de hauteur 4 pour comparaisons d'insertion; les mêmes clefs triées donnent une chaîne de hauteur 6 pour comparaisons — un ABR dégénéré est une liste chaînée. Le est la propriété des arbres équilibrés (AVL, rouge-noir, arbres B). Le rend les clefs triées quelle que soit la forme de l'arbre.
Facteur de charge d'une table de hachage à chaînage et coûts moyens sous l'hypothèse du hachage uniforme. Si l'on maintient proportionnel à (redimensionnement dès que dépasse un seuil, typiquement ), les trois opérations coûtent en moyenne, le re-hachage s'amortissant comme le doublement d'un tableau. Le est conditionnel et ses deux conditions sont explicites: la fonction doit réellement disperser vos clefs, et le facteur de charge doit rester borné. Le pire cas reste . Les collisions sont inévitables par le principe des tiroirs et arrivent bien avant la saturation: avec 6 clefs dans 7 seaux, la probabilité d'au moins une collision vaut — c'est le calcul des anniversaires, qui reviendra au chapitre 9.
Lemme des poignées de main (théorème 4.2), par double comptage des couples (sommet, arête incidente); en particulier le nombre de sommets de degré impair est pair. Un graphe connexe sans cycle est un arbre et vérifie , nombre minimal d'arêtes d'un graphe connexe.
| Opération | Matrice d'adjacence | Listes d'adjacence |
|---|---|---|
| Mémoire | ||
| Tester si et sont voisins | ||
| Énumérer les voisins de |
Le seuil se calcule: les listes battent la matrice d'octets lorsque , soit une densité d'environ , et les graphes réels sont très en dessous — Mo contre Mo pour un réseau routier de carrefours et tronçons, To contre Po pour un graphe social hypothétique de comptes de degré moyen 200, c'est-à-dire la différence entre faisable et impossible.
Un seul schéma de parcours donne les deux algorithmes: on marque, on met dans un conteneur, on retire, on visite, on ajoute les voisins non découverts. File parcours en largeur, pile parcours en profondeur. Les deux coûtent en listes d'adjacence, chaque sommet entrant au plus une fois dans le conteneur et chaque arête étant examinée deux fois.
Le parcours en largeur calcule les distances d'un graphe non pondéré (théorème 4.3). Le ressort de la preuve est la monotonie de la file: si elle contient de la tête vers la queue, alors , donc les sommets sortent par valeurs de non décroissantes et l'on n'atteint jamais la couche avant d'avoir épuisé la couche . Le parcours en profondeur n'est pas un algorithme de plus court chemin, et son erreur peut être arbitrairement grande.
Opération centrale de l'algorithme de Dijkstra, qui rend définitif à chaque tour le sommet non définitif de minimal. Coût avec un tableau (bon pour un graphe dense), avec un tas binaire (bon pour un graphe creux). Les sommets deviennent définitifs par distances croissantes, et c'est le cœur de la preuve: tout chemin non encore envisagé doit sortir de l'ensemble des définitifs par un sommet non définitif, de sorte que son poids vaut au moins le poids du reste, positif ou nul. L'hypothèse de sert exactement là et nulle part ailleurs; avec un poids négatif l'algorithme rend des résultats faux, et ajouter une constante à tous les poids ne corrige rien, puisque le décalage s'applique et pénalise davantage les chemins longs.
Chapitre 5 – Les limites du calcul
Une machine de Turing est la donnée d'un ruban infini sur un alphabet fini contenant un blanc, d'une tête, d'un ensemble fini d'états et d'une table de transition envoyant (état, symbole lu) sur (symbole écrit, déplacement, nouvel état). Une configuration est le triplet (ruban, position de la tête, état). Tout y est fini sauf le ruban — la table n'a que lignes — donc une machine s'écrit comme un mot fini .
Robustesse du modèle (théorème 5.1, admis): plusieurs rubans, ruban semi-infini, alphabet binaire, non-déterminisme, machines à registres, -calcul, fonctions récursives générales et tout langage usuel à mémoire non bornée calculent exactement la même classe de fonctions. Les simulations coûtent du temps — passer de rubans à un seul peut élever le nombre d'étapes au carré — mais rien de calculable ne devient incalculable. Machine universelle (théorème 5.2, admis): il existe qui, sur , simule sur et s'arrête si et seulement si s'arrête. Un ordinateur est une machine universelle, un programme est une donnée: on écrit donc des programmes qui manipulent des programmes, et l'on fait raisonner un programme sur lui-même.
Thèse de Church–Turing: toute fonction calculable par un procédé effectif l'est par une machine de Turing. Ce n'est pas un théorème et ne peut pas en être un, l'un de ses deux membres étant informel; elle s'appuie sur la convergence de modèles conçus indépendamment, sur l'analyse du calcul humain faite par Turing, et sur quatre-vingt-dix ans sans contre-exemple. Elle sert à passer de l'informel au formel — un algorithme en français suffit à établir la calculabilité — et jamais à établir une impossibilité. Elle ne dit rien de l'efficacité: l'idée que tout modèle raisonnable en simule un autre avec un surcoût seulement polynomial est la thèse étendue (Cobham–Edmonds), bien plus fragile.
Hypothèse (5.1) du théorème 5.3: un tel n'existe pas. La démonstration construit qui calcule , boucle si la réponse est «oui» et s'arrête sinon, d'où (5.2), puis applique à sa propre description:
Contradiction (5.3): . Rien dans la construction n'est douteux — appeler un sous-programme, tester, boucler, passer un mot en argument — donc l'hypothèse tombe. est semi-décidable: on reconnaît les «oui» par simulation, jamais les «non».
Le théorème dit: impossible, pas difficile — aucun algorithme, sur aucune machine, en aucun temps. Il ne dit pas qu'on ne peut rien dire d'un programme: il porte sur une procédure universelle et exacte, et renoncer à l'un de ces adjectifs rend la tâche possible (langages dont tous les programmes terminent, analyseurs autorisés à répondre «je ne sais pas», simulation bornée en temps). L'argument est la diagonalisation de Cantor transportée aux programmes, et il donne gratuitement le théorème 5.4: les programmes sont dénombrables, les fonctions ne le sont pas, donc presque aucune fonction n'est calculable — plus fort en quantité, plus faible en contenu, puisqu'il n'en exhibe aucune.
Réduction (5.4) et théorème 5.5: si et décidable, alors décidable; par contraposée, si est indécidable, l'est aussi. Le sens de la flèche est toute la difficulté: pour montrer que est indécidable, il faut , jamais l'inverse — On obtient ainsi l'indécidabilité de «ce programme affiche-t-il bonjour?», de l'équivalence de deux programmes, de la totalité, de l'atteignabilité d'une ligne, du problème de correspondance de Post et du dixième problème de Hilbert (Matiyasevich, 1970).
Théorème de Rice (théorème 5.7, informel, admis): toute propriété non triviale de la fonction qu'un programme calcule est indécidable. L'hypothèse «de ce qu'il calcule, et non de la manière dont il est écrit» sauve l'analyse de programmes: les propriétés syntaxiques — nombre de lignes, présence d'une instruction, déclaration des variables, compilation — restent décidables.
Classe , la taille de l'entrée étant le nombre de symboles qu'il faut pour l'écrire — pour un entier, son nombre de bits et non sa valeur. La classe est robuste (changer de modèle multiplie le temps par un polynôme, et un polynôme d'un polynôme est un polynôme) et stable par composition. Deux réserves: est dans et inutilisable, n'y est pas et serait excellent; l'identification de à «traitable» est une convention.
Classe , définie par certificat et vérificateur. En une phrase: les problèmes dont les réponses «oui» admettent une preuve courte et facile à vérifier. Le nom signifie «non déterministe polynomial», jamais «non polynomial»: est une classe de problèmes, pas d'algorithmes, et (théorème 5.8, en ignorant le certificat). Tout problème de est décidable en temps exponentiel par énumération des certificats, donc ne contient aucun problème indécidable.
Réduction polynomiale et théorème 5.9: est transitive, et si alors . Le ressort du coût est que . Un problème est - si pour tout , et - s'il est de plus dans . : si un seul problème -complet est dans , alors et y sont — des milliers de problèmes de domaines sans rapport tombent ou résistent ensemble. (théorème 5.11, admis): SAT et 3-SAT sont -complets; la démonstration code l'existence d'un calcul acceptant par une formule booléenne, avec variables du type «à l'instant , la case contient le symbole ».
Catalogue: 3-SAT, CLIQUE, ENSEMBLE INDÉPENDANT, COUVERTURE PAR SOMMETS, COLORIAGE à 3 couleurs, SAC À DOS, VOYAGEUR (version décision), CIRCUIT HAMILTONIEN, PARTITION. Frontières instructives: 2-SAT est dans (parcours du graphe d'implications), le 2-coloriage aussi (bipartition), le circuit eulérien aussi (degrés pairs). Relations utiles: et .
Aucune des trois inclusions n'est connue stricte, mais le théorème de hiérarchie en temps donne : au moins une l'est, sans qu'on sache laquelle. contre est ouvert (prix du millénaire), et toute figure de ces classes n'a de sens que sous une hypothèse déclarée. -complet ne veut pas dire impossible en pratique: heuristiques, approximation avec garantie prouvée (facteur 2 pour la couverture par sommets, en temps linéaire), cas particuliers polynomiaux, algorithmes pseudo-polynomiaux — le sac à dos en est exponentiel en la taille de l'entrée, s'écrivant sur bits — et solveurs exacts très efficaces sur les instances structurées. Et : c'est pourquoi la -complétude est une mauvaise base pour la cryptographie.
Chapitre 6 – Théorie de l'information et entropie
Théorème 6.1 et relation (6.1): l'additivité sur des événements indépendants force le logarithme, par l'équation fonctionnelle de Cauchy. Ce n'est pas un choix de commodité, c'est une conséquence.
Quantité d'information, ou surprise, d'un événement de probabilité (6.2); la base 2 est fixée par la convention . Autres unités: le nat ( nat bit), le dit en base 10. Distinguez toujours le bit physique, case valant 0 ou 1, du bit d'information, unité de mesure qui peut valoir .
Entropie de Shannon (6.3), avec la convention , seule valeur rendant continue en 0 — d'où le fait qu'ajouter des symboles de probabilité nulle ne change pas l'entropie, ce qui permet de comparer des sources d'alphabets différents. ne dépend que du vecteur , jamais des symboles. Multipliée par le nombre de symboles, elle donne des bits; multipliée par un débit de symboles, des bits par seconde.
Inégalité de Gibbs (théorème 6.2, relation (6.4)), démontrée par . Tout le reste du chapitre en découle. La quantité est la ; elle mesure le prix d'un mauvais modèle, et elle n'est symétrique, donc pas une distance.
Bornes (théorème 6.3, relation (6.5)), avec égalité à gauche si et seulement si la source est déterministe, à droite si et seulement si elle est uniforme. La borne haute s'obtient par Gibbs avec , ou par Jensen appliqué à concave.
Règle de regroupement (théorème 6.4, relation (6.6)). Conséquences: fusionner deux symboles fait toujours baisser l'entropie, scinder la fait monter d'au plus bit. Vérification sur ABRACADABRA: confondre C et D fait passer de à , soit une perte de bit par symbole, donc exactement 2 bits sur les onze symboles.
Entropie binaire (6.7): symétrique, strictement concave, maximale et égale à 1 en , nulle en 0 et en 1, avec une tangente verticale aux bords. Valeurs de référence, toutes calculées:
Repère à retenir: il faut déjà onze pour cent d'erreurs pour détruire la moitié d'un bit (la racine exacte de vaut ). Cette lenteur est ce qui rend possibles les codes correcteurs du chapitre 8.
Entropie conjointe et entropie conditionnelle (6.8). est un nombre, pas une fonction de : c'est l'incertitude qui reste sur une fois connu, en moyenne. Et en général.
Règle de chaînage (théorème 6.5, relation (6.9)): décrire le couple coûte le prix de , plus ce qu'il reste à dire de une fois connu — et l'on peut commencer par l'un ou par l'autre.
Information mutuelle (6.10), symétrique bien que la première écriture ne le laisse pas deviner. Théorème 6.6: , avec égalité si et seulement si et sont indépendantes; en particulier conditionner ne peut pas augmenter l'entropie en moyenne. Attention: cela n'interdit pas pour un particulier, ni — avec , indépendants et , on a et bit. Le diagramme de Venn est un aide-mémoire fidèle à deux variables et , où l'«intersection triple» peut valoir bit.
Le canal binaire symétrique du cours, , , sert de fil au chapitre 8. Loi conjointe , marges et . Les six entropies, toutes recoupées:
Sur un canal binaire symétrique, toujours, quelle que soit la loi de la source: c'est le bruit du canal et rien d'autre.
Redondance relative (6.11), à ne pas confondre avec la redondance du codage lorsqu'un code de longueur fixe est imposé; dire chaque fois laquelle on utilise. C'est la grandeur qui articule toute la seconde moitié du cours: le chapitre 7 la supprime, le chapitre 8 en rajoute.
La source du cours, ABRACADABRA, onze symboles sur , modèle d'ordre 0:
| Symbole | A | B | R | C | D | Total |
|---|---|---|---|---|---|---|
| Occurrences | 5 | 2 | 2 | 1 | 1 | 11 |
| 1 | ||||||
Relation (6.12). Redondance du codage à longueur fixe: , soit . Redondance de la source par rapport à : , soit . Les deux ne mesurent pas la même chose — le premier inclut le gaspillage dû au fait que 5 n'est pas une puissance de 2.
L'entropie est une propriété du modèle, jamais de la chaîne. ABABABABAB vaut bit/symbole à l'ordre 0 et à l'ordre 1. ABRACADABRA vaut et, sur ses dix transitions, bit/symbole — chiffre qui illustre un principe et ne mesure rien, puisqu'estimer vingt-cinq probabilités conditionnelles sur dix observations est statistiquement indéfendable. Améliorer le modèle abaisse la borne sans jamais contredire le théorème. Et l'entropie n'est ni une mesure de sens, ni de valeur, ni de vérité, ni la d'un objet individuel — celle-ci n'est pas calculable, par un argument voisin de celui du chapitre 5.
Chapitre 7 – Compression des données
Taux de compression (7.1). Certains auteurs emploient le rapport inverse et disent «3 pour 1»: précisez toujours lequel. Un compresseur sans perte a un codeur injectif et vérifie ; un compresseur avec pertes gagne de la place précisément en confondant des données distinctes.
Argument de comptage (théorème 7.1, relation (7.2)), simple principe des tiroirs appliqué à une application injective. Pour : au moins une suite de longueur n'est pas raccourcie. Quantitativement, moins d'une suite sur peut être raccourcie de 10 bits, moins d'une sur de 20 bits. Un compresseur est donc un pari sur la structure des fichiers réels; il perd nécessairement sur le bruit, sur les données déjà comprimées et sur les données chiffrées. Vérification: zlib porte octets pseudo-aléatoires à octets, et un texte de octets comprimé à repasse à puis octets si l'on comprime à nouveau.
Un code est non singulier si les mots sont distincts, déchiffrable si son extension par concaténation, sans séparateur, est injective, et préfixe (ou instantané) si aucun mot n'est le début d'un autre. Préfixe déchiffrable, mais pas l'inverse: est déchiffrable sans être préfixe, au prix de l'instantanéité. Un code préfixe est exactement un choix de feuilles dans l'arbre binaire des préfixes.
Inégalité de Kraft (théorème 7.2, relation (7.3)), dans les deux sens. Sens direct: dans l'arbre complet de profondeur , le mot est ancêtre d'exactement feuilles et les descendances sont deux à deux disjointes. Réciproque: en triant et en posant (7.4), les premiers bits du développement binaire de forment un code préfixe des longueurs voulues. Le code est dit lorsque la somme vaut exactement 1: l'arbre n'a alors aucune feuille inutilisée. Le (1956, admis) étend l'inégalité aux codes déchiffrables: se restreindre aux codes préfixes ne coûte .
Longueur moyenne (7.5) et borne inférieure du codage de source (théorème 7.3, relation (7.6)). La démonstration pose et , d'où par (7.7). L'égalité exige , donc des probabilités qui sont toutes des .
Théorème du codage de source (théorème 7.4, relation (7.8), Shannon 1948). La borne haute s'obtient avec les longueurs de Shannon–Fano (7.9), admissibles puisque , donc Kraft, puis . Le code optimal fait au moins aussi bien.
Codage par blocs de symboles indépendants, dont l'entropie vaut : le surcoût est divisé par , au prix d'un alphabet de super-symboles. Sur une source binaire de paramètre , d'entropie : vaut , , et pour .
Algorithme de Huffman (1952): file de priorité sur les fréquences, fusion répétée des deux plus petits poids, fusions en . Le code se lit sur l'arbre (gauche , droite ) et il est préfixe par construction. Théorème 7.5: il est optimal parmi les codes préfixes. La démonstration repose sur deux lemmes — l'arbre d'un code optimal est complet et donne des mots plus courts aux symboles plus probables (argument d'échange, ), et les deux symboles les moins probables peuvent être pris frères — puis sur la récurrence fondée sur
relation (7.10), où le terme ajouté ne dépend pas du code.
Le code du cours pour ABRACADABRA, avec la convention de départage de la file de priorité:
Contrôle de Kraft: , le code est complet. Le message codé, , fait
soit bit/symbole et , c'est-à-dire de la version à longueur fixe. L'encadrement du théorème 7.4 est vérifié: . L'écart bit sur le message, soit bit par symbole, est la , et non un défaut de l'algorithme: les longueurs idéales , et ne sont pas entières.
Ce qui est forcé ici, c'est le total, pas les longueurs. Les motifs binaires ne sont pas uniques (échanger deux fils échange un 0 et un 1 dans tout un sous-arbre, d'où codes de même arbre), et les longueurs elles-mêmes ne le sont pas non plus: un autre départage entre poids égaux, également légitime, donne , , , , pour un total de bits. Le total est forcé parce qu'il est optimal; la répartition est une convention de départage. Un décodeur a donc toujours besoin de la table du code.
Codage arithmétique (7.11): on code le message entier comme un intervalle, dont la largeur est le produit des probabilités; nommer un point dans un intervalle de largeur coûte environ bits, plus un ou deux de terminaison. Pour ABRACADABRA, et , — ce n'est pas une coïncidence, le logarithme transformant le produit en la somme des surprises. Sur onze symboles, l'arrondi coûte plus qu'il ne rapporte ( bits contre pour Huffman); sur dix répétitions, contre ; sur cent, contre .
Lempel–Ziv ne modélise pas: il remplace les répétitions par des renvois, le dictionnaire se construisant identiquement chez le codeur et le décodeur, d'où aucune table à transmettre. LZ78 émet des couples (indice de la phrase antérieure, caractère ajouté); LZ77 émet des triplets (distance, longueur, caractère) dans une fenêtre glissante, et la copie peut se chevaucher elle-même — le décodeur copie caractère par caractère, ce qui encode une répétition périodique à prix constant. Sur ABRACADABRA, LZ78 produit sept couples pour onze symboles et perd contre Huffman: l'algorithme passe la première moitié du fichier à apprendre. DEFLATE (zlib, gzip, zip, PNG) combine LZ77 puis Huffman — un modèle, puis un codeur entropique.
Compression avec pertes, trois étages: transformer (représentation réversible qui concentre l'information), quantifier (seul étage où l'information est détruite, celui que règle le curseur de qualité), coder sans perte. JPEG l'applique aux images (luminance-chrominance, blocs de , transformée en cosinus discrète, table de quantification, zigzag, plages, Huffman), MP3 au son via un modèle psychoacoustique qui estime le seuil de masquage et alloue les bits sous ce seuil. Le réencodage cumule les dégâts. Enfin comprimer, chiffrer, protéger — dans cet ordre: un bon chiffré ressemble à une suite aléatoire, donc ne se comprime pas.
Chapitre 8 – Détection et correction d'erreurs
Bit de parité paire (8.1). Le contrôle du récepteur vérifie — pour un code linéaire, le résultat du contrôle ne dépend que du motif d'erreur, jamais du mot émis. Théorème 8.1: la parité détecte toute erreur de poids impair et aucune erreur de poids pair. Sur bits à , elle intercepte des mots abîmés et laisse passer mots pour mille — un filtre grossier, pas une garantie d'intégrité.
Distance de Hamming (8.2), qui est une vraie distance (théorème 8.2): l'inégalité triangulaire vient de sur les ensembles de positions où les mots diffèrent. Elle compte exactement le nombre d'erreurs qu'il faut pour transformer en .
Distance minimale (8.3). Pour un code linéaire, c'est simplement le plus petit poids d'un mot de code non nul: pour le code (7,4), 15 poids à examiner au lieu de 120 paires.
Théorèmes 8.3 et 8.4 (relation (8.4)), et les deux bornes sont atteintes. La géométrie: la boule compte
mots (8.5), et le décodage au plus proche voisin est correct si et seulement si les boules de rayon centrées sur les mots de code sont deux à deux disjointes, c'est-à-dire . D'où le facteur deux entre les deux théorèmes: détecter, c'est ne retomber sur aucun centre (); corriger, c'est rester dans le bon domaine. Les deux usages : un code de distance 3 corrige une erreur en détecte deux.
Erreur résiduelle du code de répétition de longueur impaire (8.6), décodé par vote majoritaire, de rendement et de distance minimale . Développement en petit : , — chaque paire de copies supplémentaires gagne un ordre en , pour un prix . Pour descendre sous à , il faudrait dix-neuf copies de chaque bit.
Code de Hamming (7,4), convention du cours: les bits sont numérotés de gauche à droite, les parités occupent les positions puissances de deux 1, 2, 4 et les données les positions 3, 5, 6, 7, dans l'ordre .
Équations de parité (8.7): le contrôle porte sur les positions dont le numéro, écrit en binaire, a un 1 au poids . Matrice génératrice (8.8), sur :
Distribution des poids des 16 mots: un de poids 0, sept de poids 3, sept de poids 4, un de poids 7. Donc , , .
Syndrome (8.9) et théorème 8.5: le syndrome ne dépend que de l'erreur, il vaut 0 s'il n'y en a pas, et il vaut pour une erreur simple en position . Inverser le bit corrige donc toute erreur simple, en temps constant, sans jamais comparer aux seize mots de code. Les 3 bits de syndrome offrent valeurs pour situations: rien n'est gaspillé, rien ne reste en réserve — et c'est exactement ce qui fait que le code est parfait, donc sans aucune marge face à une erreur double. Vérifications exhaustives: les erreurs simples sont toutes corrigées, et les erreurs doubles sont . Le code (8,4), obtenu en ajoutant une parité globale, porte à 4 et distingue les deux cas: c'est le principe des mémoires ECC, en général sous la forme (72,64).
Probabilité qu'un bloc de sept bits reçoive deux erreurs ou plus (8.10). Erreur résiduelle par bit de données, obtenue par énumération exhaustive des 128 motifs (8.11):
| Canal nu |
À , le code de Hamming est fois moins fiable que la répétition 3 et fois plus rapide: pas de vainqueur absolu, un compromis. Et au-delà de , la courbe du code de Hamming passe au-dessus de celle du canal nu: en «corrigeant» des blocs qui portent presque toujours deux erreurs ou plus, le décodeur en ajoute plus qu'il n'en retire. Un code correcteur n'est pas une protection inconditionnelle.
Borne de Hamming, ou borne de l'empilement de sphères (théorème 8.6, relation (8.12)): les boules de rayon sont disjointes par l'inégalité triangulaire, et toutes contenues dans . C'est un théorème d'impossibilité: aucun code ne corrige deux erreurs, puisque ; aucun code non plus, puisque . Un code est quand l'égalité est atteinte, c'est-à-dire quand les boules l'espace. Le code (7,4) l'est: . Toute la famille l'est: . Les répétitions aussi (; ), la répétition 4 non — c'est pourquoi on ne répète jamais un nombre pair de fois. La liste complète des codes binaires parfaits est connue (van Lint, Tietäväinen): les codes triviaux, les répétitions impaires, les codes de Hamming, et , le code de Golay . Les codes parfaits sont des accidents arithmétiques.
CRC: un bloc de bits est un polynôme sur , où l'addition est le OU exclusif et donc la soustraction aussi. On décale de zéros, on divise par le générateur de degré , on transmet le message suivi du reste; le récepteur divise et accepte si le reste est nul. Comme , le contrôle ne voit encore une fois que l'erreur, et le CRC échoue exactement sur les multiples de . Garanties: toute erreur simple si a au moins deux termes; toute erreur de poids impair si divise ; et , puisqu'une telle rafale s'écrit avec et que ne divise ni ni . Pour les rafales plus longues, sous l'hypothèse idéalisée d'un motif uniforme, il en passe une fraction , soit pour CRC-32. : il est trivialement falsifiable.
Capacité du canal binaire symétrique (8.13). L'interprétation est celle du chapitre 6: le canal détruit bit par usage, et l'information mutuelle maximisée sur les lois d'entrée vaut . Valeurs: ; ; ; ; ; ; , canal mort où la sortie est indépendante de l'entrée. Au-delà de la capacité remonte, puisqu'il suffit d'inverser tout ce que l'on reçoit.
Théorème du codage de canal (théorème 8.7, Shannon 1948, admis). Partie directe: pour tout et tout , il existe une longueur de bloc à partir de laquelle un code de rendement au moins a une erreur de bloc inférieure à . Réciproque: pour , l'erreur est minorée par une constante strictement positive. C'est un seuil net: en dessous de , la fiabilité parfaite s'obtient en allongeant les blocs et sans sacrifice de rendement supplémentaire; au-dessus, rien n'y fait. La démonstration est non constructive — elle tire un code au hasard et montre que la moyenne sur tous les codes tend vers 0 — et le code dont elle prouve l'existence serait inutilisable: stocker mots pour et demanderait entrées, très au-delà des atomes de l'univers observable. Ce qui manque est une : un code décrit par une règle courte et surtout en temps raisonnable.
L'écart se chiffre. À , alors que le code de Hamming (7,4) plafonne à avec d'erreur résiduelle, quand le théorème promet une erreur aussi petite qu'on veut à ce rendement; inversement, le rendement n'est fiable que tant que , soit . Chronologie: Golay et Hamming (1949–1950), Reed–Solomon (1960, sur des symboles, donc résistants aux rafales), LDPC de Gallager (1962, oubliés trente ans), turbocodes (1993), redécouverte des LDPC (1996), d'Arıkan (2008), les premiers dont on démontre qu'ils atteignent la capacité, en .
Chapitre 9 – Cryptographie et sécurité
Quatre objectifs distincts, dont aucun n'entraîne les autres: confidentialité (chiffrement), intégrité (empreintes et codes d'authentification), authenticité (signatures et protocoles), non-répudiation (signatures à clef publique et certificats). Un message chiffré peut être modifié sans être détecté; un message intègre peut venir de n'importe qui; une authenticité à clef partagée ne prouve rien devant un tiers, chacune des deux parties ayant pu fabriquer le message.
Principe de Kerckhoffs: la sécurité repose uniquement sur le secret de la clef, jamais sur celui de l'algorithme, supposé connu de l'adversaire — parce qu'un algorithme finit par être connu, ne se remplace pas comme une clef, n'est examiné que s'il est public, et parce que seule cette hypothèse rend la sécurité quantifiable. La sécurité par l'obscurité peut être une gêne supplémentaire, jamais la couche qui porte.
Chiffre de César (9.1) et chiffre de Vigenère (9.2). Le premier a 26 clefs, soit bits. La substitution mono-alphabétique quelconque en a , soit bits — : un grand espace de clefs est une condition , jamais suffisante, et la substitution ne fait que renommer les barres de l'histogramme des fréquences. Le test du khi-deux sur les 26 déchiffrements tranche sans ambiguïté.
Indice de coïncidence (9.3): pour un texte aléatoire uniforme, pour du français. Contre Vigenère, on découpe le chiffré en colonnes et l'on retient la plus petite valeur de pour laquelle l'indice moyen des colonnes remonte à celui du français, un multiple de la vraie longueur donnant le même effet; chaque colonne est alors un César. La faiblesse est la clef courte et répétée, pas la formule.
Secret parfait au sens de Shannon (9.4): observer le chiffré n'apprend rien, même avec un temps de calcul infini.
Masque jetable (9.5) et théorème 9.1: , valeur qui ne dépend pas de , d'où le résultat par Bayes. Tout clair de même longueur reste exactement aussi probable qu'avant l'interception.
Borne de Shannon (théorème 9.2): une clef ne peut pas être plus courte que le message qu'elle protège parfaitement. Le masque jetable ne résout donc pas la confidentialité, il la déplace vers la distribution des clefs sans la réduire d'un octet. Deux autres conditions, aussi contraignantes: la clef doit être véritablement aléatoire (la remplacer par un générateur pseudo-aléatoire de graine 128 bits ramène à la sécurité calculatoire du chiffrement par flot ainsi défini), et elle ne doit jamais servir deux fois:
Relation (9.6): la clef disparaît, et deux textes naturels superposés se séparent statistiquement. Si de plus un clair est connu, on retrouve puis tous les autres.
Sécurité calculatoire et AES. L'AES (Rijndael, concours public, FIPS 197, 2001) opère sur des blocs de 128 bits avec des clefs de 128, 192 ou 256 bits. Contre AES-128, la meilleure approche réaliste reste la recherche exhaustive: clefs, soit années à essais par seconde, près de mille fois l'âge de l'univers; et , environ le millième du nombre d'atomes de l'univers observable (). Trois pièges indépendants de la force du chiffre: le (en ECB, deux blocs de clair identiques donnent deux chiffrés identiques et la structure du document transparaît), l' sans authentification ajoutée, et les — tailles, nombre, rythme, correspondants — qui traversent le chiffrement intactes.
Nombre de clefs symétriques pour correspondants deux à deux (9.7): 45 pour 10 personnes, pour mille, près de pour un million — un coût en pour un nombre de participants en . La cryptographie à clef publique ramène cela à : chacun publie clef.
Petit théorème de Fermat (théorème 9.3, relation (9.8), premier ne divisant pas ) et théorème d'Euler (théorème 9.4, relation (9.10), ). Les deux se démontrent de la même façon: la multiplication par permute l'ensemble des classes inversibles, on multiplie le tout et l'on simplifie. L'exponentiation rapide par carrés successifs, lue de gauche à droite sur l'écriture binaire de l'exposant, coûte au plus multiplications modulaires au lieu de , et chaque produit reste borné par grâce à la réduction immédiate.
Indicatrice d'Euler (9.9). Point capital: calculer à partir de seul revient à factoriser , puisque et font de et les racines d'une équation du second degré. Sur la clef du cours: , , , soit 61 et 53.
Échange de Diffie-Hellman (1976). Alice et Bob conviennent publiquement de premier et de ; Alice publie , Bob publie , et tous deux calculent
Valeurs du cours: , (racine primitive: l'ordre de 2 modulo 227 vaut bien ), , , d'où , et le , qui n'a jamais transité — un observateur lit , , , et rien d'autre. L'adversaire passif doit résoudre le — «pas de bébé, pas de géant» demande de l'ordre de opérations , soit pour un de 2048 bits — ou le problème de Diffie-Hellman calculatoire, qu'on ne sait pas résoudre autrement sans avoir démontré l'équivalence.
Diffie-Hellman nu ne fournit aucune authentification et cède à l'intercepteur. Avec , d'où : Mallory substitue dans les deux sens, partage avec Alice et avec Bob, déchiffre, lit, modifie, rechiffre — . L'attaque n'exploite aucune faiblesse calculatoire (agrandir ne sert à rien) mais l'absence de lien entre une valeur et une identité; la parade est une signature vérifiée par certificat.
RSA (Rivest, Shamir, Adleman, 1978): choisir premiers, poser et , choisir avec , calculer tel que
relation (9.11), publier , garder secrets , , et — et si possible les détruire. Chiffrement , déchiffrement , pour .
Correction de RSA (théorème 9.5, relation (9.12)). On écrit . Si , Euler conclut. Dans le cas général, on travaille modulo puis modulo : ou bien et , ou bien Fermat donne et ; de même modulo ; et , premiers distincts divisant , leur produit le divise aussi.
La clef jouet du cours, à utiliser telle quelle:
Chiffrement de : les carrés successifs donnent , , , , modulo , puis , soit en 4 carrés et 1 multiplication — . Déchiffrement: , en 15 produits au lieu de (, 12 bits dont 5 à 1). : se factorise en essayant les premiers jusqu'à , alors qu'un module réel a au moins 2048 bits, soit plus de 600 chiffres décimaux.
Sur quoi repose la sécurité de RSA. Ce que l'on sait: aucun algorithme classique connu ne factorise en temps polynomial en le nombre de bits, le meilleur algorithme général publié est sous-exponentiel, et les records publics portent sur des modules de l'ordre de 800 bits — d'où les recommandations de 2048 bits au minimum, 3072 ou 4096 pour du long terme. Ce que l'on ne sait pas: il n'est pas démontré que factoriser soit difficile, ni que casser RSA exige de factoriser; la sécurité repose donc sur deux conjectures. La factorisation (version décision) est dans et n'est pas connue -complète, de sorte que même ne fonderait pas RSA — la cryptographie a besoin de difficulté en moyenne, pas dans le pire cas. L'algorithme de Shor factorise en temps polynomial sur un calculateur quantique de taille suffisante, ce qui motive la cryptographie post-quantique. Enfin le RSA scolaire ne doit jamais être utilisé tel quel: déterministe et algébriquement manipulable, il exige un remplissage aléatoire normalisé; et comme il est lent, on s'en sert pour transporter une clef symétrique, jamais pour chiffrer des données.
Fonction de hachage cryptographique: une empreinte de bits, calculable rapidement, avec trois propriétés distinctes — résistance à la préimage (trouver tel que ), à la seconde préimage ( de même empreinte, subi) et aux (un couple quelconque, les deux messages choisis), la troisième étant strictement plus forte. Les collisions nécessairement, par le principe des tiroirs; ce qu'on demande est l'infaisabilité pratique.
Borne des anniversaires (théorème 9.6, relation (9.13)), avec . Conséquence brutale: la résistance aux collisions d'une empreinte de bits ne vaut que . Une empreinte de 64 bits cède à milliards d'essais; 128 bits n'en offrent qu'environ 64 (); 160 bits en offrent 80; SHA-256 en offre 128, le même ordre qu'une clef AES-128. : changer un caractère change environ la moitié des bits — sur les deux phrases du cours, 121 bits sur 256, soit .
Usages. Intégrité: comparer à une référence authentique — une empreinte publiée sur la même page que le fichier ne protège que contre les erreurs de transmission. Mots de passe: on stocke l'empreinte, avec un sel distinct par utilisateur (deux mots de passe identiques donnent alors deux empreintes différentes, et les tables précalculées deviennent inutiles) et une fonction délibérément lente — une fonction rapide est une qualité pour l'intégrité et un défaut pour les mots de passe. Signatures: on signe l'empreinte, jamais le message.
Signature numérique, qui exploite la symétrie . On signe l'empreinte pour deux raisons: un message plus long que le module ne peut pas être élevé à une puissance en une fois, et une exponentiation sur 2048 bits est bien plus lente qu'un hachage. Une signature valide prouve choses: l'intégrité, le fait que le signataire détenait la clef privée associée à , et la (contrairement à un code d'authentification à clef partagée, que les deux parties peuvent fabriquer). Elle dit qui est le signataire — c'est le rôle du et de la chaîne d'autorités —, ni (il faut un horodatage), ni que la clef n'a pas été volée (d'où révocation, durée de validité, stockage matériel), ni que le signataire a compris ce qu'il signait.
Là où les systèmes cassent vraiment, et ce n'est presque jamais la cryptanalyse: les clefs (générateur faible, clef dans un dépôt de code, jamais renouvelée), les implémentations (canal auxiliaire par le temps ou la consommation, erreur mémoire, bibliothèque obsolète), les protocoles (composition non sûre de briques sûres, négociation vers une version affaiblie, message d'erreur qui renseigne l'adversaire), les personnes. La question utile n'est presque jamais «quel algorithme?» mais «d'où vient cette clef, qui y a accès, comment sait-on que cette clef publique est la bonne, et que se passe-t-il quand quelque chose échoue?».
Chapitre 10 – Réseaux et communication
Commutation de circuits: on réserve à l'avance une part fixe de capacité sur chaque lien, garantie et inutilisable par les autres, la communication étant refusée si la réservation ne peut être honorée. Commutation de paquets: aucune réservation, le message est découpé en paquets portant chacun l'adresse de destination, transmis quand le lien est libre et mis en file sinon, sans aucun état par communication. Sur un lien de 1 Mb/s desservant des usagers à 100 kb/s actifs 10 % du temps (hypothèse de travail, pas une mesure), le circuit admet 10 usagers; le paquet en admet 35, saturé avec la probabilité pour , soit du temps. — et l'hypothèse d'indépendance est fausse dès qu'un événement synchronise les usagers. Prix des paquets: (la gigue), (une file finie déborde, et c'est le mode normal de signalisation de la saturation), . Le réseau a été rendu simple et non fiable pour pouvoir être grand, la fiabilité étant repoussée aux extrémités.
Pile TCP/IP, quatre couches, chacune rendant un service à celle du dessus en n'utilisant que celui du dessous:
| Couche | Rôle | Unité | Exemples | Adresse |
|---|---|---|---|---|
| Application | ce que l'usager veut faire | message | HTTP, DNS, SMTP | nom de domaine |
| Transport | de processus à processus | segment, datagramme | TCP, UDP | numéro de port |
| Réseau | d'hôte à hôte | paquet | IP | adresse IP |
| Liaison | d'un équipement au suivant | trame | Ethernet, Wi-Fi | adresse MAC |
IP est la couche étroite: tout ce qui est au-dessus doit fonctionner sur IP, tout ce qui est en dessous doit porter IP, et ce goulet unique rend le réseau universel.
Surcharge d'encapsulation (10.1), en octets. C'est une constante, indépendante de la charge utile: pour un segment plein de octets (trame de octets, la MTU d'Ethernet plus l'en-tête de liaison), pour 512 octets, pour 100, pour 40, et pour un seul octet ( et en comptant le préambule et l'intervalle inter-trames). En IPv6 l'en-tête réseau passe de 20 à , donc et — un peu de débit échangé contre un en-tête de longueur fixe, sans somme de contrôle ni fragmentation, que le routeur lit sans rien analyser. , et il n'y a aucun intérêt à comprimer 60 octets en 40 si l'on paie 58 octets d'en-têtes dans les deux cas.
Espaces d'adressage IPv4 et IPv6. Ce n'est pas «quatre fois plus»: l'adresse est quatre fois plus longue en bits, et chaque bit double l'espace — la même confusion entre la longueur d'une représentation et la taille de ce qu'elle représente que le chapitre 1 signalait pour les entiers et le chapitre 9 pour les clefs. Une adresse se lit en préfixe de réseau plus identifiant d'hôte, notation CIDR a.b.c.d/n; un /24 offre adresses dont 254 attribuables, un /26 en offre 64 dont 62. Le NAT ne crée aucune adresse: il supprime l'adressabilité des machines internes, borne le multiplexage au nombre de ports et réintroduit dans le routeur un état par connexion — ce que la commutation de paquets avait éliminé. Un port est un entier de 16 bits, donc valeurs par protocole et par adresse; le quadruplet (adresse source, port source, adresse destination, port destination) identifie une connexion. Le DNS résout les noms par délégation, chaque niveau ne connaissant que le suivant, avec mise en cache et durée de vie.
Transmission de proche en proche: chaque routeur lit l'adresse de destination, cherche dans sa table le préfixe le plus long qui la contient, émet sur l'interface correspondante, et oublie le paquet. La route complète n'existe dans aucune table: elle est la composition des décisions locales. Trois conséquences: aucune mémoire de la communication (d'où le déséquencement); une boucle est possible, et c'est le champ TTL sur 8 bits, décrémenté à chaque saut, qui la borne à 255 sauts (un compteur de sauts, pas une durée); et IP n'offre qu'un service au mieux. Les tables sont construites par des protocoles à vecteur de distance, à état de liens (chacun diffuse l'état de ses liens et calcule localement un arbre de plus courts chemins, par Dijkstra) ou, entre domaines administratifs, à vecteur de chemin, où le critère n'est plus le coût mais la politique.
TCP offre un flux d'octets fiable, ordonné et sans duplication sur un réseau qui n'offre aucune des trois, par quatre mécanismes: numéro de séquence, acquittement (le récepteur annonce le prochain octet attendu), retransmission sur expiration d'un délai mesuré en continu, et fenêtre glissante bornant les octets en vol.
Produit débit-délai (10.2): le nombre de bits pouvant se trouver simultanément sur le chemin. Une fenêtre inférieure au BDP plafonne le débit à . Le champ «fenêtre» de l'en-tête TCP fait 16 bits, donc au plus octets sans extension: Mb/s sur un aller-retour de 160 ms, Mb/s sur 30 ms, Mb/s sur 2 ms. Le même protocole, sur le même matériel, atteint deux débits séparés d'un facteur 80 selon la distance. D'où l'option d'extension de fenêtre.
Le contrôle de congestion ajoute une seconde fenêtre, estimée par l'émetteur seul, les octets en vol étant bornés par le minimum des deux; principe d'augmentation additive, diminution multiplicative. La capacité du chemin se découvre, elle ne se connaît pas: aucun service ne la donne, le chemin traverse des équipements de plusieurs organisations et le réseau n'a aucun état à consulter. TCP sonde, interprète une perte comme «c'était trop», recule et remonte. Le démarrage lent double la fenêtre à chaque aller-retour — croissance exponentielle, donc rapide; le nom compare au fait de commencer d'emblée à pleine vitesse. À 100 Mb/s et 160 ms, en partant de dix segments de octets, il faut allers-retours, soit ms, avant d'atteindre le débit du lien.
UDP ajoute à IP le strict minimum — ports, longueur, somme de contrôle — en 8 octets d'en-tête contre 20 pour TCP. Ce n'est pas «TCP en moins bien»: il est le bon choix quand une donnée en retard est inutile (retransmettre un échantillon vocal périmé n'a aucun sens, et la fiabilité de TCP nuit alors par le blocage de tête de file), quand l'échange tient en un aller-retour (requête DNS), et quand on veut construire sa propre fiabilité — le choix de QUIC, sur lequel repose HTTP/3.
Les quatre délais. Le dernier bit arrive à , et les deux termes ne réagissent pas aux mêmes paramètres: doubler le débit divise par deux et ne touche pas à . Dans une fibre, m/s (indice ), et non . : Lausanne–Zurich, 200 km, ms et ms; satellite géostationnaire à km, ms.
En stockage et retransmission, un routeur attend le dernier bit et vérifie le CRC avant de réémettre: chaque lien coûte . Pour un paquet de octets à 100 Mb/s sur quatre liens de 50 km, µs, µs et µs. Le découpage rend le possible:
Trois paquets sur quatre liens coûtent µs, soit 240 µs de plus qu'un seul; les mêmes octets en un paquet coûtent µs, un gros paquet payant son temps d'émission quatre fois sans recouvrement. À mettre en balance avec les 58 octets d'en-têtes payés trois fois.
Loi du transfert (théorème 10.1, relations (10.3) et (10.4)): en octets, en b/s, la latence constante. Le gain d'un doublement du débit croît de 0 à sans jamais atteindre , puisque .
Taille de bascule (10.5): en dessous, le transfert est limité par la latence; au-dessus, par le débit. Et à la taille de bascule, doubler le débit fait gagner exactement 25 % — le repère est quantitatif, pas qualitatif. Exemples: ko à 10 Mb/s et 160 ms; octets à 10 Mb/s sur Lausanne–Zurich; ko par satellite géostationnaire. Plus la latence est grande, plus il faut de gros fichiers pour que le débit compte. À ms, Mb/s contre Mb/s:
| Taille | à 10 Mb/s | à 20 Mb/s | Gain du doublement |
|---|---|---|---|
| 1 ko | ms | ms | |
| 100 ko | ms | ms |
Plus de débit ne réduit pas la latence, pour trois raisons. Dimensionnellement: n'apparaît pas dans le terme de (10.3), donc et jamais 0. Physiquement: la latence est une distance divisée par une vitesse bornée par celle de la lumière. Pratiquement: l'essentiel du temps d'affichage d'une page est fait d'allers-retours. Les seules manières de la réduire sont de réduire la distance ou le nombre d'allers-retours.
Chargement d'une page, en allers-retours: DNS (1 avec un cache chaud, jusqu'à 3 de plus sinon), poignée de main TCP en trois temps (1), négociation TLS 1.3 (1; deux avec les versions antérieures), requête HTTP (1), puis réception au débit du chemin, modulo le démarrage lent. Soit quatre allers-retours avant le premier octet utile: ms sur Lausanne–Zurich, ms à km, ms à km, s par satellite géostationnaire. Sur une page de 2 Mo à km et 100 Mb/s, s, dont : passer à 1 Gb/s fait gagner , tandis que . D'où les quatre leviers: (HTTP/1.1, HTTP/2 et son multiplexage), (QUIC: un aller-retour, voire zéro en reprise), — la seule optimisation qui agisse sur la physique — et , sachant que sur un petit fichier supprimer une requête vaut bien plus que comprimer le contenu.
Enfin, chaque trame Ethernet se termine par un CRC sur 32 bits, celui du chapitre 8, mais ce contrôle est local à un lien et refait à neuf sur chaque saut, d'où la somme de contrôle de bout en bout de TCP, plus faible et mieux placée: c'est le principe de bout en bout, une garantie ne vaut que fournie là où le besoin existe.
Références
- Abelson, H., Ledeen, K. et Lewis, H., Blown to Bits, Addison-Wesley, Boston — vue d'ensemble, sans formalisme, des thèmes des chapitres 1, 6, 7 et 9.
- Cormen, T. H., Leiserson, C. E., Rivest, R. L. et Stein, C., Introduction to Algorithms, MIT Press, Cambridge — l'annexe et les fins de chapitre rassemblent les récurrences, le théorème maître et les coûts des structures de données des chapitres 2 à 4.
- MacKay, D. J. C., Information Theory, Inference and Learning Algorithms, Cambridge University Press (librement disponible en ligne) — formulaire d'entropie, de codage de source et de codage de canal pour les chapitres 6 à 8.
- Cover, T. M. et Thomas, J. A., Elements of Information Theory, 2e éd., Wiley, Hoboken — tables d'identités entropiques et de bornes de codage.
- Sipser, M., Introduction to the Theory of Computation, Cengage, Boston — récapitulatifs de fin de chapitre pour les machines de Turing, l'indécidabilité et la NP-complétude du chapitre 5.
- Katz, J. et Lindell, Y., Introduction to Modern Cryptography, 3e éd., CRC Press, Boca Raton — définitions et bornes du chapitre 9, énoncées avec la rigueur qui manque aux formulaires courants.
- Kurose, J. F. et Ross, K. W., Computer Networking: A Top-Down Approach, Pearson — formules de délai, de produit débit-délai et de surcharge d'encapsulation du chapitre 10.
- Polycopiés du cours ICC de l'EPFL.