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.
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 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.
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.
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
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 :
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 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 ».
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.
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.
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é)