Mnożenie rosyjskich chłopów pozwala na pomnożenie dwóch liczb naturalnych w niewielkiej ilości kroków. Jest to jeden z algorytmów, które komputery mogą wykonywać tylko przy użyciu operacji binarnych. Podobny system mnożenia został opracowany również w Egipcie. Nazwa jednak pochodzi od rosyjskich chłopów, którzy w XIX w. bardzo często posługiwali się tą metodą.
Przyjmijmy za a = 4 i za b = 8, wtedy:
Przypuśćmy, że mamy dwie liczby naturalne a i b.
a | b | Wynik | Operacja |
---|---|---|---|
4 | 8 | 0 | pomijamy krok (3.) |
8 | 4 | 0 | pomijamy krok (3.) |
16 | 2 | 0 | pomijamy krok (3.) |
32 | 1 | 0 | b nieparzyste, więc dodajemy a do wyniku |
64 | 0 | 32 | b jest mniejsze od 1, więc zwracamy wynik |
Iloczyn 4·8 = 32.
Przyjmijmy za a = 20 i za b = 11, wtedy:
a | b | Wynik | Operacja |
---|---|---|---|
20 | 11 | 0 | b nieparzyste, więc dodajemy a do wyniku |
40 | 5 | 20 | b nieparzyste, więc dodajemy a do wyniku |
80 | 2 | 60 | pomijamy krok (3.) |
160 | 1 | 60 | b nieparzyste, więc dodajemy a do wyniku |
320 | 0 | 220 | b jest mniejsze od 1, więc zwracamy wynik |
Iloczyn 20·11 = 220.
Wersja arytmetyczna w celu obliczenia wyniku korzysta z operacji mnożenia i dzielenia. Jest najdokładniejszym odzwierciedleniem przedstawionej na początku listy kroków do wykonania. Funkcja przyjmuje dwie nieujemne liczby a i b.
(2.) Zadeklaruj zmienną wynik i ustaw jej wartość 0. (3.) Dopóki b > 0 to (3.) sprawdź parzystość b jeśli reszta wynosi 1 to (4.) dodaj do wyniku a. Następnie odpowiednio (5.) pomnóż a przez 2 i (6.) podziel b przez 2. Na koniec (8.) zwróć wynik.
W tej wersji kodu operacje arytmetyczne zostaną zastąpione przez operacje binarne. Kolejno dotyczy to (4.) sprawdzania parzystości liczby. W tym celu wystarczy sprawdzić bit na najmniej znaczącym miejscu. W przypadku 1 będzie to liczba nieparzysta i zostanie to potraktowane jako prawda.
Operacje (5.) mnożenie i (6.) dzielenia przez 2 można zastąpić poprzez przesunięcia bitów. W celu pomnożenia wystarczy przesunąć bity w lewo, a przesunięcie w prawo podzieli liczbę przez 2.
W celu przetestowania obu funkcji można skorzystać z poniższego fragmentu kodu.
Napisz algorytm realizujący zadanie Mnożenie rosyjskich chłopów wykorzystując do tego rekurencje.