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++
#include <iostream>
using namespace std;
unsigned int russianPeasant(unsigned int a, unsigned int b)
{
int res = 0;
while (b > 0)
{
if (b & 1)
res = res + a;
a = a << 1;
b = b >> 1;
}
return res;
}
int main()
{
cout << russianPeasant(18, 1) << endl;
cout << russianPeasant(20, 12) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int russianPeasant( int a, int b)
{
int res = 0 ;
while (b > 0 )
{
if ((b & 1 ) != 0 )
res = res + a;
a = a << 1 ;
b = b >> 1 ;
}
return res;
}
public static void main (String[] args)
{
System.out.println(russianPeasant( 18 , 1 ));
System.out.println(russianPeasant( 20 , 12 ));
}
}
|
Python 3
def russianPeasant(a, b):
res = 0
while (b > 0 ):
if (b & 1 ):
res = res + a
a = a << 1
b = b >> 1
return res
print (russianPeasant( 18 , 1 ))
print (russianPeasant( 20 , 12 ))
|
C#
using System;
class GFG {
static int russianPeasant( int a, int b)
{
int res = 0;
while (b > 0) {
if ((b & 1) != 0)
res = res + a;
a = a << 1;
b = b >> 1;
}
return res;
}
public static void Main()
{
Console.WriteLine(russianPeasant(18, 1));
Console.WriteLine(russianPeasant(20, 12));
}
}
|
PHP
<?php
function russianPeasant( $a , $b )
{
$res = 0;
while ( $b > 0)
{
if ( $b & 1)
$res = $res + $a ;
$a = $a << 1;
$b = $b >> 1;
}
return $res ;
}
echo russianPeasant(18, 1), "\n" ;
echo russianPeasant(20, 12), "\n" ;
?>
|
Javascript
<script>
function russianPeasant(a, b)
{
var res = 0;
while (b > 0)
{
if (b & 1)
res = res + a;
a = a << 1;
b = b >> 1;
}
return res;
}
document.write(russianPeasant(18, 1)+ "<br>" );
document.write(russianPeasant(20, 12));
</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.html
This 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
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
28 Oct, 2021
Like Article
Save Article