Les nombres en toutes lettres : Explication des algorithmes

Introduction

   Telle que nous la concevons, l'équivalence entre les représentations en chiffres et en lettres passe par une expression arithmétique intermédiaire. Par exemple, pour comprendre le lien entre « 17532 » et « dix-sept mille cinq cent trente-deux », il faut passer par l'équation 17532=(10+7)*1000+5*100+30+2. Pour bien vous en rendre compte, lisez sans respirer la liste des nombres apparaissant dans la partie droite de l'équation : 10-7-1000-5-100-30-2. Ça marche !

   Une fois que l'on a admis cela, pour traduire les nombres de chiffres en lettres ou l'inverse, il n'y a plus qu'à retrouver l'expression arithmétique cachée. Ce n'est pas très compliqué. Voici comment je propose de le faire.

Des chiffres vers les lettres

   La traduction des chiffres en lettres se compose de trois phases : la décomposition arithmétique, la simplification et la verbalisation. La décomposition arithmétique permet de retrouver l'expression sous-entendue. Cette expression n'est pas utilisée telle quelle, elle doit d'abord suivre une simplification en grande partie due à l'usage. Une fois cette simplification effectuée, il n'y a plus qu'à l'expression arithmétique traduire en lettres. Pour cela on oublie les symboles «+», «*», «(» et «)» et on traduit mot à mot en ajoutant quelques liaisons syntaxiques.

La décomposition arithmétique

   La décomposition en une expression arithmétique et sujet à variations mais suit toujours le même principe. Il s'agit de faire une division euclidienne par un nombre pivot puis de recommencer la décomposition sur le quotient et le reste avec un nombre pivot plus petit. Les nombres pivots sont (à part 20) des puissances de dix : dans l'ordre 109, 106, 103, 100, 20 et 10. Remarquons que l'usage du 20 comme pivot (pour quatre-vingts par exemple) diffère suivant les pays. Je suppose, sans aucune certitude, que cette décomposition en vingtaines est due à l'ancienne façon de compter la monnaie quand 1 franc valait 20 sous. Si quelqu'un possède des informations précises permettant d'infirmer ou confirmer cette hypothèse, elles m'intéressent beaucoup.

La décomposition arithmétique
dec(n) -->
si 109<=n
dec(n/109) * 109 + dec(n%109)
dec(n) -->
si 106<=n
dec(n/106) * 106 + dec(n%106)
dec(n) -->
si 103<=n
dec(n/103) * 103 + dec(n%103)
dec(n) -->
si 100<=n
dec(n/100) * 100 + dec(n%100)
dec(n) -->
en Belgique :
si 80<=n<90
ou en France :
si 60<=n<100
dec(n/20) * 20 + dec(n%20)
dec(n) -->
en Suisse :
si 10<n<100
en Belgique :
si 10<n<80 ou 90<=n<100
en France :
si 10<=n<60
dec(n/10) * 10 + dec(n%10)
dec(n) --> n

   Avant de continuer, voici quelques explications sur cette définition. Ce tableau représente la définition récursive de la fonction dec. Les lignes sont à lire de haut en bas, chacune représente une règle de calcul de cette fonction. Le première règle dont la condition de garde est vérifiée doit être appliquée. Par exemple la première règle peut se paraphraser comme « si n est supérieur à 109 alors, la valeur de la fonction est l'expression arithmétique composée par le produit de dec(n/109) par 109 plus dec(n%109) ».

   Regardons pas à pas l'exécution de cette fonction sur un exemple. Les nombres en gras indiquent là où il y a un calcul à effectuer.

   On remarquera que le résultat de toutes les expressions arithmétiques affichées est toujours 200532.

La simplification

   Une fois cette décomposition faite, on simplifie l'expression. Cette simplification comprend une simplification mathématique évidente (on supprime les additions de zéro) et d'autres simplifications de nature plus linguistique guidées par l'usage

La simplification
appels récursifs
simpl(n*m) --> simpl*(simpl(n),simpl(m))
simpl(n+m) --> simpl+(simpl(n),simpl(m))
simpl(n) --> n
simplifications additives
simpl+(n,0) --> n
simpl+(10,1) --> 11
simpl+(10,2) --> 12
simpl+(10,3) --> 13
simpl+(10,4) --> 14
simpl+(10,5) --> 15
simpl+(10,6) --> 16
simpl+(n,m) --> n+m
simplifications multiplicatives
simpl*(1,10) --> 10
simpl*(2,10) --> 20
simpl*(3,10) --> 30
simpl*(4,10) --> 40
simpl*(5,10) --> 50
simpl*(6,10) --> 60
simpl*(7,10) --> 70
simpl*(8,10) --> 80
simpl*(9,10) --> 90
simpl*(3,20) --> 60
simpl*(1,100) --> 100
simpl*(1,103) --> 103
simpl*(n,m) --> n*m

   Remarquons, que nous avons ici défini ici trois fonctions simpl, simpl+ et simpl*. Seule la première va être appelée par la suite. Les deux autres ne sont que des fonctions auxiliaires.

   Notre exemple :

La verbalisation

   Une fois cette expression simplifié il n'y plus qu'à la traduire mot à mot. Une difficulté à résoudre est le choix des liaisons syntaxiques « -et- », « et », « - » ou simplement un espace. Une seconde est l'accord du pluriel.

Les liaisons syntaxiques
les liaisons additives
lien+(4*20,1) --> -
lien+(60,11) --> -et-
lien+(n,1) -->
si n<100
-et-
lien+(n,m) -->
si n<100
-
lien+(n,m) --> (espace)
liaisons multiplicatives
lien*(4,20) --> -
lien*(n,m) --> (espace)

   Ces fonctions décrivent le choix des liaisons syntaxiques. Il ne s'agit que de l'usage le plus courant, d'autres existent. En Afrique francophone, par exemple, la liaison en « -et- » est plus utilisée. on entendra par facilement « quarante-et-trois » ou « cinquante-et-quatre ».

Le lexique
avec accord possible
lexp(20) --> vingts
lexp(100) --> cents
lexp(106) --> millions
lexp(109) --> milliards
lexp(i) --> lexs(i)
sans accord possible
lexs(0) --> zéro
lexs(1) --> un
lexs(2) --> deux
lexs(3) --> trois
lexs(4) --> quatre
lexs(5) --> cinq
lexs(6) --> six
lexs(7) --> sept
lexs(8) --> huit
lexs(9) --> neuf
lexs(10) --> dix
lexs(11) --> onze
lexs(12) --> douze
lexs(13) --> treize
lexs(14) --> quatorze
lexs(15) --> quinze
lexs(16) --> seize
lexs(20) --> vingt
lexs(30) --> trente
lexs(40) --> quarante
lexs(50) --> cinquante
lexs(60) --> soixante
lexs(70) --> septante
lexs(80) --> huitante
lexs(90) --> nonante
lexs(100) --> cent
lexs(103) --> mille
lexs(106) --> million
lexs(109) --> milliard

   Tous les mots de ce lexique ne sont pas utilisés dans tous les pays francophones. Le terme « huitante », par exemple, n'est utilisé qu'en Suisse. Il est cependant possible de se servir exactement de la même fonction quelque soit le pays. Il se trouve simplement qu'en France, la valeur 80 ne sera jamais utilisée à ce moment : elle aura été décomposé en 4*20 au cours de la phase précédente.

La traduction finale
avec accord possible
verbp(n+m) --> verbs(n)^lien+(n,m)^verbp(m)
verbp(n*m) -->
si n>1
verbs(n)^lien*(n,m)^lexp(m)
verbp(n*m) --> verbs(n)^lien*(n,m)^lexs(m)
verbp(i) --> lexs(i)
sans accord possible
verbs(n+m) --> verbs(n)^lien+(n,m)^verbs(m)
verbs(n*m) --> verbs(n)^lien*(n,m)^verbs(m)
verbs(i) --> lexs(i)
remarque
le symbole ^ représente la concaténation de deux chaînes de caractères.

   Ces deux fonctions représente la phase finale de la traduction. Celle-ci est rendu un peu complexe par la règle sur l'accord en nombre. Ainsi on écrira « deux cents » avec un s mais « deux cent trois » sans s.

   Ceci clôt la traduction des nombres de chiffres en lettres. Pour traduire un nombre n, il suffit de composer les trois fonctions ce qui s'écrit verb o simpl o dec (n) ou verb (simpl (dec (n))). Maintenant, passons à la traduction inverse.

Des lettres vers les chiffres

   Il s'agit maintenant de faire l'opération. Le principe est de convertir la liste de mots en une liste de nombres, puis d'ajouter les signes «+», «*», «(» et «)» là où il faut et de faire le calcul.

Rédaction en cours (désolé)


Applette
Page d'accueil de l'auteur
Yann.Coscoy@free.fr