快速幂算法-python
  DosddciaWHNX 2023年11月02日 26 0


看了大神讲解,理论在这里:快速幂算法(全网最详细地带你从零开始一步一步优化)

例题:求整数 base 的 整数 power 次方,对整数 num_mod 取幂。

python 代码如下:

import time


def normalPower(base, power, num_mod):
    res = 1
    for i in range(int(power)):
        res = res * base % num_mod
    return res


def fastPower(base, power, num_mod):
    res = 1
    while power > 0:
        if power & 1:  # 优化掉: power % 2 == 1
            res = res * base % num_mod
        power >>= 1  # 优化掉: power = power // 2
        # base = (base * base) % num_mod
        temp_base = base % num_mod
        base = temp_base * temp_base % num_mod

    return res


if __name__ == '__main__':
    time1 = time.time()
    print(fastPower(2, int(1e8), 1000))
    print("fastPower Time:", round((time.time() - time1) * 1000, 5), 'ms')
    time2 = time.time()
    print(normalPower(2, int(1e8), 1000))
    print("normalPower Time:", round((time.time() - time2) * 1000, 5), 'ms')

输出如下: 

快速幂算法-python_算法优化

我们再把数字设大一点

print(fastPower(int(1e200), int(1e100), 1000))

快速幂算法-python_与运算_02

耗时依旧是 0.0ms。

我们分析一下

1、首先是矩阵快速幂,相比传统的方法,提速效果直接到毫秒级别。

2、“位运算”优化掉除以2的运算
power >>= 1  # 优化掉: power = power // 2

3、“与运算”优化掉偶数判断
if power & 1:  # 优化掉: power % 2 == 1

4、这里是我个人做的优化,考虑到 base 的值可能很大的情况

# 下面两行优化掉 base = (base * base) % num_mod
         temp_base = base % num_mod
         base = temp_base * temp_base % num_mod

整体优化过后,基本上找不到超过 0.0ms 的案例了。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Fnpj8K6xSCR   2024年05月17日   89   0   0 Python
  xKQN3Agd2ZMK   2024年05月17日   67   0   0 Python
  fwjWaDlWXE4h   2024年05月17日   35   0   0 Python
  Ugrw6b9GgRUv   2024年05月17日   39   0   0 Python
DosddciaWHNX