标签:tmp int res param length m2 快速
快速幂
快速幂原理:将指数变为二进制,依次右移判断最后一位是否为1。
如果为1则应该将tmp乘到res中。
如果为0,则tmp自己平方,不放入res。
比如:
\[3^{10}=3^{8}*3^{2}=3^{2^3}*3^{2^1} \]而10的二进制为1010,二进制从左往右,分别为第0位的(0),第1位的(1),第2位的(0),第3位的(1)。
求数字的幂
/**
* 使用快速幂,求矩阵的幂,矩阵m的p次方
* @param m
* @param p
* @return
*/
public int[][] matrixPower(int[][] m, int p) {
int[][] res = new int[m.length][m[0].length];
for (int i = 0; i < m.length; i++) {
res[i][i] = 1;
}
int[][] tmp = m;
// 快速幂
for (; p != 0; p >>= 1) {
if ((p & 1) != 0) {
res = muliMatrix(res, tmp);
}
tmp = muliMatrix(tmp, tmp);
}
return res;
}
求矩阵的幂
/**
* 使用快速幂,求矩阵的幂,矩阵m的p次方
* @param m
* @param p
* @return
*/
public int[][] matrixPower(int[][] m, int p) {
int[][] res = new int[m.length][m[0].length];
for (int i = 0; i < m.length; i++) {
res[i][i] = 1;
}
int[][] tmp = m;
// 快速幂
for (; p != 0; p >>= 1) {
if ((p & 1) != 0) {
res = muliMatrix(res, tmp);
}
tmp = muliMatrix(tmp, tmp);
}
return res;
}
/**
* 矩阵乘法
* @param m1
* @param m2
* @return
*/
private int[][] muliMatrix(int[][] m1, int[][] m2) {
int[][] res = new int[m1.length][m2[0].length];
for (int i = 0; i < m1.length; i++) {
for (int j = 0; j < m2[0].length; j++) {
for (int k = 0; k < m2.length; k++) {
res[i][j] += m1[i][k] * m2[k][j];
}
}
}
return res;
}
标签:tmp,int,res,param,length,m2,快速 来源: https://www.cnblogs.com/keboom/p/14840833.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。