Les algorithmes de multiplication
(d'un nombre à plusieurs chiffres par un nombre à plusieurs chiffres)
a. À la française
45
x 19
----
405 1) multiplier successivement le 1er nb par chaque chiffre du 2e nb
45.
----
855 2) additionner les resultats en tenant compte des decalages necessaires
Reste un problème si on ne dispose que d'un additionneur :
comment faire 9 x 45 ?
b. À la russe
45 | | | 19 |
|
1) écrire les 2 nbs chacun en haut d'une colonne |
22 | | | 38 |
| |
11 | | | 76 |
| 2) diviser successivement le nb de la colonne de gauche par 2 |
5 | | | 152 |
| |
2 | | | 304 |
| 3) multiplier successivement le nb de la colonne de droite par 2 |
1 | | | 608 |
| |
STOP | => | STOP |
| 4) s'arrêter lorsque 1 apparaît dans la colonne de gauche |
45 | | | 19 |
|
|
22 | | | 38 |
| 5) rayer dans la colonne de droite les nbs en face d'un nb pair de la colonne de gauche |
11 | | | 76 |
| |
5 | | | 152 |
| |
2 | | | 304 |
| |
1 | | | 608 |
| |
-- | -- | ---- |
| |
| | 855 |
| 6) additionner les nbs restant dans la colonne de droite |
c. Avantages
- division par 2 => décalage d'un bit vers la droite
- multiplication par 2 => décalage d'un bit vers la gauche
- test de parité => test du bit de poids faible
d. Optimisation
19 | | | 45 |
|
1) écrire le plus petit nb dans la colonne de gauche et l'autre dans celle de droite |
9 | | | 90 |
| |
4 | | | 180 |
| |
2 | | | 360 |
| |
1 | | | 720 |
| |
-- | -- | ---- |
| |
| | 855 |
| |
e. Spécification
Cette étape de formalisation n'est pas évidente mais est nécessaire
pour pouvoir ensuite passer à l'étape de traduction dans un langage de
programmation.
Cela peut donner ça :
Soient A et B les 2 entiers positifs à multiplier.
[Obtenir leur valeur]
Soit R le résultat.
SI A est impair
ALORS initialiser R à la valeur de B
SINON initialiser R à 0
FINSI
TANTQUE A > 1 FAIRE
- diviser A par 2 (sans reste)
- multiplier B par 2
- SI A est impair
ALORS ajouter B à R
FINSI
FINTANTQUE
[Afficher le résultat R]
ou bien, de façon moins verbeuse :
A,B,R : entiers naturels
Lire A
Lire B
SI reste(A/2)=1
ALORS R <- B
SINON R <- 0
FINSI
TANTQUE A > 1 FAIRE
A <- A / 2
B <- B * 2
SI reste(A/2)=1
ALORS R <- R + B
FINSI
FINTANTQUE
Afficher R
f. Traduction en Java (incomplète)
public class Russe
{
// début de la partie principale
{
int A = /* récupération du premier nombre */ ;
int B = /* récupération du deuxihme nombre */ ;
int R;
if ( A > B ) { // echange
R = B;
B = A;
A = R;
} // if
if ( A % 2 == 0 ) // liberté du programmeur
R = 0;
else
R = B;
while ( A > 1 )
{
A /= 2;
B += B;
if ( A%2 != 0 )
R += B;
}
/* affichage sous la forme A * B = R */ ;
} // fin de la partie principale
} // fin de la classe Russe
g. Traduction en Java (complète)
public class Russe
{
public static void main( String[] inutilise )
{
java.util.Scanner clavier = new java.util.Scanner( System.in );
System.out.print( "A ? " );
int A = clavier.nextInt();
System.out.print( "B ? " );
int B = clavier.nextInt();
int R;
if ( A > B ) { // echange
R = B;
B = A;
A = R;
} // if
if ( A % 2 == 1 ) // plus clair
R = B;
else
R = 0;
while ( A > 1 ) {
A = A / 2; // plus clair
B = B * 2; // plus clair
if ( A%2 == 1 ) // plus clair
R = R + B; // plus clair
} // while
System.out.println( A + "*" + B + " = " + R );
} // main(.)
} // Russe
h. Traduction en C++
#include <iostream.h>
int main( void )
{
unsigned int A, B, R;
cout << "A ? ";
cin >> A;
cout << "B ? ";
cin >> B;
if ( A > B ) { // echange
R = B;
B = A;
A = R;
} // if
if ( A % 2 == 1 ) // plus clair
R = B;
else
R = 0;
while ( A > 1 ) {
A = A / 2; // plus clair
B = B * 2; // plus clair
if ( A%2 == 1 ) // plus clair
R = R + B; // plus clair
} // while
cout << A << "*" << B << " = " << R << endl;
return 0;
} // main()
Voyez-vous des ressemblances avec la version Java ?
i. Traduction en C
#include <stdio.h>
int main( void )
{
unsigned int A, B, R;
printf( "A ? " );
scanf( "%d", &A );
printf( "B ? " );
scanf( "%d", &B );
if ( A > B ) { /* echange */
R = B;
B = A;
A = R;
} /* if */
if ( A % 2 == 1 ) /* plus clair */
R = B;
else
R = 0;
while ( A > 1 ) {
A = A / 2; /* plus clair */
B = B * 2; /* plus clair */
if ( A%2 == 1 ) /* plus clair */
R = R + B; /* plus clair */
} // while
printf( "%d * %d = %d\n", A, B, R );
return 0;
} /* main() */
Voyez-vous des ressemblances avec la version Java ou C++ ?