您的位置:首页 > 其它

矩阵快速幂模板

2016-12-01 13:31 281 查看
C++版

#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));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  namespace matrix