Tables de hashcode Applications des congruences Supposons que l’on désire associer chaque numéro de carte d’étudiant (par exemple avec 9 chiffres) une clé unique entre 0 et m−1. Une première idée consiste à utiliser la fonction définie par : h(k) ≡ k Michel Van Caneghem (mod m) Regardons comment m doit être choisi : ✔ pas une puissance de 10, ✔ pas un nombre qui divise bk +a Ex : 1000−1 ≡ 0 (mod 111) Février 2003 Il vaut mieux choisir pour m un nombre premier voisin de l’espace mémoire disponible (Ex : si il y 5000 cases pour 2000 étudiants on peut choisir m = 4969) c Turing : des codes secrets aux machines universelles #4 2003 MVC c Turing : des codes secrets aux machines universelles #4 2003 MVC 1 Tables de hashcode (2) Tables de hashcode (3) Il faut cependant résoudre le problème des collisions Les collisions peuvent être résolues ou bien par une liste chainée, ou bien on prend la première case libre en suivant, ou bien on utilise une série de fonction de hash-code secondaires. On choisit m tel que m − 2 soit aussi premier : g(k) ≡ k + 1 (mod m − 2) On va alors chercher les conditions pour une double collision : h1(k1) = h1(k2) et h2(k1) = h2(k2) On obtient alors : k1 ≡ k2 (mod m − 2) hj (k) ≡ h(k) + jg(k) (mod m) k h(k) h1(k) h2(k) 344 401 659 269 325 510 778 1526 329 938 157 1526 1742 132 489 973 1526 1742 1958 c Turing : des codes secrets aux machines universelles #4 2003 MVC puis : k1 ≡ k2 (mod m) ce qui donne : k1 ≡ k2 (mod m(m − 2)) Ce qui est rare et même impossible si : m(m − 2) > k Ex : 4969 × 4967 = 24681023. 2 c Turing : des codes secrets aux machines universelles #4 2003 MVC 3 Suites pseudo aléatoires Suites pseudo aléatoires (2) Pour engendrer des nombres pseudo aléatoires une bonne méthode consiste à trouver des suites de grande période. On peut avoir des congruences plus simples si m est premier. x0 = generateur xn+1 = axn (mod m) Un des moyens les plus simple consiste à utiliser des congruences linéaires : x0 = generateur xn+1 = axn + c (mod m) Cette congruence produit une suite de période m si et seulement si : ✭ c∧m=1 ✭ a ≡ 1 (mod p) pour tout p premiers qui divise m ✭ a ≡ 1 (mod 4) si 4 divise m x0 = 8 xn+1 = 11xn + 13 La solution est alors de la forme xn = anx0 (mod m) . Pour que ai engendre tous les nombres de 0 à m − 1 il faut que a soit une racine primitive de m. Si d est un diviseur de m − 1 alors a est une racine primitive si : a(m−1)/d 6≡ 1 (mod m) (mod 25) c Turing : des codes secrets aux machines universelles #4 2003 MVC 4 c Turing : des codes secrets aux machines universelles #4 2003 MVC 5 Suites pseudo aléatoires (3) Suites pseudo aléatoires (4) Montrons que 2 est une racine primitive de 19. 19 − 1 = 18 = 2 × 32 ❖ 218/2 ≡ 29 ≡ 56 ≡ 18 6≡ 1 (mod 19) ❖ 218/3 ≡ 26 ≡ 64 ≡ 7 6≡ 1 (mod 19) ❖ 218/6 ≡ 23 ≡ 8 6≡ 1 (mod 19) ❖ 218/9 ≡ 22 ≡ 4 6≡ 1 (mod 19) Voici une suite utilisable de période M31 = 231 − 1 = 2147483647 Ce nombre le 31ème de Mersenne est premier et est aussi le plus grand entier signé sur 32 bits. On peut montrer que 7 (en fait 75 = 16807) est une racine primitive de M31 M31 − 1 = 2 × 32 × 7 × 11 × 31 × 151 × 331 x0 = 1 xn+1 ≡ 2xn (mod 19) et voici la suite produite : x0 = seed 1, 2, 4, 8, 16, 13, 7, 14, 9, 18, 17, 15, 11, 3, 6, 12, 5, 10, 1 (mod 2147483647) Il y a d’autres générateurs de plus grande périodes construits avec des registres à décalage. mais pour 5 on obtient : 1, 5, 6, 11, 17, 9, 7, 16, 4, 1 c Turing : des codes secrets aux machines universelles #4 2003 MVC xn+1 ≡ 16807xn 6 c Turing : des codes secrets aux machines universelles #4 2003 MVC 7 Les codes correcteurs d’erreurs Les codes correcteurs d’erreurs (2) On fait des erreurs quand on utilise un canal de transmission avec du bruit. On dispose d’une procédure qui permet de vérifier si un mot parmi le 2k mots possibles est valide : code detecteurs d’erreurs. Si le code est bien construit, on peut remplacer un mot contenant une erreur, par un mot correct voisin : code correcteurs d’erreurs. On construit de tels codes en utilisant les corps finis et beaucoup de Mathématiques en plus ! ! ! ➤ Ligne de transmission (téléphone, radio, parole,...) ➤ Transcription (papier, support magnétique,...) Théorème de Shanon : On peut toujours réduire le débit d’information pour diminuer le taux d’erreurs. Pour représenter de l’information, on la code. Pour détecter ou corriger des erreurs, il faut augmenter la redondance du code. En général on travaille sur des codes binaires qui ont comme taille k bits et qui peuvent représenter M informations (mots du code). M << 2k . c Turing : des codes secrets aux machines universelles #4 2003 MVC 8 ✧ Codes linéaires, codes cycliques ; ✧ Utilisés dans tous les disques dur CRC ; ✧ Utilisé dans les CD-Audio et CD-ROM, l’information codé est pratiquement le double de l’information utile. On fait toujours des erreurs quand on lit un CD ! ! ! ; c Turing : des codes secrets aux machines universelles #4 2003 MVC 9 La carte d’étudiant La carte d’étudiant (2) On veut savoir s’il y a eu une mauvaise transcription d’un numéro de carte d’étudiant. Détecte une erreur simple : Si c = (c8, . . . , c1) est correct P8 alors i=1 ici ≡ 0 (mod 11). Supposons une erreur sur le chiffre i alors c0 = (c8, . . . , c0i, . . . , c1), on a : 9 6 2 3 1 8 1 E c8 c7 c6 c5 c4 c3 c2 c1 8 X c1 est la clé. Sa valeur est choisie de telle manière que : A→1 F →6 B→2 G→7 8 X ici ≡ 0 (mod 11) C→3 H→8 i=1 D→4 J →9 E → 5 K → 10 i=1 8 X ici + i(c0i − ci) ≡ i(c0i − ci)6≡ 0 (mod 11) i=1 Détecte une permutation de 2 chiffres : Avec les mêmes notations c0i = cj et c0j = ci 8 X 8 × 9 + 7 × 6 + 6 × 2 + 5 × 3 + 4 × 1 + 3 × 8 + 2 × 1 + 1 × 5 = 176 c Turing : des codes secrets aux machines universelles #4 2003 MVC ic0i ≡ 10 ic0i ≡ i(cj − ci) + i(ci − cj ) ≡ (cj − ci)(i − j)6≡ 0 (mod 11) i=1 c Turing : des codes secrets aux machines universelles #4 2003 MVC 11 Le code ISBN La carte d’étudiant (3) c’est à dire que le troisième chiffre est effacé. Alors : C’est un code à dix chiffres pour tous les livres : International Standard Book Number. Par exemple le livre : Méthodes Mathématiques pour l’Informatique 2 04 018617 4 Langue Editeur No du livre clé 8 × 9 + 7 × 6 + 6 × x + 5 × 3 + 4 × 1 + 3 × 8 + 2 × 1 + 1 × 5 = 164 + 6x Si c = (c1, c2, . . . , c10) alors Corrige une erreur en position connue : Si l’on a c = 96x3181E 10 X Pour que le code soit valide : 164 + 6x ≡ 0 (mod 11) 6x ≡ 1 x ≡ 6−1 ≡ 2 (mod 11) c Turing : des codes secrets aux machines universelles #4 2003 MVC ici ≡ 0 (mod 11) i=1 (mod 11) Attention si on doit noter 10 on le représente par X. Par exemple : L’anatomie de Prolog : ISBN 2 7296 0149X. 12 c Turing : des codes secrets aux machines universelles #4 2003 MVC 13 Le code de la Sécurité Sociale Le code du RIB C’est un nombre N ss de 13 chiffres avec une clé de vérification qui est un nombre deux chiffres. Il s’agit de la clé utilisé dans tous les numéros de comptes bancaire. Voici la structure du code RIB : 30004 00703 0000xxxxxxx 94 Banque Guichet Numéro de compte clé RIB 1 xx 07 75 114524 84 Sexe Année Mois Départ. No registre clé N ss + Cle ≡ 0 (mod 97) Pour calculer cette clé avec une calculatrice, il faut couper le nombre N ss en deux. On a : 1000000 ≡ 27 c Turing : des codes secrets aux machines universelles #4 2003 MVC Ce code est considéré comme un nombre N c de 23 chiffres dont les deux derniers chiffres sont la clé RIB qui est tel que : N c ≡ 0 (mod 97) Attention, c’est légèrement différent du code de la Sécurité Sociale. (mod 97) 14 c Turing : des codes secrets aux machines universelles #4 2003 MVC 15 Un code décimal correcteur d’erreurs Un code décimal correcteur d’erreurs (2) Considérons un code sur 10 chiffres décimaux. Soit x = (x1, x2, . . . , x10) un mot de code, tel que : 10 10 X X xi ≡ 0 (mod 11) ixi ≡ 0 (mod 11) i=1 i=1 On peut montrer que ce code contient 82644629 mots possibles. On peut donc imaginer des numéros de téléphone Correction d’erreurs : Une erreur en j d’écart k 10 X i=1 y = (x1, x2, . . . , xj + k, . . . , x10) 10 X yi ≡ k (mod 11) iyi ≡ jk (mod 11) Voyons un exemple : y = 0610271355 10 10 X X yi ≡ 8 (mod 11) iyi ≡ 6 i=1 (mod 11) i=1 On a donc k = 8 et jk = 6 d’ou j = 9 0 6 1 0 2 7 1 3 5 5 3 0 6 1 0 2 7 1 3 8 5 Le numéro correct était donc : y = 0610271385 i=1 c Turing : des codes secrets aux machines universelles #4 2003 MVC 16 c Turing : des codes secrets aux machines universelles #4 2003 MVC 17