Russian Peasant (Multiply two numbers using bitwise operators)

28 Oct, 2021
Given two integers, write a function to multiply them without using multiplication operator.There are many other ways to multiply two numbers (For example, see this). One interesting method is the Russian peasant algorithm. The idea is to double the first number and halve the second number repeatedly till the second number doesn’t become 1. In the process, whenever the second number become odd, we add the first number to result (result is initialized as 0) The following is simple algorithm. 
Let the two given numbers be 'a' and 'b'
1) Initialize result 'res' as 0.
2) Do following while 'b' is greater than 0
   a) If 'b' is odd, add 'a' to 'res'
   b) Double 'a' and halve 'b'
3) Return 'res'. 
 
C++
Java
Python 3
C#
PHP
Javascript
#include <iostream>using namespace std; // A method to multiply two numbers using Russian Peasant methodunsigned int russianPeasant(unsigned int a, unsigned int b){    int res = 0; // initialize result     // While second number doesn't become 1    while (b > 0)    {        // If second number becomes odd, add the first number to result        if (b & 1)            res = res + a;         // Double the first number and halve the second number        a = a << 1;        b = b >> 1;    }    return res;} // Driver program to test above functionint main(){    cout << russianPeasant(18, 1) << endl;    cout << russianPeasant(20, 12) << endl;    return 0;}
// Java program for Russian Peasant Multiplicationimport java.io.*; class GFG{    // Function to multiply two    // numbers using Russian Peasant method    static int russianPeasant(int a, int b)    {        // initialize result        int res = 0;           // While second number doesn't become 1        while (b > 0)        {             // If second number becomes odd,             // add the first number to result             if ((b & 1) != 0)                 res = res + a;              // Double the first number            // and halve the second number            a = a << 1;            b = b >> 1;        }        return res;    }         // driver program    public static void main (String[] args)    {        System.out.println(russianPeasant(18, 1));        System.out.println(russianPeasant(20, 12));    }} // Contributed by Pramod Kumar
# A method to multiply two numbers# using Russian Peasant method # Function to multiply two numbers# using Russian Peasant methoddef russianPeasant(a, b):     res = 0 # initialize result     # While second number doesn't    # become 1    while (b > 0):             # If second number becomes        # odd, add the first number        # to result        if (b & 1):            res = res + a         # Double the first number        # and halve the second        # number        a = a << 1        b = b >> 1         return res # Driver program to test# above functionprint(russianPeasant(18, 1))print(russianPeasant(20, 12))# This code is contributed by# Smitha Dinesh Semwal
// C# program for Russian Peasant Multiplicationusing System; class GFG {         // Function to multiply two    // numbers using Russian Peasant method    static int russianPeasant(int a, int b)    {        // initialize result        int res = 0;         // While second number doesn't become 1        while (b > 0) {                         // If second number becomes odd,            // add the first number to result            if ((b & 1) != 0)                res = res + a;             // Double the first number            // and halve the second number            a = a << 1;            b = b >> 1;        }        return res;    }     // driver program    public static void Main()    {        Console.WriteLine(russianPeasant(18, 1));        Console.WriteLine(russianPeasant(20, 12));    }} // This code is contributed by Sam007.
<?php// PHP Code to multiply two numbers// using Russian Peasant method // function returns the resultfunction russianPeasant($a, $b){         // initialize result    $res = 0;     // While second number    // doesn't become 1    while ($b > 0)    {                 // If second number becomes odd,        // add the first number to result        if ($b & 1)            $res = $res + $a;         // Double the first number and        // halve the second number        $a = $a << 1;        $b = $b >> 1;    }    return $res;}     // Driver Code    echo russianPeasant(18, 1), "\n";    echo russianPeasant(20, 12), "\n";     // This code is contributed by Ajit?>
<script> // A method to multiply two numbers using Russian Peasant methodfunction russianPeasant(a, b){    var res = 0; // initialize result     // While second number doesn't become 1    while (b > 0)    {             // If second number becomes odd, add the first number to result        if (b & 1)            res = res + a;         // Double the first number and halve the second number        a = a << 1;        b = b >> 1;    }    return res;} // Driver program to test above functiondocument.write(russianPeasant(18, 1)+"<br>");document.write(russianPeasant(20, 12));         // This code is contributed by noob2000.</script>
Output: 
18
240
Time Complexity: O(log2b)
Auxiliary Space: O(1)
How does this work? The value of a*b is same as (a*2)*(b/2) if b is even, otherwise the value is same as ((a*2)*(b/2) + a). In the while loop, we keep multiplying ‘a’ with 2 and keep dividing ‘b’ by 2. If ‘b’ becomes odd in loop, we add ‘a’ to ‘res’. When value of ‘b’ becomes 1, the value of ‘res’ + ‘a’, gives us the result. Note that when ‘b’ is a power of 2, the ‘res’ would remain 0 and ‘a’ would have the multiplication. See the reference for more information.Reference: http://mathforum.org/dr.math/faq/faq.peasant.htmlThis article is compiled by Shalki Agarwal. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
Smitha Dinesh Semwal
jit_t
noob2000
subham348
Bit Magic
Mathematical
Mathematical
Bit Magic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.