快速幂

2019-05-29  本文已影响0人  八菜冰

a^n,将n表示成2的幂次和,即n = c_0 +c_12+c_22^2+...+c_n2^n
而求a^n时,只需求a^(c_0) a^(c_12)a^(c_22^2)...a^(c_n2^n)
换句话说就是将n转为二进制,例如5转为101,而101就代表c_2c_1c_0,当c为0时,a^(c2^n)为1,因此,我们只考虑c不为0的项,即求出所有c,当c不为0时,求a^(c2^n)
步骤:
对a逐次平方(由解式可以看出,乘式中每一项因子都是a的逐次平方),同时我们还需要确认c参数,即n式对2求余,确认c_0,再除以2,并向下取整,从而消去c_0,并使多项式的次数下降1,且暴露出c_1;重复进行,直至n式除以2为0,即除尽。

    def myPow(self, a, n):
        # write your code here
        ans = 1
        if n == 0:
            return 1
        if n<0:
            a = 1/a
            n = -n
        while n!=0:
            if n%2 == 1:
                ans *= a
            a *= a
            n = int(n/2)
        return ans

解释的比较乱。。也比较数学

上一篇下一篇

猜你喜欢

热点阅读