Applications des congruences

publicité
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
Téléchargement