📜  指数平方(快速模乘法)(1)

📅  最后修改于: 2023-12-03 15:10:08.122000             🧑  作者: Mango

指数平方(快速模乘法)介绍

指数平方,也称为快速模乘法,是运用了二进制的思想,将指数以二进制拆分成“1”和“0”的组合,通过不断平方、取模和乘法,来实现快速求解幂的运算,提高程序的效率。下面将展示一段Python代码来实现该算法。

代码片段
def fast_exp(base, exponent, mod):
    """
    使用快速模乘法实现指数运算,即(base^exponent)%mod
    :param base: 底数
    :param exponent: 指数
    :param mod: 模数
    :return: 结果
    """
    result = 1
    while exponent != 0:
        if exponent & 1 == 1:
            result = (result * base) % mod
        base = (base * base) % mod
        exponent >>= 1
    return result
代码说明

上述代码中的fast_exp函数,接收三个参数 baseexponentmod,分别代表底数,指数和模数。该函数的返回值是 (base^exponent)%mod

该方法的核心思想是将指数转化为二进制形式,例如 $7$ 可以表示为 $111_2$,则

$base^7=base^{2^0+2^1+2^2}=base^{2^0}\times base^{2^1}\times base^{2^2}$

在计算过程中,需维护一个中间结果变量 result,其初值为 $1$。每次进入循环,检查指数的二进制形式的最后一位是否为1,如果为1,则将当前的 baseresult 相乘并对 mod 取模,将结果保存在 result 变量中。然后,将 base 乘以自身对 mod 取模,将结果保存在 base 变量中,指数 exponent 右移一位(即将二进制数向右移动一位),以便下一步检查指数二进制数的下一位。在这样的过程中,将指数不断的缩小,指数最终变成0时,所保存的结果即为fast_exp 返回的结果。

示例

下面是一个演示的例子,求 $3^{2019}\mod6$。

将指数2019的二进制表示为:$11111100011$。

执行过程如下:

  • $result = 1, base = 3, exponent = 2019$;
  • $exponent$ 是奇数,$result = 1\times 3\mod6 = 3$,$base=3\times3\mod6 = 3$,$exponent = 1001111000$;
  • $exponent$ 是偶数,$result = 3$,$base=3\times3\mod6=3\times3\mod6=3$,$exponent = 100111100$;
  • $exponent$ 是偶数,$result = 3$,$base=3\times3\mod6=3\times3\mod6=3$,$exponent = 10011110$;
  • $exponent$ 是偶数,$result = 3$,$base=3\times3\mod6=3\times3\mod6=3$,$exponent = 1001111$;
  • $exponent$ 是奇数,$result = 3\times3\mod6 = 3$,$base=3\times3\mod6=3\times3\mod6=3$,$exponent = 100111$;
  • ......
  • $exponent = 0$,算法结束,结果为 $3$。

经过计算,可得到 $3^{2019}\mod6 =3$。

总结

通过将指数转化为二进制数的形式,并通过平方和取模的方式来计算数值,快速模乘法提供了一种高效求解幂的算法。对于大数计算,该算法能够明显地提升程序效率,值得应用到实际项目中。