快速幂/快速幂矩阵
Posted songlinxuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂/快速幂矩阵相关的知识,希望对你有一定的参考价值。
快速幂可以通过算式化简来有效的减少计算量;
例如8^5,如果不采用任何化简方式,则是8*8*8*8*8;
快速幂思想就是将指数进行分解,从而减少计算次数,参照的是二级制下的指数分离思想;
对于5,可以化为101二级制串,所以5=2^0+2^2;
所以8^5=8^1*8^4,从而有效地从五次计算化为了两次计算;
int quickpow(int a, int b) { int res = 1;//用于保存结果; int ans = a;//用来保存b的二进制次方; while (b != 0) { if (b % 2 == 1) res *= ans; ans *=ans; b /= 2; } return res; }
其中值得注意的是ans*=ans一项,由于每一次循环都是原来a^2的平方,所以就相当于a^2*a^2;
矩阵幂和快速幂的思想相同,也是利用分解思想,将矩阵进行乘积进行分解,无非是乘法被矩阵乘法进行替代;
vector<vector<int>> multi(vector<vector<int>>m1, vector<vector<int>>m2) { vector<vector<int>> m3; m3.resize(n); for (int i = 0; i < n; i++) { m3[i].resize(n); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { m3[i][j] += m1[i][k] * m2[k][j]; } } } return m3; } vector<vector<int>> quckmatrix(vector<vector<int>> m) { vector<vector<int>> ans=m; vector<vector<int>> res; res.resize(n); for (int i = 0; i < n; i++) { res[i].resize(n); } for (int i = 0; i < n; i++) { //单位矩阵 res[i][i] = 1; } while (k > 0) { //对k二进制进行操作; if (k % 2 == 1) { res = multi(res, ans); } k /= 2; ans = multi(ans, ans); } return res; }
以上是关于快速幂/快速幂矩阵的主要内容,如果未能解决你的问题,请参考以下文章