chore(CPlusPlus): add binary power on maths algorithm (#810)
Co-authored-by: angshudas <offangshudas123@gmail.com> Co-authored-by: Mohnish Deshpande <mohnish@pop-os.localdomain>pull/833/head
parent
a68c012fea
commit
88b0e15b52
|
@ -0,0 +1,56 @@
|
||||||
|
#include<iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
/*
|
||||||
|
The idea is to half the power on every iteration
|
||||||
|
Computes the power in log(n) operations
|
||||||
|
|
||||||
|
On every iteration:
|
||||||
|
Square the base, half the power
|
||||||
|
|
||||||
|
Special case - if power is odd:
|
||||||
|
Multiply the ans with a
|
||||||
|
Because the ODD-NUMBER % 2 == 1
|
||||||
|
|
||||||
|
Note: There will always be one iteration where power is odd
|
||||||
|
*/
|
||||||
|
|
||||||
|
long binpow(long a, long b){
|
||||||
|
long ans=1;
|
||||||
|
// while b is greater than zero, we continue the binary exponentiation
|
||||||
|
while(b>0){
|
||||||
|
// if b is odd, multiply result with base
|
||||||
|
if(b&1)
|
||||||
|
ans *= a;
|
||||||
|
// square the base
|
||||||
|
a *= a;
|
||||||
|
// half the power
|
||||||
|
b /= 2;
|
||||||
|
}
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
|
||||||
|
// source: @angshudas
|
||||||
|
long binpow_rec(long a, long b){
|
||||||
|
// a^0 = 1 [for any a]
|
||||||
|
if(b==0)
|
||||||
|
return 1;
|
||||||
|
// recursive call for a^(b/2)
|
||||||
|
long ans = binpow_rec(a, b/2);
|
||||||
|
// square the result
|
||||||
|
ans *= ans;
|
||||||
|
// if b is odd, times by a
|
||||||
|
// to cover for
|
||||||
|
if(b&1)
|
||||||
|
ans *= a;
|
||||||
|
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
long base, power;
|
||||||
|
cout<<"Enter the base and power: "<<endl;
|
||||||
|
cin>>base>>power;
|
||||||
|
cout<<base<<" ^ "<<power<<" = "<<binpow(base, power)<<endl;
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -169,6 +169,7 @@
|
||||||
- [Power of two](Maths/power-of-two.cpp)
|
- [Power of two](Maths/power-of-two.cpp)
|
||||||
- [Small numbers](Maths/small-numbers.cpp)
|
- [Small numbers](Maths/small-numbers.cpp)
|
||||||
- [Segmented Sieve](Maths/segmented-sieve-range.cpp)
|
- [Segmented Sieve](Maths/segmented-sieve-range.cpp)
|
||||||
|
- [Binary Power](Maths/binary-power.cpp)
|
||||||
|
|
||||||
# Recursion
|
# Recursion
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue