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
Mohnish Deshpande 2022-09-02 01:40:21 +10:00 committed by GitHub
parent a68c012fea
commit 88b0e15b52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 0 deletions

View File

@ -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;
}

View File

@ -169,6 +169,7 @@
- [Power of two](Maths/power-of-two.cpp)
- [Small numbers](Maths/small-numbers.cpp)
- [Segmented Sieve](Maths/segmented-sieve-range.cpp)
- [Binary Power](Maths/binary-power.cpp)
# Recursion