summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJBatzill <batzilljohannes@gmail.com>2015-12-01 14:06:38 +0100
committerJBatzill <batzilljohannes@gmail.com>2015-12-01 14:06:38 +0100
commit30ea30f2a7029c143aeb823a8f1a77c9f20d9e48 (patch)
treea268a6bd32fb18b5d6cc150cd7ab5d849a4008e0
parentf6b6c4c8694cd398b67ac0c2b4ad4fdf0b782c58 (diff)
added new pow_mod method and mult_pow!
Improves the old version since multiplication was able to overflow more easily!
-rw-r--r--math/modExp.cpp24
1 files changed, 17 insertions, 7 deletions
diff --git a/math/modExp.cpp b/math/modExp.cpp
index f738268..863ff4e 100644
--- a/math/modExp.cpp
+++ b/math/modExp.cpp
@@ -1,7 +1,17 @@
-ll modPow(ll b, ll e, ll p) {
- if (e == 0) return 1;
- if (e == 1) return b;
- ll half = modPow(b, e / 2, p), res = (half * half) % p;
- if (e & 1) res *= b; res %= p;
- return res;
-} \ No newline at end of file
+//0<=a,b <=n and n <= MAX(ll)/2
+ll mult_mod(ll a, ll b, ll n) {
+ if(a == 0 || b == 0) return 0;
+ if(b == 1) return a % n;
+
+ if(b % 2 == 1) return (a + mult_mod(a, b-1, n)) % n;
+ else return mult_mod((a + a) % n, b / 2, n);
+}
+
+//0<=a,b<=n and n <= MAX(ll)/2
+ll pow_mod(ll a, ll b, ll n) {
+ if(b == 0) return 1;
+ if(b == 1) return a % n;
+
+ if(b % 2 == 1) return mult_mod(pow_mod(a, b-1, n), a, n);
+ else return pow_mod(mult_mod(a, a, n), b / 2, n);
+}