MULTIPLICATION AU SENS DE MONTGOMERY
L'invention se rapporte à un procédé de cryptographie incluant le calcul d'une multiplication modulaire au sens de Montgomery entre deux nombres binaires de grandes tailles. Plus particulièrement, l'invention vise un mode de calcul d'une telle multiplication, dans lequel la représentation binaire des opérandes soit facilement configurable à la demande, pour pouvoir changer la taille des opérandes. L'invention concerne aussi toute entité électronique mettant en œuvre le procédé.
Depuis l'introduction du système RSA, de nombreuses, recherches ont été effectuées sur les techniques de calcul modulaire, tant au niveau logiciel que matériel. Parmi toutes ces techniques, celle qui s'appuie sur l'algorithme de P.L. Montgomery est la plus intéressante et offre encore de. nombreuses perspectives. Cette théorie a été exposée dans un article de Montgomery intitulé "Modular Multiplication Without Trial Division" dans la revue "Mathematics & Computations" d'avril 1985. Les réalisations matérielles connues de la technique de Montgomery sont faites uniquement en représentation binaire dont le principal inconvénient est d'imposer des registres de travail e taille importante et non configurables.
Les systèmes cryptographiques à clé publique les plus utilisés (RSA, DSA, ECC...), sont basés sur l'arithmétique modulaire des grands nombres. Il faut en effet savoir calculer efficacement l'exponentielle modulaire de nombres dont la taille nécessite au moins 1024 bits pour la représentation des opérandes, ce qui représente plus de 310 chiffres décimaux. Les systèmes de représentation des opérandes dans les ordinateurs sont basés sur le mot binaire regroupant plusieurs bits. Les structures de mots actuellement employées sont donc : - l'octet représenté par 8 bits,
- les mots de 16 ou 32 bits.
Ainsi donc un opérande de 1024 bits nécessite 128 octets (ou 32 mots de 32 bits), pour sa représentation.
La réalisation d'une exponentiation modulaire peut être réalisée en effectuant une série de multiplications modulaires.
Etant donné a, e, n trois nombres, on cherche à calculer ae mod n, appelée exponentiation modulaire. L'opérande n, s'appelle le module. Pour éviter le dépassement de capacité des ordinateurs, l'opération ci-dessus peut se décomposer en une suite de multiplications modulaires de la forme a . x mod n. C'est pour cette raison que l'on s'intéresse aux techniques de multiplication modulaire.
Cette dernière relation indique qu'il faut effectuer le produit de a par x et ne conserver, dans le résultat, que le reste de la division par n. Rappelons que les opérandes en question sont de grandes tailles et nécessitent plusieurs mots de représentation. Si la plupart des opérations arithmétiques ne posent pas de problème particulier, l'opération de division sur des grands nombres sans technique particulière est très coûteuse. Au prix d'un changement de représentation, l'algorithme de Montgomery permet de contourner cette difficulté.
Lorsqu'on implante un algorithme dans un circuit électronique, on dispose généralement d'opérateurs physiques, typiquement des additionneurs et des multiplieurs, d'une taille fixe qu'on notera w, par exemple de 8, 16 ou 32 bits. On dit que w est la taille du "mot machine". Ainsi, exécuter une opération arithmétique addition, soustraction ou multiplication sur des grands nombres, se décompose en opérations élémentaires impliquant les opérateurs physiques de base sur des mots machines de taille w. Pour une multiplication, cette décomposition est en général réalisée de façon logicielle, comme décrit ci-dessous: Soit (Au_ι, Au-2,.-- A-i, Ao), (Xu--ι, Xu-2,.-- X*ι, Xo), représentant des entiers a et x, les et Xj étant des mots machines de taille w. Si h est la taille des opérandes, on a u=h/w. Typiquement h=1024, w=16 bits ou 32 bits et u= 64 ou
32. On voit alors que :
•x = ∑ Ai . Xj i , j = 0
On va maintenant rappeler brièvement en quoi consiste une multiplication modulaire au sens de Montgomery.
On veut calculer a . x mod n, n étant impair. On choisit un radical noté r<n, r étant le mot machine, c'est à dire r = (2W) (remarquons que r est alors relativement premier avec n), et on calcule les coefficients r"1 et n' tels que r. r"1 - n.n' = 1.
Grâce à l'identité de Bezout on sait que :
- de tels coefficients existent,
- n' ne nécessite qu'un seul mot pour sa représentation, - on peut utiliser l'algorithme d'Euclide généralisé pour calculer n' = -1/n mod r.
Dans la suite, on notera «*», la multiplication au sens de Montgomery. Notons :
- a le multiplicande,
- x, le multiplieur exprimé sous forme de mots, Xi , le mot courant à l'étape i. La multiplication au sens de Montgomery se traduit par un algorithme de multiplication-accumulation modulaire. Cet algorithme peut être résumé ainsi :
c=0
Pour i=0 à u-1 c := c + a.Xi (1)
Qi := Low(c.n') (2) c:= (c + n.Qi)/r (3)
La fonction "Low" extrait le mot de poids faible du produit c . n'.
Comme le montre Montgomery dans son article de référence rappelé plus haut, pour le calcul d'une exponentiation modulaire, la multiplication modulaire peut être remplacée par la multiplication de Montgomery. Or, la multiplication de
Montgomery est plus rapide que la multiplication modulaire classique.
En effet, en choisissant r le mot machine, c'est-à-dire r = (2W), il apparaît que la division par r revient à un simple décalage de un mot dans le sens des mots de poids faibles. L'opération de division de la ligne (3) est donc très rapide comparée à une division euclidienne classique.
Dans l'expression ci-dessus, Q, est désigné par l'expression "coefficient de réduction" qui ressort de la théorie de Montgomery.
Montgomery a démontré dans son article que la multiplication modulaire définie par lui permet de calculer par accumulation dans c l'expression a. b.r"u modulo n.
De plus, une exponentiation modulaire au sens de Montgomery peut s'obtenir facilement en utilisant uniquement des multiplications au sens de
Montgomery, à savoir : a
*e = a* a* a ...* a (e.fois) et le calcul d'une exponentiation modulaire traditionnelle s'obtient aisément à l'aide d'une conversion utilisant une exponentielle au sens de Montgomery, c'est- à-dire : a
e mod n = 1* [(a*R
2)
*e] (1) avec R = r
u L'algorithme résumé dans le tableau ci-dessus nécessite cependant de réaliser des multiplications portant sur des grands nombres, à savoir :
et n . Q-, en (3). En effet, a et n sont des grands nombres exprimés sur 1024 bits, X et Qi étant par ailleurs de la "taille machine", c'est-à-dire de 8, 16 ou 32 bits.
Ces multiplications peuvent impliquer, pour leur "implémentation" concrète dans les systèmes informatiques, des opérateurs de grandes tailles (capables de
"gérer" des grands nombres tels que a et n) ou tout au moins des registres de grandes tailles qui sont nécessairement de tailles prédéterminées. Il en résulte que les systèmes connus ne sont pas configurables, c'est-à-dire qu'on ne peut changer la taille des opérandes en fonction des besoins. Pour résoudre ce problème, l'invention propose de parcelliser les grands nombres en mots de taille réduite, par exemple de la taille du mot machine, en partant de la constatation qu'une somme de produits partiels du genre
Aj Xj + Nj Xi ne va affecter que la valeur de C* (le mot de rang correspondant dans l'écriture par mots du résultat) ou éventuellement aussi le mot voisin (Cj+i) de rang immédiatement supérieur.
Ainsi l'invention peut se définir comme un procédé de cryptographie incluant le calcul d'une multiplication modulaire au sens de Montgomery (*) entre deux nombres (x, a), caractérisé en ce qu'on exprime lesdits nombres et un
module (m) en mots, on stocke lesdits mots dans des mémoires correspondantes et on définit une mémoire à décalage où on accumule par mots des résultats de cycles de multiplications et additions entre mots, jusqu'à obtenir le résultat de ladite multiplication modulaire inscrit dans ladite mémoire à décalage, en ce que, pour chaque mot ( )de la succession de mots d'un premier nombre précité, on accomplit le cycle d'opérations consistant :
- à calculer pour tout le cycle (i) considéré un mot dit coefficient de réduction (Qι)
- à multiplier ledit mot (Xj) dudit premier nombre correspondant audit cycle (i) chaque fois par l'un des mots (Aj) constituant ledit second nombre pour obtenir une succession de premiers résultats intermédiaires,
- à multiplier ledit coefficient de réduction (Qi) correspondant audit cycle (i) chaque fois par l'un des mots Mj constituant ledit module pour obtenir une succession de seconds résultats intermédiaires, et - à additionner lesdits premiers et seconds résultats intermédiaires, aux mots de mêmes rangs déjà contenus dans ladite mémoire à décalage et, à la fin de chaque cycle (i), à décaler d'un mot vers les bits de poids faibles le contenu de ladite mémoire à décalage.
Ledit "coefficient de réduction" est issu de la théorie de Montgomery. II est clair, pour l'homme du métier, que certaines opérations indiquées ci- dessus peuvent être accomplies indépendamment les unes des autres et que l'ordre dans lequel elles sont énoncées n'est pas une caractéristique essentielle pour la mise en œuvre de l'invention.
Selon un aspect de l'invention, on peut aussi envisager une simplification de l'algorithme de Montgomery indiqué ci-dessus :
On reprend l'expression r . r"1 - n.n' = 1 avec les mêmes hypothèses sur r, r"1, n et n'. En particulier, r"1 est l'inverse de r modulo n. On peut se restreindre aux modules n tel que le coefficient n' correspondant soit égal à 1. L'algorithme se simplifie ainsi :
c=0
Pour i=0 à u-1 c := c + aXi Qj := Low(c) c:= (c + n.Qi)/r
Lorsque n -1 selon l'invention, on dira que le module est "normalisé" au sens de Montgomery. Par un changement de variable, on peut toujours se ramener au cas des modules normalisés au sens de Montgomery. En effet, posons m=n.n' et m'=1 , m est impair et donc relativement premier avec r. On peut donc toujours considérer l'identité de Bezout identiquement vérifiée par le nouveau jeu de coefficients r.r"1 - m.m' = 1
Donc l'arithmétique de Montgomery s'applique au module m normalisé au sens de Montgomery. Dans la suite de la description, le module m sera exprimé par une série de mots Mj. L'invention peut cependant être mise en œuvre sans la simplification n'=1 , c'est-à-dire sans faire appel au module normalisé. On voit que dans le cas n -1 , le calcul du coefficient de réduction Qi se trouve simplifié et est obtenu en calculant "Low c". Il n'est plus nécessaire de calculer en'. Ceci simplifie l'algorithme décrit plus haut car Qi, à chaque cycle, peut être constitué de la somme dudit premier mot contenu dans ladite mémoire à décalage avec les bits de poids faibles du produit du premier mot A0 d'un second nombre précité, par le mot X dudit premier nombre considéré dans ledit cycle.
A la fin du calcul d'une exponentiation modulaire utilisant des multiplications au sens de Montgomery, avec module normalisé, on obtient un résultat T = ae mod m en appliquant la conversion (1) ci-dessus. On peut ensuite calculer U, l'exponentiation modulaire, modulo n, par une seule transformation
U = T mod n Selon un mode d'exécution possible, le procédé consiste, pour chaque cycle et au fur et à mesure, à additionner un résultat intermédiaire précité au mot de même rang et au mot de rang immédiatement supérieur contenus dans ladite mémoire à décalage, à réinscrire les résultats de ces additions à ces mêmes rangs de ladite mémoire, puis à recommencer ces opérations avec l'autre
résultat intermédiaire, jusqu'à la fin dudit cycle comprenant le décalage d'un mot précité.
Selon un autre mode d'exécution possible, le procédé consiste, pour chaque cycle, à partager chaque résultat intermédiaire en deux groupes rassemblant respectivement les bits de poids faibles et les bits de poids forts, à mémoriser temporairement ces groupes, à ajouter, à la valeur de chaque mot de ladite mémoire à décalage les groupes rassemblant les bits de poids faibles de même rang (j) et les groupes rassemblant les bits de poids forts du rang immédiatement inférieur (j-1 ), et à reporter le résultat de ces additions, chaque fois, à l'emplacement du mot j considéré de ladite mémoire à décalage, jusqu'à la fin dudit cycle comprenant le décalage d'un mot précité.
L'invention concerne aussi une entité électronique comprenant des moyens de cryptographie incluant une unité de calcul d'une multiplication modulaire, au sens de Montgomery, entre deux nombres, caractérisée en ce que ladite unité de calcul comprend :
- trois mémoires dimensionnées pour recevoir respectivement lesdits nombres a, b et un module m, chacun exprimé en mots de taille prédéterminée dans la mémoire correspondante,
- une mémoire à décalage dimensionnée pour recevoir le résultat de ladite multiplication modulaire et agencée pour décaler son propre contenu, chaque fois par mot de taille prédéterminée dans la direction des bits de poids faibles,
- un premier multiplieur pour faire des produits successifs de deux mots respectivement lus dans les mémoires des deux nombres,
- un calculateur d'un coefficient de réduction déterminé au début d'un cycle de multiplications des mots d'un nombre par un mot de l'autre,
- un second multiplieur pour faire des produits successifs d'un mot dudit coefficient de réduction par un mot lu dans la mémoire dudit module, et
- un additionneur connecté, en entrée, entre les sorties desdits premier et second multiplieurs et ladite mémoire à décalage et connecté, en sortie, à ladite mémoire à décalage en adressant directement des mots sélectionnés de celle-ci.
L'invention sera mieux comprise à la lumière de la description qui va suivre, donnée à titre d'exemple, et faite en référence aux dessins annexés dans lesquels :
- la figure 1 est un schéma bloc illustrant une partie d'une entité électronique constituant plus particulièrement une unité de calcul d'une multiplication modulaire au sens de Montgomery, conforme à l'invention ;
- la figure 2 est un organigramme explicitant le fonctionnement de l'unité de calcul de la figure 1 ;
- la figure 3 est un schéma bloc d'une variante de l'unité de calcul de la figure 1 ; et
- la figure 4 est un organigramme explicitant le fonctionnement de cette variante. L'unité de calcul 11 d'une multiplication modulaire, au sens de
Montgomery, représentée sur la figure 1 peut être intégrée à toute entité électronique comprenant des moyens de cryptographie, pour effectuer de telles multiplications modulaires et, par conséquent, des exponentiations modulaires. Cette unité de calcul peut par exemple être intégrée à une carte à microcircuit comprenant des moyens de cryptographie, une telle unité de calcul 11 selon l'invention étant avantageuse pour ce type d'entité électronique en raison de la rapidité de calcul et de la facilité avec laquelle on peut configurer la taille des opérandes, c'est-à-dire la capacité occupée par les mémoires renfermant ces opérandes. L'unité de calcul comprend trois mémoires Ma> Mx, Mm dimensionnées pour recevoir respectivement deux nombres a, b et un module normalisé m. Les nombres x, a et le module m sont, chacun, exprimés en mots (Xi, Aj, Mj ...) de taille prédéterminée dans la mémoire correspondante, ce qui signifie que chacune de ces mémoires comporte u registres, chacun dimensionné pour recevoir un mot du nombre a ou b ou du module m. La taille d'un mot d'un nombre ou du module est la même. Selon les cas, on peut choisir des mots de 8 bits, 16 bits ou 32 bits suivant la capacité des multiplieurs et des additionneurs qui seront utilisés dans l'unité de calcul. Cette dernière comporte en outre une mémoire à décalage 104 dimensionnée pour recevoir le résultat de la multiplication modulaire, par accumulation de calculs successifs. Cette mémoire est donc constituée d'une série de registres, chacun de la taille d'un mot Co, Cu ... et elle est agencée pour décaler son propre contenu, à chaque itération comme décrit plus loin, par mot de ladite taille prédéterminée, dans la direction des mots de bits de poids faibles, c'est-à-dire vers Co. Il est à noter que
les mémoires Mx, Ma, Mn et la "mémoire à décalage" 104 peuvent être des parties allouées (en fonction de la taille des opérandes) d'une même mémoire dite RAM (mémoire à accès direct) configurée pour la circonstance. De préférence, on pourra même avoir recours à des pointeurs, c'est-à-dire à des registres contenant simplement les adresses des mots inscrits dans la mémoire RAM. A chaque itération en i ou en j, le contenu du pointeur change.
L'unité de calcul 11 comporte en outre un premier multiplieurlOO pour faire des produits successifs de deux mots respectivement lus dans les mémoires Ma, Mx des deux nombres, un calculateur 102 d'un coefficient de réduction Qi, ce coefficient étant déterminé au début d'un cycle (i) de multiplication des mots Aj d'un nombre (a) par un mot X,- de l'autre et un second multiplieur101 pour faire des produits successifs dudit coefficient de réduction Q-, par un mot Mj lu dans la mémoire Mm dudit module. L'unité de calcul comporte aussi un additionneur 103, ici un additionneur double, connecté, en entrée, entre les sorties desdits premier et second multiplieursI OO, 101 et ladite mémoire à décalage 104 et connecté, en sortie, à cette même mémoire à décalage 104 avec possibilité d'adresser directement des mots sélectionnés de celle-ci, c'est- à-dire que la sortie de l'additionneur 103 peut "pointer" directement un ou plusieurs emplacements de mot Cj, Cj+i de ladite mémoire à décalage et y inscrire le résultat d'une ou plusieurs additions correspondantes.
Sur la figure 1 , on a représenté l'emplacement de mot C0 (le registre) dans lequel s'inscrit le mot des poids faibles et, à l'opposé, l'emplacement de mot Cu dans lequel s'inscrit le mot des poids forts. On a en outre représenté deux emplacements de mot voisins de rang j et j+1. Ces deux emplacements sont ceux qui sont lus puis modifiés au cours d'un cycle j.
Les mémoires Ma, Mx des deux nombres sont reliées aux entrées du premier multiplieurlOO par l'intermédiaire de registres tampons 106, 107 de la taille d'un mot. Chaque registre peut donc accueillir le mot du nombre qui doit être multiplié par celui de l'autre nombre, à un moment donné. La sortie de ce même multiplieur est connectée à l'entrée d'un registre tampon 108 ayant la taille de deux mots. La sortie de ce registre tampon est reliée à l'une des entrées de l'additionneur 103.
Le calculateur du coefficient Qj comprend un additionneur 102 qui reçoit à l'une de ses entrées le mot de poids faibles C0 contenu dans le registre correspondant de la mémoire à décalage et, à son autre entrée, le contenu d'un autre registre tampon 109 qui contient un mot appelé Low P-i calculé au début d'un cycle considéré (décrit plus loin) et constitué des bits de poids faibles du produit d'un mot X d'un premier nombre x, invariable dans un cycle, par le premier mot Ao d'un second nombre a dont tous les mots sont utilisés au cours de ce même cycle. Les bits de poids faibles retenus dans Low Pi forment un mot de ladite taille prédéterminée de x ou a. La sortie de l'additionneur 102 est reliée à l'entrée d'un registre tampon 110 dont la sortie est reliée à une entrée du second multiplieur! 01. Un autre registre tampon 111 est relié entre la mémoire Mm et l'autre entrée du second multiplieur101. Cette mémoire tampon 111 peut donc recevoir successivement chaque mot Mj de la mémoire Mm.
La sortie du second multiplieur101 est reliée à l'entrée d'un registre tampon 113 de la taille de deux mots et la sortie de ce registre est reliée à l'une des entrées de l'additionneur. Enfin, l'additionneur comporte une troisième entrée reliée à la mémoire à décalage 104. Deux mots consécutifs de cette mémoire peuvent être appliqués à cette troisième entrée. Les mots qui sont susceptibles d'être adressés à cette entrée de l'additionneur 103 sont les mêmes qui sont "pointés" par la sortie 105 de ce même additionneur.
En fonctionnement, l'additionneur 103 est programmé pour effectuer successivement l'addition du contenu du registre tampon 108 avec les deux mots Cj, Cj+ι considérés de la mémoire à décalage, le transfert du résultat aux mêmes emplacements de ladite mémoire, puis l'addition du contenu du registre tampon 113 avec les deux mots Cj, Cj+i modifiés de la mémoire à décalage. L'additionneur est classiquement agencé avec une mémoire de retenue Rt dans laquelle s'inscrit la retenue d'une addition donnée. Comme on le verra plus loin, selon les cas, cette retenue peut s'ajouter à l'addition en cours des deux mots. A la fin d'un cycle sur j, la retenue est inscrite dans le registre de poids forts Cu de la mémoire à décalage 104.
On va maintenant décrire le fonctionnement de l'unité de calcul de la figure 1 pour réaliser une multiplication modulaire au sens de Montgomery entre les deux nombres x et a, le module normalisé étant exprimé par m. On rappelle
que les mots du nombre x sont notés X, les mots du nombre a sont notés Aj et les mots du normalisé module m sont notés Mj. Les mots inscrits dans la mémoire à décalage sont notés Cj. L'organigramme de la figure 2 décrit un cycle complet sur j dans lequel on utilise tous les mots Aj et tous les mots Mj pour modifier tous les mots de la mémoire à décalage 104, étant constant. La multiplication modulaire au sens de Montgomery n'est réalisée que lorsqu'on a effectué tous les cycles sur i exploitant tous les mots X\.
Au début d'un tel cycle sur i, on remet à zéro la mémoire de retenue Rt de l'additionneur 103 et on initialise un compteur j = 0 (étapes 115 et 116). On rappelle que les nombres x et a et le module m comportent u mots. A chaque début de cycle sur j, on effectue le test pour vérifier si j = u (étape 117).
Dans la négative, s'agissant d'un cycle sur X, le multiplieurlOO effectue le produit P-i = AjXi (étape 118).
Parallèlement, on effectue le test 119 pour vérifier si j = 0 (début de cycle). Si ce test est positif, on calcule (étape 120) un coefficient Qi, valable pour tout le cycle i, à l'aide du calculateur de coefficient de réduction principalement constitué de l'additionneur 102. Comme mentionné précédemment, ce coefficient Qi est constitué de la somme du premier mot Co (poids faibles) de la mémoire à décalage 104 au début du cycle et de la partie des bits de poids faibles du premier produit P-i qui vient d'être calculé, c'est-à-dire la moitié des bits du produit A0Xi.
Dès que la valeur de Qi pour le cycle est calculée, on peut aussi calculer le produit P2 = MjQi (étape 121 ).
Il est important de noter à ce stade que les calculs successifs des produits P*ι et P2 par les multiplieursIOO et 101 respectifs, qui prennent plus de temps que les additions qui doivent être effectuées par l'additionneur 103, peuvent être effectués "en parallèle", c'est-à-dire sensiblement en même temps.
Dès qu'un produit Pi est connu, on passe à l'étape 123 où l'additionneur 103 réalise la somme (add) entre la sortie du multiplieurlOO inscrite dans le registre 108 et les deux mots Cj+i, Cj pointés à ce stade par la sortie 105 de l'additionneur 103. Le contenu de la mémoire Rt (retenue de l'opération précédente) est également ajouté. Dès que la somme de cette triple addition est effectuée, elle est inscrite aux emplacements Cj+i, Cj de la mémoire à décalage
104. La retenue de cette addition Radd, qui ne peut être inscrite dans Cj+1 est inscrite dans la mémoire R. On passe ensuite à l'étape 124 où on réalise à nouveau une addition, dès que le produit P2 correspondant est connu, entre la valeur de ce produit et le double mot Cj+i, Cj inscrit dans la mémoire à décalage 104 à l'étape précédente. En revanche, on n'additionne pas la retenue. La nouvelle retenue Radd est ajoutée à la précédente et réinscrite dans la mémoire Rt. Les additions effectuées par l'additionneur 103 peuvent être effectuées en temps masqué pendant l'exécution des multiplications suivantes.
Par ailleurs, dès que les valeurs de Pi et P2 sont connues, on incrémente le compteur j d'une unité (étape 122) et on revient au test 117. Tant que la réponse à ce test j = u est négative, on effectue de nouveaux calculs de Pi et P2, ce qui entraîne l'inscription de nouvelles valeurs aux emplacements suivants de la mémoire à décalage 104, pointés par la sortie de l'additionneur .103.
Lorsque le test 117 devient positif, c'est-à-dire lorsqu'on arrive à la fin d'un cycle sur X, le contenu de la mémoire à décalage 104 est décalé d'un mot vers les bits de poids faibles, à l'étape 125 et la dernière valeur inscrite dans la mémoire Rt est reportée dans les bits de poids faibles de l'emplacement Cu (mot de poids fort de la mémoire à décalage 104) à l'étape 126. Le cycle i est terminé et on recommence un nouveau cycle avec le mot suivant. Lorsque tous les cycles ont été effectués, la mémoire à décalage contient le produit modulaire au sens de Montgomery des nombres x et a.
La variante de la figure 3 se distingue de l'unité de calcul décrite en référence à la figure 1 par la structure de l'additionneur et la façon dont celui-ci pointe la mémoire à décalage, mot par mot et non plus par groupe de deux mots. Tous les moyens de calcul des produits Pi et P2 qui s'inscrivent successivement dans les registres 108 et 113 sont identiques à ceux de la figure 1 et ne seront donc pas décrits à nouveau. La mémoire 104 est également identique à la différence près qu'elle est "pointée" mot par mot, c'est-à-dire que l'additionneur ne lit chaque fois qu'un mot de la mémoire à décalage et ne modifie que ce même mot à l'issue d'une phase de calcul.
Cependant, selon la variante, les contenus des registres tampons 108 et 113 sont traités différemment en ce sens que le produit Pi est partagé en deux mots, un mot Li contenant les bits de poids faibles et un mot H*ι contenant les
bits de poids forts. De même, le produit P2 est partagé en deux mots, un mot L2 contenant les bits de poids faibles et un mot H2 contenant les bits de poids forts. Le mot de la mémoire 104 pointé à un moment donné par l'additionneur 103 est noté Cj. Ces différents mots sont adressés à un ensemble 112 de cinq registres d'entrée de l'additionneur formant "file d'attente". Cependant, comme on le verra plus loin en référence à la figure 4, les mots L-i, L2 (poids faibles) d'un cycle j sont additionnés avec le mot Cj de la mémoire registre mais avec les mots H-i et H2 du cycle j-1. Ceci est explicité par l'organigramme de la figure 4.
Au début d'un cycle de traitement à Xi constant, on initialise (étape 130) un compteur j = 0, la retenue Rt est mise à zéro ainsi que les valeurs H-i et H2 contenues dans les registres 108 et 113.
On passe alors à un test 131 pour vérifier si j=u. Dans la négative, on commence à calculer la valeur du produit Pi (étape 132) constituant le produit de Aj par X, ce qui permet d'inscrire dans le registre 108 les valeurs correspondantes de L-i et H*|. Dans le même temps, on effectue le test 133, sur j, pour vérifier si j = 0. Si c'est le cas, on passe à l'étape 134 où on calcule la valeur de Qi pour le cycle i comme dans l'exemple précédent. Ce calcul peut être effectué dès que la valeur de Li du produit AoXi est connue à l'étape 132.
Dès lors et pour toutes les valeurs de j suivantes, il est possible de calculer (étape 135) la succession des produits P2, c'est-à-dire d'obtenir les valeurs L2 et H2 qui s'inscrivent dans le registre 113. Comme précédemment, les produits L-i, Hi et L2, H2 peuvent être calculés "en parallèle" indépendamment du fonctionnement de l'additionneur 103.
Concernant ce dernier, à chaque test 133 négatif, les valeurs actuelles de L-i et L2 sont mises à jour (étape 136) pour l'additionneur 103, c'est-à-dire que les mots L-i et L2 contenus dans les registres 108 et 113 sont transférés dans les registres correspondants de l'ensemble 112, les mots H-i et H2 étant conservés. Ceux-ci sont donc mis à jour mais pas les registres de l'ensemble 112 contenant H** et H2 calculés au cycle précédent. On passe alors à une addition à l'étape 137 qui consiste à faire la somme des valeurs inscrites dans l'ensemble 112 alimentant l'additionneur 103, c'est-à- dire Cj, les valeurs L-i et L2 du cycle j, les valeurs H-i et H2 du cycle précédent et la valeur inscrite dans la mémoire Rt. Le résultat est réinscrit à l'emplacement Cj
de la mémoire à décalage et la retenue Radd de cette addition est inscrite dans la mémoire Rt.
On passe ensuite à l'étape 138 où les valeurs actuelles de H*ι et H2 sont mises à jour, c'est-à-dire que les mots H-i et H2 contenus dans les registres 108 et 113 sont transférés dans les registres correspondants de l'ensemble 112.
On incrémente le compteur j d'une unité à l'étape 139 et on retourne au test 131 où les mêmes opérations sont renouvelées pour le cycle j + 1.
Lorsque le test 131 devient positif, on passe à l'étape 140 où on calcule la valeur de Cu de façon analogue à un calcul de Cj (étape 137) mais sans tenir compte de L-i et L2, c'est-à-dire en additionnant Cu, H-i, H2 et Rt, la retenue de cette addition Ra d est inscrite dans Rt. A l'étape 141 , le contenu de la mémoire à décalage 104 est décalé d'un mot vers les bits de poids faibles. A l'étape 142, la dernière valeur inscrite dans la mémoire Rt est reportée à l'emplacement Cu (bits de poids forts) de la mémoire à décalage 104. Le cycle i est terminé et on recommence un nouveau cycle avec le mot Xi suivant.
On peut envisager encore d'autres variantes.
Notamment, on pourrait n'utiliser qu'un seul multiplieur qui serait programmé pour réaliser une première série de calculs dans la boucle j pour calculer par exemple tous les Aj X puis une seconde série de calculs dans une autre boucle j, cette fois pour calculer tous les Qi.irij.
De plus il est à noter que les mots des nombres a, x, m et c peuvent être de tailles différentes ; la mise en œuvre de l'invention reste possible.