首页 > 其他 > 详细

矩阵快速幂

时间:2015-11-05 10:20:36      阅读:195      评论:0      收藏:0      [点我收藏+]

矩阵快速幂其实和常数的快速幂相似,复杂度log2(n)

比如说A^10, 10的二进制1010

也就是说A^10 = A^(2^0*0 + 2^1*1 + 2^2*0 + 2^3*1注意:荧光标记的字体刚好是利用了1010(2)从右往所数的每一个数字

算A^10的时候不用算10次,而是先算A^2, 然后算(A^2)^2;然后((A^2)^2)^2……这样就少算了很多次,

而A^10 = A^2 * ((A^2)^2)^2

上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
#define N 3

struct matrix
{
    int arr[N][N];
}origin, res;

matrix multiply(matrix x, matrix y)
{
    matrix tmp;
    memset(tmp.arr, 0, sizeof(tmp.arr));
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++)
        {
            for(int k = 0; k < N; k++)
                tmp.arr[i][j] += x.arr[i][k] * y.arr[k][j];
        }
    }
    return tmp;
}

void init()
{
    printf("随机数组如下:\n");
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++)
        {
            origin.arr[i][j] = rand() % 10;
            res.arr[i][j] = (i == j);
            printf("%8d", origin.arr[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

void cacl(int n)
{
    printf("%d次幂的计算结果如下:\n", n);
    while(n)
    {
        if(n & 1)
            res = multiply(res, origin);
        origin = multiply(origin, origin);
        n >>= 1;
    }
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++)
            printf("%8d", res.arr[i][j]);
        printf("\n");
    }
    printf("\n");
}

int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        init();
        cacl(n);
    }
    return 0;
}

 

矩阵快速幂

原文:http://www.cnblogs.com/rain-1/p/4938453.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!