快速幂算法-python

news/2024/12/27 23:31:08/

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

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

python 代码如下:

import timedef normalPower(base, power, num_mod):res = 1for i in range(int(power)):res = res * base % num_modreturn resdef fastPower(base, power, num_mod):res = 1while power > 0:if power & 1:  # 优化掉: power % 2 == 1res = res * base % num_modpower >>= 1  # 优化掉: power = power // 2# base = (base * base) % num_modtemp_base = base % num_modbase = temp_base * temp_base % num_modreturn resif __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')

输出如下: 

我们再把数字设大一点

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

耗时依旧是 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 的案例了。


http://www.ppmy.cn/news/1130654.html

相关文章

C理解(一):内存与位操作

本文主要探讨C语言的内存和为操作操作相关知识。 冯诺依曼结构和哈佛结构 冯诺依曼结构:数据和代码放在一起,便于读取和修改,安全性低 哈佛结构是:数据和代码分开存放,安全性高,读取和修麻烦 内存 内存是用来存储全局变量、局…

ahk系列——ahk_v2实现win10任意界面ocr

前言: 不依赖外部api接口,界面简洁,翻译快速,操作简单, 有网络就能用 、还可以把ocr结果非中文翻译成中文、同样可以识别中英日韩等60多个国家语言并翻译成中文,十分的nice 1、所需环境 windows10及其以上…

华为云云耀云服务器L实例评测 | 实例使用教学之软件安装:华为云云耀云服务器环境下安装 Docker

华为云云耀云服务器L实例评测 | 实例使用教学之软件安装:华为云云耀云服务器环境下安装 Docker 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什么华为云云耀云…

面向对象【递归方法】

文章目录 递归编写递归函数递归的工作原理常见的递归应用场景递归注意点 递归 递归是一种解决问题的方法,其中一个函数调用自身以解决较小的实例,直到达到基本情况(停止条件),然后开始返回结果。递归可以让我们更容易地…

第一百五十八回 SliverGrid组件

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了SliverList组件相关的内容,本章回中将介绍SliverGrid组件.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的SliverGrid组件是一种网格类组件,主要用来创建网格…

在windows的ubuntu LTS中安装及使用EZ-InSAR进行InSAR数据处理

EZ-InSAR(曾被称为MIESAR,即Matlab界面用于易于使用的合成孔径雷达干涉测量)是一个用MATLAB编写的工具箱,用于通过易于使用的图形用户界面(GUI)进行干涉合成孔径雷达(InSAR)数据处理…

关于 自定义的RabbitMQ的RabbitMessageContainer注解-实现原理

概述 RabbitMessageContainer注解 的主要作用就是 替换掉Configuration配置类中的各种Bean配置; 采用注解的方式可以让我们 固化配置,降低代码编写复杂度、减少配置错误情况的发生,提升编码调试的效率、提高业务的可用性。 为什么说“降低…

Java基础---第七篇

系列文章目录 文章目录 系列文章目录一、final有哪些用法?二、static都有哪些用法?三、3*0.1 == 0.3返回值是什么一、final有哪些用法? final也是很多面试喜欢问的地方,但我觉得这个问题很无聊,通常能回答下以下5点就不错了: 被final修饰的类不可以被继承 被final修饰的方法…