矩阵快速幂模板
2016-12-01 13:31
281 查看
C++版
Java版
求矩阵的乘法:
快速幂
//矩阵乘法和快速幂结合,矩阵快速幂
#include <cstdio> #include <iostream> using namespace std; const int MOD = 10000; struct matrix { int m[2][2]; }ans, base; matrix multi(matrix a, matrix b) { matrix tmp; for(int i = 0; i < 2; ++i) { for(int j = 0; j < 2; ++j) { tmp.m[i][j] = 0; for(int k = 0; k < 2; ++k) tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]) % MOD; } } return tmp; } int fast_mod(int n) // 求矩阵 base 的 n 次幂 { base.m[0][0] = base.m[0][1] = base.m[1][0] = 1; base.m[1][1] = 0; ans.m[0][0] = ans.m[1][1] = 1; // ans 初始化为单位矩阵 ans.m[0][1] = ans.m[1][0] = 0; while(n) { if(n & 1) //实现 ans *= t; 其中要先把 ans赋值给 tmp,然后用 ans = tmp * t { ans = multi(ans, base); } base = multi(base, base); n >>= 1; } return ans.m[0][1]; } int main() { int n; while(scanf("%d", &n) && n != -1) { printf("%d\n", fast_mod(n)); } return 0; }
Java版
求矩阵的乘法:
public class Main { // m 是矩阵A的行数, n是矩阵B的列数, m*n 的矩阵乘以 n*k的矩阵,结果矩阵c是m*k;; static void cal_martrixMul(double[][] a, double[][] b, double[][] c, int m, int n, int k) { for ( int i = 0 ; i < m; i++ ) { for ( int j = 0; j < k; j++ ) { for ( int l = 0; l < n; l++ ) { c[i][j] += a[i][l]*b[l][j]; } } } } public static void main(String[] args) { double[][] a = { {5, 8, 3}, {11, 0, 5} }; double[][] b = { {0, 18}, {2, 11}, {10, 3} }; double[][] c = new double[2][2]; cal_martrixMul(a, b, c, 2, 3, 2); System.out.println("结果 矩阵的各项为:"); for ( int i = 0; i < c.length; i++ ) { for ( int j = 0; j < c[i].length; j++ ) { System.out.print(c[i][j] + " "); } System.out.println(); } } }
快速幂
//快速幂 public class Main { static int fast_mod( int a, int n ) { int base = a, ans = 1; while ( n != 0 ) { if ( (n&1)!= 0) { ans = ans*base; } base = base*base; n >>= 1; } return ans; } public static void main(String[] args) { System.out.println("底数和指数a, n"); System.out.println(fast_mod(2, 10)); System.out.println(fast_mod(2, 12)); } }
//矩阵乘法和快速幂结合,矩阵快速幂
//矩阵快速幂,以整数型 为例,方便验证 public class Main { static class matrix { int[][] m = new int[2][2]; } static matrix cal_martrixMul(matrix a, matrix b) { matrix c = new matrix(); for ( int i = 0 ; i < 2; i++ ) { for ( int j = 0; j < 2; j++ ) { c.m[i][j] = 0; for ( int l = 0; l < 2; l++ ) { c.m[i][j] += a.m[i][l]*b.m[l][j]; } } } return c; } static int Mutrix_fast_mod( int n) { matrix base = new matrix(); base.m[0][0] = base.m[0][1] = base.m[1][0] = 1; base.m[1][1] = 0; //ans初始化为单位矩阵 matrix ans = new matrix(); ans.m[0][0] = ans.m[1][1] = 1; ans.m[0][1] = ans.m[1][0] = 0; while ( n != 0 ) { if ( (n&1) != 0 ) { ans = cal_martrixMul(ans, base); } base = cal_martrixMul(base, base); n >>= 1; } return ans.m[0][1]; } public static void main(String[] args) { System.out.println("矩阵的n次幂是: "); Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { System.out.println("请输入n:"); int n = scanner.nextInt(); System.out.println(Mutrix_fast_mod(n)); } } }
相关文章推荐
- A Simple Math Problem(矩阵快速幂(模板))
- 51nod 1113 矩阵连乘快速幂模板 (对100000007取模)
- 矩阵快速幂模板及其应用(洛谷3390)(洛谷1962)
- 矩阵乘法以及矩阵快速幂模板
- BZOJ1009 单模板自动机 矩阵快速幂优化DP
- 【模板】矩阵快速幂
- 矩阵快速幂模板(1575)
- 【矩阵快速幂模板】
- [模板]矩阵快速幂(以hdu1757为例
- hdu 3070 Fibonacci && poj 1575 Tr A(矩阵快速幂模板题)
- poj-3982(矩阵快速幂+大数模板)
- Additions HNUST 1713(矩阵快速幂模板 )
- hdu 1005 矩阵快速幂模板题
- How many ways?? - hdu2157(矩阵快速幂-模板)
- 矩阵快速幂模板
- P3390 【模板】矩阵快速幂
- POJ3070:Fibonacci(矩阵快速幂模板题)
- Additions HNUST 1713(矩阵快速幂模板 )
- hdu5171 GTY's birthday gift 矩阵快速幂求斐波那契前n项和,矩阵快速幂模板
- hrbust 2190 矩阵快速幂模板