Boothův algoritmus
Boothův algoritmus je algoritmus na násobení dvou binárních čísel se znaménkem v dvojkovém doplňku.
Algoritmus
editovatPočet bitů násobence je x, počet bitů násobitele je y.
- Nakreslíme si tři řádky po x + y + 1 místech (bitech), označíme je A, B a C.
- Nejvyšších (nejvíce nalevo) x bitů každého řádku se vyplní v dvojkovém doplňku takto:
- A: násobenec
- B: minus násobenec
- C: nuly
- Dalších y bitů každého řádku se vyplní takto:
- A: nuly
- B: nuly
- C: násobitel
- Do posledního bitů každého řádku se napíše nula.
- Poté se následující kroky opakují y-krát:
- Pokud jsou poslední dva bity řádku C:
00
nebo11
: nedělá se nic01
: C = C + A. Přetečení se ignoruje.10
: C = C + B. Přetečení se ignoruje.
- Řádek C se (aritmeticky) posune o jedno místo doprava.
- Pokud jsou poslední dva bity řádku C:
- Poslední bit součinu (řádku C) se zahodí.
Příklad
editovat310
× -410
: 00112
× -(01002)
=> 00112
× 11002
:
- A =
0011 0000 0
- B =
1101 0000 0
- C =
0000 1100 0
- Cyklus se provede čtyřikrát:
- C =
0000 1100 0
, poslední dva bity jsou00
. - C =
0000 0110 0
, posun vpravo. - C =
0000 0110 0
, poslední dva bity jsou00
. - C =
0000 0011 0
, posun vpravo. - C =
0000 0011 0
, poslední dva bity jsou10
. - C =
1101 0011 0
, C = C + B. - C =
1110 1001 1
, posun vpravo. - C =
1110 1001 1
, poslední dva bity jsou11
. - C =
1111 0100 1
, posun vpravo.
- C =
- Výsledek je:
1111 01002
=-1210
.
Proč algoritmus funguje
editovatUvažme kladný násobitel sestávající z posloupnosti jedniček obklopené nulami. Např. 00111110
. Součin je dán:
- ,
kde N je násobenec. Počet operací se dá redukovat na dvě přepsáním téhož jako
Součin lze pak dostat jedním přičtením a jedním odečtením násobence. Tento postup se dá rozšířit na jakýkoliv počet posloupností jedniček v násobiteli (včetně jedné jedničky v kuse). Čili:
Boothův algoritmus se drží tohoto postupu přičtením, pokud narazí na první číslici z posloupnosti jedniček (0 1), a odečtením, pokud narazí na konec posloupnosti (1 0). Toto funguje také pro záporný násobitel. Jestliže se jedničky v násobiteli vyskytují v dlouhých blocích za sebou, vykoná Boothův algoritmus méně přičítání a odečítání než normální multiplikační algoritmus
Historie
editovatAlgoritmus byl vynalezen Andrewem Boothem v roce 1951 při výzkumu krystalografie na Univerzitě v Birkbecku. Booth používal kalkulátory, které měly rychlejší operaci posunu než sčítání, a vytvořil proto algoritmus, aby je urychlil.