有关快速幂的先验知识就不说了
以 x * y5 为例,其中x为1×m向量,y为m×m矩阵
先看代码:
while(n>0){
if(n&1==1){
mul01(); // 向量乘矩阵
}
mul02(); // 矩阵乘矩阵
n>>=1;
}
循环过程如下:
n | mul01() | mul02() |
---|---|---|
5(0101) | x*y =xy | y*y=y2 |
2(0010) | y2*y2=y4 | |
1(0001) | x*y4=xy5 | y4*y4=y8 |
0(0000) |
解释如下:
把幂次写成2进制形式,图中幂次为5,每次循环都会右移一位,y也在跟着变换,只有幂次的最低位为1时,才会有mul01()。x * y5 的整个过程就是 x * y * y4
以后就不用背代码了
// 可少一步运算
while(n>1){
if(n&1==1){
mul01(); // 向量乘矩阵
}
mul02(); // 矩阵乘矩阵
n>>=1;
}
mul01();