矩阵快速幂之整数快速幂
来源:互联网 发布:硬笔字帖软件 编辑:程序博客网 时间:2024/05/29 05:05
如果现在要算X^8:则 X*X*X*X*X*X*X*X 按照寻常思路,一个一个往上面乘,则乘法运算进行7次。
但如果我们这样算 (X*X)(X*X)(X*X)*(X*X)
这种求法,先进行乘法得X^2,然后对X^2再执行三次乘法,这样去计算,则乘法运算执行4次。已经比七次要少。所以为了快速算的整数幂,就会考虑这种结合的思想。
现在的问题是如何分配才能让乘法运算的次数最少。
例如:X^19次方。
19的二进制为:1 0 0 1 1 。
由(X^m)*(X^n) = X^(m+n)
则X^19 = (X^16)(X^2)(X^1)
那么怎么来求解快速幂呢。请看下列代码:
求解X^N的值。
int QuickPow(int x,int N){ int ans = 1,res = x; while(N){ if(N&1) ans *=res; res *= res; N>>=1; } return ans;}
那么让我们来看看下面这段代码到底对不对:
对于X^19来说:
19的二进制为:1 0 0 1 1
初始:ans = 1; res = x;
则10011最后一位是1,所以是奇数。
ans = res*ans = x;
res = res*res = x^2;
然后右移一位,1 0 0 1
则1001最后一位是1,所以是奇数
ans = res*ans = x*(x^2) = x^3
res = res*res = x^2*x^2 = x^4
然后右移一位,1 0 0
则最后一位是0,所以当前的数为偶数。
res = res*res = x^4*x^4 = x^8
然后右移一位,1 0
最后一位是0,当前数是偶数。
res = res*res =x^8*x^8= x^16
然后右移一位,1
最后一位是1,当前数是奇数
ans = ans*res = (x^3)*(x^16) = x^19
res = res*res = x^32
可以看出res = X^m,m 始终是与二进制位置上的权值是相对应的。当二进制位为0时,我们只让res*res使幂指数*2.对应下一个二进制位的权值,当二进制位为1时,ans = ans*res 。则乘上了该乘的X幂次。
- 矩阵快速幂之整数快速幂
- 整数快速乘法/快速幂+矩阵快速幂+Strassen算法
- 整数快速乘法/快速幂+矩阵快速幂
- 快速幂模板(整数+矩阵)
- 快速幂模板(整数+矩阵)
- 整数的快速幂和矩阵的快速幂
- 快速矩阵快速幂
- hdu2817之整数快速幂
- hdu2157之矩阵快速幂
- hdu4549之矩阵快速幂
- HDU3893之矩阵快速幂
- hdu4291之矩阵快速幂
- hdu4565之矩阵快速幂
- hdu3117之矩阵快速幂
- hdu2154之矩阵快速幂
- hdu2371之矩阵快速幂
- hdu2604之矩阵快速幂
- hdu3306之矩阵快速幂
- 基于注解spring4.*,mybatis3.*最简单的SSM整合
- A
- 算法训练 乘法表
- 在浏览器中运行Keras模型,并支持GPU
- Collection和Map
- 矩阵快速幂之整数快速幂
- 使用ansible yum依赖包,报错No module named yum
- 算法
- re
- Callable与Future
- Character 类
- 今日头条2017秋招前端工程师笔试试卷
- Java使用POI导出Word文档
- 连接Oracle数据库——接触oracle的第二天