利用从左到右二进制幂算法计算二进制的幂(霍纳法则升级版,变治法)
文章目录
- 题目描述
- 一、二进制幂的计算
- 二、题解
- 1.源代码
- 2.源程序测试
- 写在最后
题目描述
7.a.应用从左到右二进制幂算法来计算 a 17 a^{17} a17
本题目来源:《算法设计与分析基础》(美)莱维汀Leviti,A.)著;潘彦译.一3版.北京:清华大学出版社,2015 (2020. 12重印) 一书中第五章(分治法)课后习题6.5的第三题的a小问,对应原书P186(读者可自行对照)
注:本章节(第六章)主要讲述的是变治法,并对霍纳法则的特性以及复杂度进行了一定的分析,从左到右的二进制幂算法是基于霍纳法则算法而演变出来的,下面对霍纳法则进行讨论。
一、二进制幂的计算
当使用霍纳法则来计算 a n a^{n} an时,霍纳法则(又称秦九韶算法)的高效率的优点就被抹掉了,在对 a n a^{n} an的计算时,无论如何提出公因子来进行计算,都无法避免退化成对a进行蛮力自乘的算法,因此,我们引入了二进制幂计算的算法。
不太懂霍纳法则的同志可戳这里百度百科:霍纳法则
这里以从左至右计算 a 13 a^{13} a13为例(对应原书P185页例2),这里 n = 13 = 110 1 2 n\,\,=\,\,13 =\,\,1101_2 n=13=11012
(将十进制转化为二进制),因此,我们有
n的二进制位 | 1 | 1 | 0 | 1 |
---|---|---|---|---|
累乘器 | a a a | a 2 × a = a 3 a^{2}\times a = a^{3} a2×a=a3 | ( a 3 ) 2 \left( a^3 \right) ^2 (a3)2 | ( a 6 ) × a \left( a^6 \right) \times a (a6)×a |
观察上述的算法,我们可以得到规律如下,用product表示累成器暂时的计算结果
p r o d u c t i = { p r o d u c t i = ( p r o d u c t i − 1 ) 2 × a , n 的第 i 位二进制为 1 p r o d u c t i = ( p r o d u c t i − 1 ) 2 , n 的第 i 位二进制为 0 (1) product_i\,\,=\,\,\begin{cases} product_i\,\,=\,\,\left( product_{i-1} \right) ^2\times a\,\,, n\text{的第}i\text{位二进制为}1\\ product_i\,\,=\,\,\left( product_{i-1} \right) ^2\,\,, n\text{的第}i\text{位二进制为}0\\ \end{cases}\tag{1} producti={producti=(producti−1)2×a,n的第i位二进制为1producti=(producti−1)2,n的第i位二进制为0(1)
这样子0101的间隔乘法其实最后会导致幂次的奇数和偶数的差异, 具体推导过程见原书第六章
即对应代码中的部分如下
for (int j = I-1; j >= 0; j--){//由于前面while存储循环的时候是从左->右对应低位->高位//故这里的代码是从后往前计算if (*(p + j) == 1)product = product * product * a;else product = product * product;}
二、题解
1.源代码
注:本代码实现过程仅仅使用int来对结果进行存储,对于一些较大幂次的计算可能不适用,读者可以自行定义能储存更多结果的数据结构或者使用高精度乘法,或者大数乘法来进行计算。
/*
Author: FeverTwice
Date: 2021 - 04 - 22
Function: 计算a的17次方PS:Homework of Algorithm lesson, Chapter 6
*/#include <iostream>
#include <cstdio>
#include <string>
#include <cmath>
using namespace std;int dec2bin(int b)
{//十进制转二进制int res = 0,j=1;while (b>0){res = res + j * (b % 2);b /= 2;j *= 10;}return res;
}int leftBrinaryExp(int a, int b) {int I = floor(log(b) / log(2));//计算b转化为二进制之后的位数,向下取整int *p = new int[I+1]; //定义动态数据组int b2 = dec2bin(b); //十进制转化为二进制int i = 0;while (b2>0){//将二进制数逐位分离*(p + i) = b2 % 10;b2 /= 10;i++;}int product = a; //二进制的最高位一定为1,初始化productfor (int j = I-1; j >= 0; j--){//由于前面while存储循环的时候是从左->右对应低位->高位//故这里的代码是从后往前计算if (*(p + j) == 1)product = product * product * a;else product = product * product;}return product;
}int main()
{cout << "请输入底数a与次数b" << endl;int a, b;//a为底数,b为次数cin >> a >> b;if (b == 0)cout << 1 << endl;else {int res = leftBrinaryExp(a, b);cout << res << endl; //输出结果}return 0;
}
2.源程序测试
注:本题源程序测试环境Visual Studio 2019
1.Test set 1
2.Test set 2
3.Test set 3
4.Test set 4
写在最后
各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟! <(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知
利用从左到右二进制幂算法计算二进制的幂(霍纳法则升级版,变治法)相关推荐
- 快速幂算法(矩阵快速幂还不是很会。。日后会更新)
PS:转载,自己写的不如人家,怕误导.转载地址:http://www.cnblogs.com/CXCXCXC/p/4641812.html 首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,按照 ...
- 算法学习三:使用霍纳规则计算多项式
霍纳规则中的算法思想 在<算法导论>第二章的思考题中,描述了利用霍纳规则计算多项式的方法.以前自己在写程序的时候都是傻傻的简单粗暴地直接上了,看到这个算法的时候眼前一亮,就多看了一些,果然 ...
- 快速幂算法(理解快速幂只需两道题)
重点看代码注释 题目 2088: [蓝桥杯]快速幂 时间限制: 1Sec 内存限制: 128MB 题目描述 给定A, B, P,求(A^B) mod P. 输入 输入共一行. 第一行有三个数,N, M ...
- 快速幂算法 超详细教程
快速幂 求幂运算 快速幂引入 快速幂 二进制 快速幂 指数折半 快速幂的应用 求幂运算 求幂运算大家都不陌生,幂是指数运算的结果,当m是正整数时nᵐ的意义为m个n相乘,n的m次幂也就是n的m次方.用代 ...
- 快速幂算法及其在动态规划中的应用(矩阵幂)
文章目录 一.快速幂算法引入 二.快速幂算法 三.快速幂算法在矩阵幂中的运算 四.LeetCode1220的快速幂做法 五.参考资料 一.快速幂算法引入 假如我们有一个需要求2^100的后三位的问 ...
- RSA密码的手动算法+快速幂算法
公钥加密方案(非对称加密算法) 1.为什么要引入公钥加密方案? 密码学中的加密方案分成对称密钥和非对称密钥(也就是我们说的公钥加密,代表加密算法是RSA加密算法). 而对称加密方法有一个特点,任何通信 ...
- printf从右向左计算,从左向右打印
printf从右向左计算,从左向右打印 1.第一个例子 #include <stdio.h>int main() {int x = 0;printf("%d,%d\n" ...
- 解决全局优化和离散问题的二进制多宇宙算法
Binary multi‑verse optimization algorithm for global optimization and discrete problems 1.摘要 多宇宙算法已经 ...
- mysql 幂运算_算法—史上最好快速幂算法讲解
前言 快速幂是什么?顾名思义,快速幂就是快速算底数的n次幂. 有多快?其时间复杂度为 O(log₂n), 与朴素的O(n)相比效率有了极大的提高. 用的多么?快速幂属于数论的范畴,本是ACM经典算法, ...
最新文章
- 往往存储与计算机硬盘或其他,硬盘是计算机系统中信息资源最重要的存储设备其所存放信息-Read.DOC...
- 使用ansible部署安装corosync+pacemaker
- qt dll 1% 不是有效的win32应用程序
- AppDelegate瘦身之服务化
- dockerfile 安装mysql_dockerfile构建mysql镜像
- 为什么分布式一定要有redis,redis的一些优缺点
- clsq客户端android,Android NDK开发之 arm_neon.h文件ABI说明
- linux接收网络数据并存存储,Linux网络设备驱动之数据接收流程(六)
- readline安装
- Java中Integer与String类型互转
- inno setup 打包脚本学习
- 网络粘包解包问题杂谈
- vue-drag-resize + html2canvas合成图片并下载
- iOS输入框禁止输入emoji表情
- C语言实现控制台窗口隐藏
- 通过2048学习自定义view(一)
- mysql命令桌面壁纸_【upupoo动态桌面壁纸和mysql-jdbc.jar哪个好用】upupoo动态桌面壁纸和mysql-jdbc.jar对比-ZOL下载...
- Google Play 上架全流程_2022年谷歌应用商店上架流程
- Android11 使用NTP同步时间
- python123测试4四位玫瑰数_心理测试:4朵玫瑰,你最喜欢哪一朵?测测你这辈子会有多少情债...