大数幂求模 Fast modular exponentiation

问题:求,其中,,可能都是非常大的数(级别)

基本性质:

对于这种幂指数求模的情况,如果其中的数非常大,特别是指数很大的情况下,一般的计算设备都无法直接求出结果,因为可能非常大,超出了计算设备的存储范围(比如长整型最大能表示的数为)。这就需要一些技巧来求大数的模。

求解该问题的核心思想是将指数分解为2的整数次幂求和的形式,并使用基本性质3。例如:

假设为2的整数次幂的形式,那么

同理

依次类推,可以得到

而如果不是2的整数次幂的形式,我们可以把分解为若干个2的整数次幂求和的形式。比如,写成二进制的形式为,因此,

// java example
public long powMod(long a, long b, long m) {
    if (m == 1) return 0;
    if (b == 0) return 1;
    if (b == 1) return a;
    long x = powMod(a, b/2, m);
    x = x * x % m;
    if(b % 2 == 1) x = x * a % m;
    return x;
}

reference

Table of Contents