Que de chiffres !

Dans un texte, dans un mot, on voit facilement si l'orthographe est correcte. Par contre lorsqu'on nous communique un nombre, comment vérifier qu'il n'y a pas d'erreur ? Et comme les nombres envahissent notre vie...

Quelles sont les erreurs les plus courantes que nous pouvons faire lorsque nous transmettons un nombre:

  • transmettre un chiffre erroné
  • intervertir deux chiffres (la plupart du temps consécutifs)
  • transmettre un chiffre "illisible"

Il s'agit de détecter une erreur possible; les méthodes de vérification devront donc essentiellement tenir compte de ces deux types d'erreur. Elles sont généralement basées sur le calcul d'un reste d'une division par un nombre N astucieusement choisi.

Les comptes en banque

La vérification se fait en calculant le reste d'une division par un nombre \(N\). Les erreurs les plus fréquentes sont soit un chiffre erroné, soit l'interversion de deux chiffres. S'il y a erreur sur un chiffre la différence entre la valeur correcte et la valeur erronée sera \(10^n(a-b)\), où \(a\) représente le chiffre correct et \(b\) le chiffre erroné. Par conséquent on doit éviter de choisir \(N\) multiple de \(a-b\) ou N diviseur de \(10^n\). Si on a interverti deux chiffres \(a\) et \(b\), la différence entre le nombre exact et le nombre erroné vaudra \((a.10^n+b.10^m)-(b.10^n+a.10^m)\). Cette différence vaut \(10^m.(a-b).(10^{n-m}-1)\). Il faudra donc, pour le choix de N, éviter un nombre inférieur ou égal à 10 ou un diviseur de 9, 99, 999,....

Le plus sur est de prendre \(N\) un nombre premier supérieur à \(10\). En pratique on estime qu'on peut choisir \(N\) plus petit que \(100\) et on prend \(N=97\). Le nombre formé par les deux derniers chiffres est donc le reste de la division par \(97\), avec toutefois une exception ! Si le reste est nul (on a encore toujours peur du zéro , voyez les ascenseurs...) on le remplace par \(97\).

Comme vérification, prenons le compte \(001-0314779-90\). Le résultat de la division de \(0010314779\) par \(97\) vaut \(106337 (106337*97 = 10314689)\), et le reste vaut bien \(90\). Le numéro est correct (c'est le mien, vous y versez ce que vous voulez !)

On a récemment introduit l' IBAN (International Bank Account number). On espérait enfin voir une vraie uniformisation des comptes bancaires avec un système de contrôle simple. Malheureusement, ce n'est pas le cas et chaque pays a adopté sa propre structure. Comment est construit cet IBAN ? Il se compose d'abord de 4 caractères: 2 lettres (la codification ISO du pays, BE=Belgique, FR=France, CH=Suisse,...) suivies de 2 chiffres qui constituent le contrôle. On poursuit avec l'identification de l'établissement financier (caractères alpha-numériques) suivi du BAN (Bank Account number).

Pour fixer les idées, mon ancien numéro de compte figure plus haut: 001-0314779-90. Je suis belge (code \(BE\)); mon établissement financier est codé 001. Comment, à partir de ces données, reconstituer l'IBAN ?

On écrit \(BE00\) (le code pays suivi de \(2\) zéros) puis le code de l'établissement financier suivi du numéro de compte, ce qui donne:

\[ BE00001031477990 \]

Il reste à calculer les deux chiffres de contrôle figurant après le code pays. Pour cela on transpose les 4 premiers caractères vers la fin, ce qui donne:

\[ 001031477990BE00 \]

Malheureusement figurent des lettres (dans le code pays et parfois dans le numéro de compte bancaire). On les remplace avec la règle A=10, B=11, C=12,....Z=35. Cela nous donne:

\[ 001031477990111400 \]

Ensuite on effectue, comme anciennement une division par \(97\). Le contrôle sera égal à \(98\) moins le reste de cette division entière.

Dans l'exemple le quotient entier vaut \(10633793712488\) et le reste vaut \(64\). En effet \(10633793712488*97 = 1031477990111336\). Le contrôle est la différence entre \(98\) et ce reste, c'est-à-dire \(34\). Mon IBAN est donc:

\[ BE34001031477990 \]

Pour plus de facilités, cet IBAN est décomposé en tranches de 4 caractères, c'est-à-dire :

\[ BE34-0010-3147-7990 \]

Ouf ! Voilà pour les lecteurs de l'étranger !

L'ISBN

Actuellement tous les livres possèdent un numéro d'identification de \(10\) caractères appelé ISBN (International Standard Book Number); pour les périodiques il s'agit d'un nombre de 8 caractères appelé ISSN (International Standard Serial Number). Là encore le dernier caractère est présent afin de vérifier la validité des précédents.

De même que pour les comptes en banque on veut éviter les erreurs les plus courantes.

La méthode utilisée ici consiste à multiplier le premier chiffre (en partant de la droite) par \(1\), le deuxième chiffre par \(2\), le troisième par \(3\), le quatrième par \(4...\) et d'en faire la somme. Plus formellement si les chiffres, en partant de la droite, sont désignés par \(a_1, a_2, a_3,...\) on effectue la somme \(\Sigma_{k=1}^n k.a_ k\) (depuis \(k=1\) jusqu'à \(k=n\) avec \(n=10\) ou \(8\))), et le contrôle s'effectuera en calculant le reste de la division de cette somme par \(N\). Si on commet un erreur sur un chiffre (p.ex. le chiffre \(a_k\)), le résultat de la somme sera affecté d'une erreur multiple de \(k\) fois la différence entre le chiffre correct et le chiffre erroné. Si on a par erreur permuté deux chiffres (p.ex. \(a_k\) et \(a_l\)), là encore le résultat sera affecté d'une erreur produit de la différence \((k-l)(a_k-a_l)\), c'est-à-dire un produit de deux facteurs inférieurs à \(10\).

Il suffit donc de choisir pour \(N\) un nombre premier supérieur à \(9\). Mais comme on n'autorise qu'un chiffre de contrôle, il faudrait prendre le reste de la division par un nombre au plus égal à \(10\). Cela ne permet pas de satisfaire aux exigences. L'astuce consiste à choisir comme diviseur \(N=11\). Mais au cas où il faudrait prendre \(10\) comme dernier chiffre, on se souvient que \(10\) s'écrit \(X\) en chiffres romains.

On voit ainsi que le dernier chiffre (contrôle) se calcule à partir des \(9\) (ou \(7\)) précédents: on part du fait que \(\Sigma{k.a_k}\) est un multiple de \(11\); on en déduit que \(a_1\) est le naturel inférieur à \(11\) qu'il faut ajouter à \Sigma^{k.a_k}\), \(k\) variant de \(2\) à \(10\) (ou \(8\)), pour obtenir un multiple de \(11\).

Le chiffre de contrôle, dernier chiffre de l'ISBN (ou de l'ISSN), peut donc varier de \(0\) à \(10\) (noté \(X\)).

A titre d'exemple vérifions que l'ISBN \(2-87262137-7\) est correct. On calcule \(1.7+2.7+3.3+4.1+5.2+6.6+7.2+8.7+9.8+10.2=242\) qui est bien divisible par \(11\). L'ISBN est donc exact (sous réserves qu'il n'y ait pas eu d'erreurs autres que celles prévues).

Les Codes à barres

Il existe différents types de cades à barres. Nous décrirons celui couramment utilisé dans le commerce (EAN-\(8\) ou EAN-\(13\)) EAN sont les initiales de "European Article Numbering". La méthode de contrôle est bien plus élémentaire. Pour les codes EAN-\(8\), on calcule la somme \(P\) des chiffres de rang pair et celle \(I\) des chiffres de rang impair. On effectue \(P+3*I\) et on doit obtenir un multiple de 10.

Pour les codes EAN-\(13\), le premier chiffre sert de contrôle, pour les \(12\) suivants on calcule les sommes \(I\) et \(P\); le chiffre contrôle est le chiffre qui ajouté à \(P+3*I\) donne un multiple de \(10\).

Ce type de contrôle ne permet que la détection d'un chiffre erroné; toutefois il permet de reconstituer un chiffre effacé (ou mal lu). La fiabilité est obtenue en codant astucieusement les chiffres par des traits. Ceux-ci sont obtenus en sélectionnant des barres dans un ensemble de largeur \(7\) (p.ex. une barre noire de largeur \(2\), une blanche de largeur \(3\), une noire de largeur \(1\) et une blanche de largeur \(1\)). On distingue sur les étiquettes deux types d'information: le producteur et le produit. Pour le codage EAN-\(8\), les chiffres producteur-produit (\(4\) chiffres chacun) sont codés de manière complémentaire. Pour le codage EAN-\(13\) (préfixe \(2\) chiffres - producteur \(5\) chiffres - produit \(5\) chiffres et \(1\) chiffre contrôle) il existe un codage inverse pour le producteur mais nous n'entrerons pas dans ces détails.

Codage producteur Codage produit

Pourquoi une largeur \(7\) ? A la lecture une erreur peut se produire; nous devons coder 2 fois 10 chiffres (producteur et produit); si on choisit une largeur \(n\), une lecture correcte ou affectée d'une simple erreur donne lieu à \(n+1\) possibilités. On choisit \(n\) le plus petit possible mais permettant la détection d'une erreur. Les 20 "mots" du code doivent tous être à distance au moins égale à 2 (voir codes détecteurs ). De plus on souhaite commencer (ou terminer) le codage de chaque chiffre par un blanc. Il n'est alors pas difficile de voir que la meilleure valeur de \(n\) vaut \(7\). Le choix du codage des chiffres, renforcé par l'existence d'un contrôle, permet alors une très grande fiabilité dans la lecture des codes à barres.

Testons le code \(5400-4207\) (EAN-\(8\)); \(\small I=5+0+4+0=9, P=4+0+2+7=13\); on a \(\small 3*I+P=27+13=40\) ce qui est bien un multiple de \(10\).

Prenons à présent les codes à \(13\) chiffres (EAN-\(13\)). Le code \(5-410013-100003\) est-il correct ? \(\small I=4+0+1+1+0+0=6, P=1+0+3+0+0+3=7\); on a \(\small 3.I+P=18+7=25,\) il faut donc ajouter 5 pour obtenir un multiple de 10; ce chiffre est placé en tête du code. Prenons le code \(x-379671-182511\) ; \(x\) est le chiffre contrôle supposé inconnu. On a \(\small I=3+9+7+1+2+1=23,~~ P=7+6+1+8+5+1=28\); on a \(\small 3*I+P=69+28=97\); le contrôle est donc \(3\) : le code à barres complet est \(3-379671-182511\). Vérifions enfin le code \(8-076800-3769x9\) (\(x\) est supposé être un chiffre illisible). On vérifie que \(\small I=15+x\) et \(\small P=40\) ; on a \(\small 3*I+P=45+3*x+40=85+3.x\); le contrôle vaut \(8\). Il faut donc que \(\small 85+3*x+8=93+3.x\) soit multiple de \(\small 10\); par conséquent \(\small 3*x\) se termine par \(\small 7\) et vaut \(\small 27\). On détermine ainsi le chiffre manquant \(x\) qui vaut \(9\). Le code correct est donc \(8-076800-376999\)

Pas la peine de calculer tout cela ; le scanner du magasin fait tout cela en une fraction de milliseconde. Évidemment, il a de l'entraînement...