快速计算幂

  • 普通求幂运算
  • 快速幂算法的实现

普通求幂运算

什么是快速幂?为什么要运用快速幂?快速幂又如何成为普遍算法的呢?
快速幂其实就是将一个数n的多次幂的求解,我们会这样做。

举个例子,计算2的200次方的最后面4位数(将结果%10000)

long long normalPower(long long base,long long power){long long res=1;for(int i=1;i<=power;i++){res=res*base;}return result%1000;
}

可以带入运行一下,会发现这个结果为0???
噢~天呐,才算这么一点的数字,计算机就抗不了了!!
其实呢,我们要了解一下取模的运算法则

(a+b)%mod=(a%mod+b%mod)%mod;
(a-b)%mod=(a%mod-b%mod)%mod;
(a✖b)%mod=(a%mod✖b%mod)%mod;

没错我们会发现,可以每次求幂的过程中对两个数的运算结果取模实际等于对每个数进行取模运算后对结果进行取模。
因此呢,我们下一步就可以简化了

long long normalPower(long long base,long long power){long long res=1;for(int i=1;i<=power;i++){res=res*base;res=res%10000;}return res%10000;

然后我们再计算一下会发现结果为24!那么说明这个算法没有问题的,那么这样做的话,有100次幂,那么会进行100次的循环,那么200000000000000次方呢?来测试一下上面这种算法在oj的时间吧


#include <iostream>
#include <cmath>
#include <time.h>using namespace std;long long normalPower(long long base, long long power) {long long result = 1;for (int i = 1; i <= power; i++) {result = result * base;result = result % 1000;}return result % 1000;
}int main() {clock_t start, finish;//clock_t为CPU时钟计时单元数long long base, power;cin >> base >> power;start = clock();//clock()函数返回此时CPU时钟计时单元数cout << normalPower(base, power) << endl;finish = clock();//clock()函数返回此时CPU时钟计时单元数cout << "the time cost is" << double(finish - start) / CLOCKS_PER_SEC;//程序运行花费的CPU时钟单元数量等于inish与start的差值,再除每秒CPU的时钟单元,程序耗时就出来了return 0;

我们会发现会将近用了18秒的时间呀!

快速幂算法的实现

在中学的时候,我们就会开始接触幂的概念,我们再复习一下幂的概念:
幂(power)是指数运算的结果。当m为正整数时,nm指该式意义为m个n相乘。当m为小数时,m可以写成a/b(其中a、b为整数),nm表示n^a再开b次根号。 [1] 当m为虚数时,则需要利用欧拉公式 eiθ =cosθ+isinθ,再利用对数性质求解。 [2] 把n^m看作乘方的结果,叫做n的m次幂,也叫n的m次方。
作为伟大的编程员,在这里底数我们用的base所表示,指数用的是power来表示,~ o( ̄▽ ̄)o
而快速幂的实现呢,可以从扩大底数base,减小指数power来缩小循环的时间
例如:2的100次方 就转换为 4的50次方
然后我们再看看,100次的循环就变成了50次的循环!在时间复杂度上就降低了一半!!
然后我们再进行一次转换, 4的50次方就变成了 16的25次方! 从100次的循环变成了25次的循环!
依次下去,会发现时间复杂度 从O(N)变成到O(logN)
按照这个算法,快速幂的实现就成功了
偶数次幂:

            power = power / 2;//把指数缩小为一半base = base * base % 1000;//底数变大成原来的平方

奇数次幂:

            power = power - 1;//把指数减去1,使其变成一个偶数res = res * base % 1000;//此时记得要把指数为奇数时分离出来的底数的一次方收集好power = power / 2;//此时指数为偶数,可以继续执行操作base = base * base % 1000;

要注意奇数次幂的情况下,单独分离一个指数出来,记录这个结果,与偶数次的底数相加起来就得到结果了
上完整代码:


long long fastPower(long long base, long long power) {long long res = 1;while (power > 0) {if (power % 2 == 0) {//如果指数为偶数power = power / 2;//把指数缩小为一半base = base * base % 1000;//底数变大成原来的平方} else {//如果指数为奇数power = power - 1;//把指数减去1,使其变成一个偶数result = result * base % 1000;//此时记得要把指数为奇数时分离出来的底数的一次方收集好power = power / 2;//此时指数为偶数,可以继续执行操作base = base * base % 1000;}}return result;

请注意结果返回的是res因为偶数次每次除以二,最后还是会变成1,也就会成为奇数次,结果呢就自然保存在res中了
计算一下时间,让人不可思议,竟然只花了0.002秒就求出了结果,然而普通的算法却用了将近18秒的时间才求出最后的结果。
是否对快速幂有了一种神奇的感受呢?那么赶紧来试一试吧!

运用快速幂算法(南昌理工学院ACM集训队)相关推荐

  1. ACM暑假培训第三周学习总结----出自南昌理工学院ACM集训队

    8月2日 1.unsigned long long输出的时候可以使用 %llu 或者 %I64u 2.long long本质上还是整型,只不过是一种超长的整型 int型:32位整型,取值范围为[-2^ ...

  2. java位运算求幂,程序员必学:快速幂算法

    前阵子,有小伙伴在我B站的算法教程底下留言 小伙伴们有任何疑问或者希望我解说任何内容,都可以在我的小我私家B站或民众号(xmg_mj)留言哦,我会尽我最大能力.只管抽时间去写文章\录视频来回应人人. ...

  3. mysql 幂运算_算法—史上最好快速幂算法讲解

    前言 快速幂是什么?顾名思义,快速幂就是快速算底数的n次幂. 有多快?其时间复杂度为 O(log₂n), 与朴素的O(n)相比效率有了极大的提高. 用的多么?快速幂属于数论的范畴,本是ACM经典算法, ...

  4. 快速幂算法(C++)

    基本概念 什么是快速幂呢?个人理解,就是更快速的计算幂运算. 比如计算a^b 刚学这个算法的时候我也很疑惑,幂运算不是有现成的公式么,直接pow(a,b)不就好了吗? 后来才明白,pow(a,b)的时 ...

  5. 六十八、快速幂算法、牛顿迭代法、累加数组+二分查找的变形

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 上次介绍了二分查找算法及其四个变形问题,下面介绍二分法常用的场景和典 ...

  6. 快速幂算法相关题目(Leetcode题解-Python语言)

    50. Pow(x, n) 快速幂算法的目的,就是快速计算 x 的 n 次方.基本思路是把 n 视作二进制数,则 n 可以被分解为多个 2 的幂次方之和,如 12 对应 1100 等于 0∗20+0∗ ...

  7. 【复习】快速幂算法详解

    快速幂算法 就是求一个高精度幂次取余时的一个快速算法 比如我们要求aba^bab%m的时候 应用于快速幂算法 也就是将O(n)转化为O(logn)的算法 他的原理就是: 252^525 = 2∗2∗2 ...

  8. 【算法分析与设计】快速幂算法与快速幂取模算法

    文章目录 快速幂算法 算法分析 算法实现 位运算优化 BigInteger支持 快速幂取模算法 算法优点 算法推导 算法实现 BigInteger支持 本文完整代码实现(Java语言描述) 快速幂算法 ...

  9. python快速幂算法解决大数取模

    1.前置性质 模运算的性质 [(a mod n)×(b mod n)] mod n = (a×b) mod n 指数可以拆分成二进制的形式,如9拆分成 1001 根据二进制的计算,1001 = ((1 ...

最新文章

  1. Java Robot对象实现服务器屏幕远程监视
  2. 令人拍案叫绝的Wasserstein GAN
  3. MIT新研究:过去80年,算法效率提升到底有多快?
  4. JSP + AJAX 打造簡單聊天室
  5. MySQL 常用30种SQL查询语句优化方法
  6. ac1900 linksys 恢复_把变砖的Linksys-AC1900路由器救活
  7. 【实用】MAC电脑如何进行截图,mac下QQ截图工具的用法
  8. Python中迭代函数chain
  9. cdh5.9运行mapreduce uber任务报java.lang.RuntimeException: native snappy library not available错误
  10. 转型之路:从数字化到数智化〡数智洞察
  11. 如何量个量化策略的好坏
  12. 宝可梦世界无限极服务器密码,宝可梦世界无极限
  13. verilog 笔试题
  14. 让我摘下星星送给你_抖音摘下星星给你是什么歌_抖音想摘下星星给你歌名是什么_好特教程...
  15. 四大桌面虚拟化解决方案大PK
  16. 黄淮学院计算机类专业属于几本,黄淮学院是几本院校
  17. PLSQL的存储过程和函数
  18. 六种电脑快捷键操作让你的效率比以前更高
  19. 单片微型计算机原理及应用第三版答案胡乾斌,单片微型计算机原理-胡乾斌--课后习题答案...
  20. page页面跳转到子页面和category页面跳转到子页面有区别:

热门文章

  1. HTML5中的数字类型的输入框:数字选择器
  2. ofo 小黄车到底是怎么黄掉的?
  3. SystemOut.log中报错WLTC0017E
  4. Kali Linux 网络扫描秘籍 第一章 起步(二)
  5. ESP8266-Arduino编程实例-PAJ7620手势传感器驱动
  6. Spring Security内置过滤器详解
  7. 基于 Web 引擎技术的 Web 内容录制
  8. C++ 多态 虚函数与纯虚函数
  9. 这群开发者,每月至少能从 App store 躺骗几十万。。。
  10. jmeter工具的使用