矩阵乘法

简介: 矩阵乘法

斐波那契

要计算斐波那契数列的前 ( n ) 项和,我们可以使用矩阵快速幂来解决。首先,让我们回顾一下斐波那契数列的递推关系:

F(n)=F(n−1)+F(n−2)

我们可以将这个递推关系表示为以下形式的矩阵乘法:

image.png

因此,我们可以将斐波那契数列的前 ( n ) 项和表示为以下形式的矩阵乘法:

image.png

这里,矩阵的乘法使用了矩阵快速幂算法。最后,( F(n+1) ) 就是斐波那契数列的前 ( n ) 项和。

下面是用 C++ 实现的计算斐波那契数列前 ( n ) 项和的代码:

cpp

复制代码

#include <iostream>
#include <vector>
using namespace std;
const int MOD = 1000000007; // 取模的值
// 定义矩阵结构体
struct Matrix {
    long long a, b, c, d;
};
// 矩阵乘法
Matrix multiply(Matrix m1, Matrix m2) {
    Matrix res;
    res.a = (m1.a * m2.a + m1.b * m2.c) % MOD;
    res.b = (m1.a * m2.b + m1.b * m2.d) % MOD;
    res.c = (m1.c * m2.a + m1.d * m2.c) % MOD;
    res.d = (m1.c * m2.b + m1.d * m2.d) % MOD;
    return res;
}
// 快速幂算法计算矩阵的 n 次幂
Matrix power(Matrix m, long long n) {
    Matrix res = {1, 0, 0, 1}; // 单位矩阵
    while (n > 0) {
        if (n & 1) {
            res = multiply(res, m);
        }
        m = multiply(m, m);
        n >>= 1;
    }
    return res;
}
// 计算斐波那契数列前 n 项和
long long fibonacciSum(long long n) {
    // 构建矩阵 M
    Matrix M = {1, 1, 1, 0};
    // 计算 M 的 n 次幂
    Matrix Mn = power(M, n);
    // 初始值 F(1) 和 F(2)
    long long F1 = 1;
    long long F2 = 1;
    // 计算 F(n+1)
    long long Fn_1 = (Mn.a * F2 + Mn.b * F1) % MOD;
    // 返回斐波那契数列前 n 项和
    return (Fn_1 - 1 + MOD) % MOD; // 减去 F(1) 的值并取模
}
int main() {
    long long n;
    cout << "Enter the value of n: ";
    cin >> n;
    // 计算斐波那契数列前 n 项和
    long long result = fibonacciSum(n);
    cout << "Result: " << result << endl;
    return 0;
}

这段代码中,我们使用了矩阵快速幂算法来计算矩阵 ( M ) 的 ( n ) 次幂,然后根据 ( M ) 的结果计算斐波那契数列的前 ( n ) 项和。

image.png

3.方程【算法赛】 - 蓝桥云课 (lanqiao.cn)


image.png

image.png

image.png


const int MOD = 1000000007; // 取模的值
// 定义矩阵结构体
struct Matrix {
    long long a, b, c, d;
};
// 矩阵乘法
Matrix multiply(Matrix m1, Matrix m2) {
    Matrix res;
    res.a = (m1.a * m2.a + m1.b * m2.c) % MOD;
    res.b = (m1.a * m2.b + m1.b * m2.d) % MOD;
    res.c = (m1.c * m2.a + m1.d * m2.c) % MOD;
    res.d = (m1.c * m2.b + m1.d * m2.d) % MOD;
    return res;
}
// 快速幂算法计算矩阵的 n 次幂
Matrix power(Matrix m, long long n) {
    Matrix res = {1, 0, 0, 1}; // 单位矩阵
    while (n > 0) {
        if (n & 1) {
            res = multiply(res, m);
        }
        m = multiply(m, m);
        // debug4(m.a,m.b,m.c,m.d);
        n >>= 1;
    }
    return res;
}
// 计算 F(n)
long long calculate(long long k, long long n) {
    Matrix M = {k, 1, -1, 0};
    Matrix Mn_2 = power(M, n - 2);
    
    long long F1 = k % MOD;
    long long F2 = (k * k - 2) % MOD;
    
    long long Fn = (Mn_2.a * F2 % MOD + Mn_2.c * F1 % MOD + 2*MOD) % MOD;
    return Fn;
}


相关文章
|
1天前
|
人工智能 小程序 BI
矩阵的转置、加和乘法写入C++
矩阵的转置、加和乘法写入C++
16 0
|
6月前
|
数据安全/隐私保护 C++
矩阵乘法和组合计数
矩阵乘法和组合计数
47 0
|
6月前
|
C++
线性同余方程和矩阵乘法
线性同余方程和矩阵乘法
30 0
|
8月前
|
人工智能
矩阵乘法和逆
矩阵乘法和逆
41 0
|
11月前
|
移动开发
|
11月前
|
算法
线性代数(一)矩阵和方程组
线性代数(一)矩阵和方程组
126 0
|
Python
矩阵运算
矩阵运算
99 0
|
机器学习/深度学习 人工智能
线性代数01:函数对向量、矩阵的梯度(向量、矩阵求导)
线性代数01:函数对向量、矩阵的梯度(向量、矩阵求导)
500 0
矩阵乘法的运算量计算(华为OJ)
题目地址:https://www.nowcoder.com/practice/15e41630514445719a942e004edc0a5b?tpId=37&&tqId=21293&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking 题目内容 矩阵乘法的运算量与矩阵乘法的顺序强相关。
1472 0