Raising a number to a huge exponent

前端 未结 2 830
野的像风
野的像风 2021-01-23 20:17

I am given the number 3 and a variable \'n\', that can be as high as 1 000 000 000 (a billion). I have to print the answer of 3^n modulo 100003. I tried the followi

2条回答
  •  渐次进展
    2021-01-23 21:15

    Take advantage of property of modular arithmetic

    (a × b) modulo M == ((a module M) × (b modulo M)) modulo M
    

    By using above multiplication rule

    (a^n) modulo M 
    = (a × a × a × a ... × a) modulo M 
    = ((a module M) × (a modulo M) × (a modulo M) ... × (a modulo M)) modulo M
    

    Calculate the result by divide and conquer approach. The recurrence relation will be:

    f(x, n) = 0                     if n == 0
    
    f(x, n) = (f(x, n / 2))^2       if n is even
    f(x, n) = (f(x, n / 2))^2 * x   if n is odd
    

    Here is the C++ implementation:

    int powerUtil(int base, int exp, int mod) {
        if(exp == 0) return 1;
        int ret = powerUtil(base, exp / 2, mod) % mod;
        ret = 1LL * ret * ret % mod;
        if(exp & 1) {
            ret = 1LL * ret * base % mod;
        }
        return ret;
    }
    
    double power(int base, int exp, int mod) {
        if(exp < 0) {
            if(base == 0) return DBL_MAX; // undefined
            return 1 / (double) powerUtil(base, -exp, mod);
        }
        return powerUtil(base, exp, mod);
    }
    

提交回复
热议问题