Objective: To calculate (a^n)%MOD in O(logn) time, where a,n,MOD are constants.
Solution:
a^n = (a^(n/2) )^2 if n is even
(a^(n-1))*a is n is odd
Base cases:
a^1 = a
a^0 = 1
So we can solve this problem by recursion.
Code:
Iterative Version:
Solution:
a^n = (a^(n/2) )^2 if n is even
(a^(n-1))*a is n is odd
Base cases:
a^1 = a
a^0 = 1
So we can solve this problem by recursion.
Code:
int mod_exp(int a, int n, int MOD) { if(n == 0) return 1%MOD; else if(n == 1) return a%MOD; else if(n&1) return (a*mod_exp(a,n-1,MOD))%MOD; else { int ret = mod_exp(a,n/2,MOD); return (ret*ret)%MOD; } }Note: To take care of overflow issues, it is recommended to use long long instead of int.
Iterative Version:
LL modexp(LL a, int n, LL MOD) { if(a == 0) { if(n == 0) return 1; else return 0; } LL ret = 1; while(n > 0) { if(n&1) { ret *= a; if(ret >= MOD) ret %= MOD; } n >>= 1; a *= a; if(a >= MOD) a %= MOD; } return ret; }
can we have iterative version of this ?
ReplyDeletePosted iterative version.
Delete