矩阵的快速幂(含整数的快速幂)
整数的快速幂
一个整数的幂 a^b,可以表示将b表示成二进制形式,然后,再把b的每一位数字单独拿出来,进行a的幂运算,然后再相乘。
举个例子:
a^11,11可以表示成1011,
进而a^11 =
//x是底数 n是幂指数 int quickpow(int x,int n){ int res = x; int ans = 1; while(n){ if(n&1) //位运算 ans = res * ans; res = res * res;
n >>= 1; } return ans; }
矩阵的快速幂
整体思路与整数的快速幂相同,唯一不同是,我们需要自己写一个矩阵相乘的函数,mul。
Matrix QuickPow(Matrix x,int n){ int res = x; int ans = 1; while(n){ if(n & 1) ans = mul(ans, res); res = mul(res, res); n >>= 1; } return ans; }
class Solution { public: double myPow(double x, int n) { long long nn = n; if(nn < 0) x = 1 / x, nn *= -1; double ans = 1.0; while(nn){ if(1 & nn){ ans *= x; } x *= x; nn >>= 1; } return ans; } };
矩阵快速幂的简单应用
题目描述
已知F(n)=F(n-1)+F(n-2), 且F(0) = 0, F(1) = 1,求F(10^1000000)
解题思路
可构造矩阵A 使得 [F(n),F(n-1)] = A * [F(n-1),F(n-2)]
所以[F(n), F(n-1)] = A^(n-1) * [F(n-1),F(n-2)]
利用矩阵的快速幂求得 A^(n-1),就很容易再求F(n)了