矩阵快速幂

来源:互联网 发布:opencv 分水岭算法 编辑:程序博客网 时间:2024/06/07 23:41

矩阵快速幂求斐波那契数列的第N项

#include <iostream>using namespace std;#define SIZE 2 // 矩阵大小struct CMatrix // 矩阵结构体{    int data[SIZE][SIZE]; // 数据};CMatrix multiply(const CMatrix &x, const CMatrix &y) // 矩阵乘法运算{    CMatrix result;    for (int i = 0; i < SIZE; i++)    {        for (int j = 0; j < SIZE; j++)        {            result.data[i][j] = 0; // 初始化矩阵为0矩阵        }    }    for (int i = 0; i < SIZE; i++)    {        for (int j = 0; j < SIZE; j++)        {            for (int k = 0; k < SIZE; k++)            {                result.data[i][j] += (x.data[i][k] * y.data[k][j]); // 矩阵乘法            }        }    }    return result;}CMatrix quickPower(CMatrix mat, int n) // 矩阵快速幂{    CMatrix result;    for (int i = 0; i < SIZE; i++) // 初始化矩阵为1矩阵    {        for (int j = 0; j < SIZE; j++)        {            if (i == j)            {                result.data[i][j] = 1;            }            else            {                result.data[i][j] = 0;            }        }    }    while (n > 0) // 快速幂计算    {        if (n % 2 != 0)        {            result = multiply(result, mat);        }        mat = multiply(mat, mat);        n = n / 2;    }    return result;}void printMatrix(const CMatrix &mat) // 打印矩阵{    for (int i = 0; i < SIZE; i++)    {        for (int j = 0; j < SIZE; j++)        {            cout << mat.data[i][j] << ' ';        }        cout << endl;    }}int main(){    CMatrix mat;    mat.data[0][0] = 1; // 构造斐波那契数列的变换矩阵    mat.data[0][1] = 1;    mat.data[1][0] = 1;    mat.data[1][1] = 0;    printMatrix(quickPower(mat, 40)); // 输出第40个斐波那契矩阵    return 0;}
0 0
原创粉丝点击