Previous Contents Next
6 Additions
Il existe certainement une foultitude d'algorithmes d'addition. Nous allons en voir deux, l'algorithme classique tel qu'il est enseigné à l'école élémentaire, et l'algorithme d'Avizienis, basé sur la représentation des entiers dans les systèmes d'Avizienis.

Le problème résolu par chacun des deux algorithmes est le suivant : obtenir la représentation en base b de la somme de deux entiers x et y, en utilisant leurs représentations en base b (dont nous supposerons qu'elles comportent chacune k+1 chiffres). Les opérations de bases, ou élémentaires, c'est-à-dire celles que l'on suppose connues du processeur qui exécutera l'algorithme, sont les suivantes :
6.1 Algorithme << classique >>
Soient donc à additionner deux entiers x et y, avec
x =
k
å
i=0
xi.bi      ;     y =
k
å
i=0
yi.bi
Tout le monde est censé connaître l'algorithme, qui consiste à ajouter les chiffres de même poids, des poids faibles vers les poids forts, en propageant éventuellement une << retenue >> vers le rang suivant lorsque la somme des deux chiffres dépasse la base de la représentation. Nous allons l'étudier en détail, d'abord pour le justifier, ensuite pour se familiariser avec une présentation que nous utiliserons dans les sections suivantes.

On définit les suites (ri)i=0, ...,k+1 et (ci)i=0, ...,k+1 (r pour retenue et c pour chiffre) par
r0 = 0,  et pour  i Î {0, ...,k}, ri+1 = ì
í
î
0  si  xi+yi+ri< b
1  si  xi+yi+ri ³ b
(la première retenue est nulle, et la retenue au rang i+1 vaut 0 ou 1 selon que l'addition au rang i est inférieure ou égale à la base). Pour les chiffres : le chiffre de poids fort de la somme est égal à la dernière retenue, et les autres chiffres de la somme sont obtenus en ajoutant les chiffres correspondant des nombres x et y et la retenue, et en enlevant b si le total dépasse b. Plus mathématiquement : si 0 £ i £ k, ci = xi + yi+ri -b.ri+1 et ck+1=rk+1. On a alors
x+y=s=
k+1
å
i=0
ci.bi     (1)
Justifier cet algorithme va se faire en deux étapes : d'abord montrer que les ci sont bien des chiffres en base b, c'est-à-dire que, pour tout i Î {0,...,k+1}, ci Î {0,...,b-1}, enfin montrer que l'égalité (6.1) est vérifiée.

Commençons par montrer que pour tout i Î {0,...,k+1}, ci Î {0,...,b-1} : tout d'abord, on a par définition ck+1=rk+1, ce qui montre que ck+1Î {0,1}Í{0,...,b-1}. Soit maintenant i Î {0,...,k}. On doit montrer que ci Î {0,...,b-1}, c'est-à-dire que 0£ ci £ b-1. Deux cas se présentent, selon la valeur de ri+1 :
  1. ri+1=0 : alors ci = xi + yi+ri, et donc, puisque ri+1=0, ci £ b-1. Par ailleurs, comme par hypothèse 0£ xi, 0£ yi et 0£ ri, on a aussi 0 £ ci, en additionnant ces 3 inégalités membre à membre.
  2. ri+1=1 : alors ci = xi + yi+ri -b. Si ri+1=1, c'est que, par définition, xi+yi+ri ³ b, et donc 0£ ci. Par ailleurs, on a xi£ b-1, yi£ b-1 et ri£ 1, donc
    ci = xi + yi + ri - b (par définition de ci)
      £ b-1 + b-1 + 1 - b (en utilisant les majorations ci-dessus)
      = b-1            
Montrons maintenant l'égalité (6.1) :
s =
k+1
å
i=0
ci.bi      (par définition)
  =
rk+1.bk+1+
k
å
i=0
ci.bi      (par définition de ck+1)
  =
rk+1.bk+1+
k
å
i=0
(xi + yi+ri -b.ri+1).bi      (par définition de ci)
  =
k
å
i=0
xi.bi+
k
å
i=0
yi.bi+rk+1.bk+1 +
k
å
i=0
ri.bi -
k
å
i=0
ri+1.bi+1
  =
x+y+
k+1
å
i=1
ri.bi-
k+1
å
i=1
ri.bi      (car r0=0)
  = x+y
Nous allons maintenant nous intéresser au coût de cet algorithme, c'est-à-dire au nombre d'opérations élémentaires à exécuter pour additionner deux entiers de k+1 chiffres en base b.

Commençons par le calcul des retenues : le calcul de r0 ne nous coûte rien, et, d'après la définition, le calcul de ri+1, pour iÎ{0,...,k}, nous coûte deux additions de chiffres en base b plus un test, c'est-à-dire 3 opérations élémentaires. En tout, le calcul de toutes les retenues prend 3(k+1) opérations élémentaires.

En ce qui concerne les chiffres : le calcul de ck+1 ne nous coûte rien (puisqu'il est égal à rk+1, déjà calculé). Pour i Î {0,...,k}, on n'a, au pire, qu'une seule soustraction, puisque la somme xi + yi+ri a déjà été calculée pour ri+1. En tout, le calcul de tous les chiffres nous coûte k+1 opérations, au pire. Résumons :

Théorème 6.1   L'algorithme d'addition classique effectue au plus 4k opérations élémentaires pour additionner deux entiers de k chiffres.

6.2 Algorithme d'Avizienis
La représentation d'Avizienis permet d'utiliser un algorithme d'addition très rapide, puisqu'il peut être exécuté en parallèle sur les chiffres des opérandes. Le temps pris pour additionner deux nombres ne dépend donc pas de leurs tailles, il est constant. C'est cette propriété qui rend cette représentation intéressante, et effectivement utilisée dans certains coprocesseurs dits <<mathématiques>>.

Soit b>1 la base de la représentation,
{-a, ..., 0, ..., a}
l'ensemble des chiffres, avec a£ b-1 et b+1£ 2.a. On veut additionner x et y, avec
x =
k
å
i=0
xi.bi      ;     y =
k
å
i=0
yi.bi
On définit les suites (ri)i=0, ...,k+1 et (ci)i=0, ...,k+1 (r pour retenue et c pour chiffre) par
r0 = 0,  et pour  i Î {0, ...,k}, ri+1 = ì
ï
í
ï
î
1
 si  xi+yi < -a+1
0  si  -a+1£ xi+yi £ a-1
1  si  xi+yi > a-1
Pour les chiffres : si 0 £ i £ k, ci = xi + yi -b.ri+1 et ck+1=0. On définit enfin la suite (si)i=0, ...,k+1 (avec s pour somme) par si = ci+ri. On a alors (la preuve est dans le théorème ci-dessous)
x+y=s=
k+1
å
i=0
si.bi
Justifions au passage l'allégation du début de la section, selon laquelle on peut calculer en parallèle la somme x+y : on a
si=ci+ri=xi+yi-b.ri+1+ri
et ri est déterminé par les valeurs de xi-1 et de yi-1. Donc, pour calculer si, il suffit de connaître xi, yi, xi-1 et yi-1.

Exemple et disposition pratique des calculs : posons b=10, a=9, x=397, y=418 et donc, puisqu'il y a 3 chiffres, k=2. L'addition s'écrit comme suit :

Indice 3 2 1 0
xi   3
9
7
yi  
4
1
8
ri 0 0
1
0
ci 0
1
8
5
si 0
1
9
5
soit x+y=195. Vérifions : x=397=300-97=203, y=418=-400+10-8=-398 et x+y=203-398=-195. Sur cet exemple, le résultat est correct...On a en fait le résultat suivant :
Théorème 6.2   Avec les notations précédentes :
  1. " i Î {0,...,k+1},   si Î {-a,...,a};
  2. s=åi=0k+1 si.bi=x+y

Preuve :
  1. On a ck+1=0 par définition, et rk+1 Î {-1,0,1} donc sk+1 Î {-1,0,1} Í {-a,...,a}; pour i Î {0,...,k}, si=ci+ri avec ri Î {-1,0,1} : il suffit donc de montrer que ci Î {-a+1,...,a-1}, c'est-à-dire que -a+1£ ci£ a-1. Il y a trois possibilités, selon la valeur de ri+1 :
    1. ri+1=1 : montrons tout d'abord que ci£ a-1. Si ri+1=1, c'est que, par définition de ri+1, xi+yi< -a+1, d'où l'on déduit ci=xi+yi+b < -a+1+b. Comme, par hypothèse, b+1£ 2a, on a -a+1+b £ -a+2a=a, et par transitivité, ci < a c'est-à-dire ci £ a-1.

      Montrons maintenant que -a+1 £ ci. Les assertions -a £ xi, -a£ yi et ci=xi+yi+b entraînent l'inégalité -2a+b £ ci. Comme a £ b - 1, on a aussi a+1 £ b, et on peut minorer la quantité -2a+b par -2a+a+1=-a+1, ce qui implique par transitivité que -a+1£ ci.
    2. ri+1= 0 : c'est que, par définition de ri+1, -a+1£ xi+yi£ a-1. Le résultat découle de ce que, par définition, ci=xi+yi-b.ri+1, et de l'hypothèse ri+1= 0.
    3. ri+1= 1 : la preuve est similaire au cas où ri+1=1, elle est donc laissée en exercice au lecteur.
  2. s =
    k+1
    å
    i=0
    si.bi
      =
    k+1
    å
    i=0
    (ci+ri).bi         par définition de si
      =
    k+1
    å
    i=0
    ci.bi +
    k+1
    å
    i=0
    ri.bi
      =
    k
    å
    i=0
    ci.bi +
    k+1
    å
    i=1
    ri.bi          car ck+1=0 et r0=0
      =
    k
    å
    i=0
    (xi+yi-b.ri+1).bi +
    k+1
    å
    i=1
    ri.bi       par définition de ci
      =
    k
    å
    i=0
    xi.bi +
    k
    å
    i=0
    yi.bi -
    k
    å
    i=0
    ri+1.bi+1 +
    k+1
    å
    i=1
    ri.bi
      =
    x+y -
    k+1
    å
    i=1
    ri.bi+
    k+1
    å
    i=1
    ri.bi
      = x+y



Exercices de la partie 6
  1. Programmer l'algorithme classique d'addition avec un tableur.
  2. Effectuer les additions suivantes (b désigne la base, a désigne le plus grand chiffre positif) :
  3. Calculer le coût, en nombre d'opérations élémentaires, de l'algorithme d'Avizienis.
  4. Programmer l'algorithme d'Avizienis avec un tableur.
  5. Donner un algorithme d'addition pour la << base >> de Fibonacci.
  6. Donner un algorithme d'addition pour la base -2.

Previous Contents Next