From 88b0e15b52b9f1402e04703fdd9dea73a51d47c0 Mon Sep 17 00:00:00 2001 From: Mohnish Deshpande <77594965+mohnishdeshpande@users.noreply.github.com> Date: Fri, 2 Sep 2022 01:40:21 +1000 Subject: [PATCH] chore(CPlusPlus): add binary power on maths algorithm (#810) Co-authored-by: angshudas Co-authored-by: Mohnish Deshpande --- algorithms/CPlusPlus/Maths/binary-power.cpp | 56 +++++++++++++++++++++ algorithms/CPlusPlus/README.md | 1 + 2 files changed, 57 insertions(+) create mode 100644 algorithms/CPlusPlus/Maths/binary-power.cpp diff --git a/algorithms/CPlusPlus/Maths/binary-power.cpp b/algorithms/CPlusPlus/Maths/binary-power.cpp new file mode 100644 index 00000000..4362dfa0 --- /dev/null +++ b/algorithms/CPlusPlus/Maths/binary-power.cpp @@ -0,0 +1,56 @@ +#include +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: "<>base>>power; + cout<