每日练习之矩阵乘法——斐波那契公约数

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 每日练习之矩阵乘法——斐波那契公约数

斐波那契公约数

题目描述

运行代码

#include <iostream>
#include <vector>
using namespace std;
const long long mod = 1000000007;// 矩阵乘法函数
vector<vector<long long>> matrixMultiply(const vector<vector<long long>>& A, const vector<vector<long long>>& B) {
    int n = A.size();
    vector<vector<long long>> C(n, vector<long long>(n, 0));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            for (int k = 0; k < n; ++k) {
                C[i][j] = (C[i][j] + (A[i][k] * B[k][j]) % mod) % mod;
            }
        }
    }
    return C;
}
// 矩阵快速幂
vector<vector<long long>> matrixPower(vector<vector<long long>> base, long long exp) {
    int n = base.size();
    vector<vector<long long>> res(n, vector<long long>(n, 0));
    for (int i = 0; i < n; ++i) res[i][i] = 1;    
    while (exp > 0) {
        if (exp % 2 == 1) {
            res = matrixMultiply(res, base);
        }
        base = matrixMultiply(base, base);
        exp /= 2;
    }
    return res;
}
// 计算斐波那契数列第n项
long long fibonacci(long long n) {
    if (n <= 1) return n;
    vector<vector<long long>> F = {{1, 1}, {1, 0}};
    F = matrixPower(F, n - 1);
    return F[0][0];
}
int main() {
    int n;
    while(cin>>n){
         cout<<fibonacci(n) << endl;
    }
    return 0;
}
注意点:代码为AI改进后代码

自己写的代码数据范围不足

代码思路

1. 引入头文件和命名空间

#include <iostream>
#include <vector>
using namespace std;
  • #include <iostream> 用于标准输入输出操作,如 cout
  • #include <vector> 引入向量容器,用于存储矩阵。
  • using namespace std; 允许直接使用标准库中的名字,而无需加std::前缀。

2. 定义常量和类型

定义模数mod为1,000,000,007,用于取余运算,防止大整数溢出。

3. 矩阵乘法函数

vector<vector<long long>> matrixMultiply(const vector<vector<long long>>& A, const vector<vector<long long>>& B) {...}

这个函数接收两个二维矩阵作为参数,返回它们的乘积矩阵。计算过程中每个元素都是两矩阵对应元素乘积的累加和,并对mod取余,确保结果不会溢出。

4. 矩阵快速幂函数

vector<vector<long long>> matrixPower(vector<vector<long long>> base, long long exp) {...}

这个函数实现了矩阵的快速幂算法,用于高效计算矩阵的高次幂。它递归地将指数减半并平方矩阵,直到指数降为1或0,然后通过矩阵乘法累积结果。这种方法大大减少了计算量,尤其是在处理大指数时。

5. 斐波那契数列计算函数

long long fibonacci(long long n) {...}

此函数计算斐波那契数列的第n项。它首先判断n是否小于等于1,如果是,则直接返回n(因为F(0)=0, F(1)=1)。否则,它使用一个表示斐波那契数列生成规则的矩阵[[1,1],[1,0]],通过调用matrixPower函数计算该矩阵的(n-1)次幂,最终结果即为斐波那契数列的第n项。

6. 主函数

int main() {
    int n;
    while(cin>>n){
         cout<<fibonacci(n) << endl;
    }

主函数初始化输入多组数据n;调用fibonacci(n)函数计算结果,并将计算结果(已对1,000,000,007取模)输出到控制台。

整个程序利用了矩阵快速幂的高效性来解决大数下的斐波那契数列计算问题,非常适合处理此类大规模的计算需求。

矩阵乘法函数

定义

矩阵乘法是一种基本的数学运算,它将两个矩阵相乘以产生一个新的矩阵。这个运算广泛应用于许多领域,包括计算机科学、工程、物理和统计学等,尤其是在处理线性变换、解决线性方程组、表示图形变换和在机器学习中的权重计算等方面。

从更抽象的角度看,矩阵乘法可以视为线性变换的复合。如果将矩阵视为线性空间中的线性变换,那么两个矩阵的乘积表示先进行一个变换(由第一个矩阵定义),然后再进行另一个变换(由第二个矩阵定义)。例如,在计算机图形学中,一个矩阵可能代表旋转,另一个矩阵可能代表平移,它们的乘积则代表先旋转后平移的整个变换过程。

总结起来,矩阵乘法不仅是一个数值运算,它还深刻地体现了线性代数的核心思想——线性变换的组合,这一特性使其成为描述复杂系统和解决多种数学问题的强大工具。

代码运用

用于计算两个矩阵的乘积,并且在计算过程中对结果取模以防止整数溢出:

#include <vector>
using namespace std;
// 矩阵乘法函数
vector<vector<long long>> matrixMultiply(const vector<vector<long long>>& A, const vector<vector<long long>>& B) {
    int n = A.size(); // 假设A和B都是n x n的方阵
    vector<vector<long long>> C(n, vector<long long>(n, 0)); // 初始化结果矩阵C为n x n的零矩阵
 
    for (int i = 0; i < n; ++i) { // 遍历C的行
        for (int j = 0; j < n; ++j) { // 遍历C的列
            for (int k = 0; k < n; ++k) { // 对应元素相乘累加,并对mod取余
                C[i][j] = (C[i][j] + (A[i][k] * B[k][j]) % mod) % mod; 
                // 注意:这里先进行乘法,然后对结果取模,以避免溢出
            }
        }
    }
    return C; // 返回乘积矩阵C
}

函数matrixMultiply接收两个二维向量(代表矩阵A和B),每个向量包含n个长度为n的向量(代表n x n的矩阵)。函数计算矩阵A和B的乘积矩阵C,并确保所有中间结果和最终结果都进行了取模操作,以适配大整数计算的需要,特别是在进行大量计算时,比如计算斐波那契数列的大项值。

矩阵快速幂函数

定义

矩阵快速幂是一种高效算法,用于计算矩阵的高次幂。在许多问题中,如计算斐波那契数列的某一项、处理线性递推关系等,都需要计算某个矩阵的高次幂。直接进行多次矩阵乘法会非常低效,尤其是当指数很大时。矩阵快速幂借鉴了快速幂算法的思想,通过分治策略将指数逐步减半,利用矩阵乘法的结合律减少计算量,达到在对数时间内完成计算的目的。

代码运用

#include <vector>
using namespace std;
// 矩阵快速幂函数
vector<vector<long long>> matrixPower(vector<vector<long long>> base, long long exp) {
    int n = base.size(); // 假设base是n x n的方阵
    vector<vector<long long>> res(n, vector<long long>(n, 0)); // 初始化单位矩阵I
    for (int i = 0; i < n; ++i) res[i][i] = 1; // 单位矩阵的定义
    while (exp > 0) {
        if (exp % 2 == 1) { // 如果当前指数为奇数
            res = matrixMultiply(res, base); // 将res乘以base
        }
        base = matrixMultiply(base, base); // 将base平方
        exp /= 2; // 指数减半
    }
    return res; // 返回base的exp次幂
}

这段代码中的matrixPower函数接收一个初始矩阵base(假设为n x n的方阵)和一个整数exp作为参数,计算并返回baseexp次幂(所有计算都在模mod的意义下进行,尽管此处未显式展示模运算步骤,但前面提到的matrixMultiply函数中已经包含了对结果的取模处理)。算法的核心思想是不断将指数exp除以2,同时将矩阵base自乘,直到指数降为0。当当前指数为奇数时,才将当前的矩阵结果与原矩阵相乘。这样,通过不断平方和条件性乘法,最终得到所需次幂的矩阵结果。

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
人工智能 自然语言处理 安全
从 ChatGPT 到 AI 大模型私有化部署,为什么企业需要私有化专属大模型?
目前,大模型已经能够切实的影响到我们每个人的工作、学习、生活,赋能千行万业,但是开放的大模型却无法很好的适应企业或单位的内部需要,为此,此处研究并提出为什么企业需要私有化大模型,并探讨私有化大模型的优势和挑战,同时本文也举出了一些实践落地的例子,希望能给读者带来一些思考和启发。
|
8月前
|
机器学习/深度学习 运维 算法
[WWW2024]轻量数据依赖的异常检测重训练方法LARA
阿里云计算平台大数据基础工程技术团队主导,与浙江大学合作的论文《LARA: ALight and Anti-overfitting Retraining Approach for Unsupervised Time Series Anomaly Detection 》被WWW2024收录
|
6月前
|
数据采集 数据可视化 关系型数据库
基于Python的招聘网站爬虫及可视化的设计与实现
本文介绍了一个基于Python的招聘网站爬虫及可视化系统,该系统使用Flask框架、MySQL数据库和ECharts库,针对拉勾网的Java、Python、Php职位信息进行爬取、存储和多维度数据分析,帮助求职者快速获取关键招聘信息并做出就业决策。
407 0
|
9月前
|
前端开发 JavaScript 安全
如何在React项目中动态插入HTML内容
如何在React项目中动态插入HTML内容
292 0
|
8月前
|
网络协议 NoSQL 算法
TCP协议:超时重传、流量控制、keep-alive和端口号,你真的了解吗?
【6月更文挑战第2天】本文探讨了TCP协议的关键机制,包括超时重传计算(基于SRTT和RTT),流量控制(使用滑动窗口适应接收方处理能力),TCP keep-alive(通过定期探测保持连接活性),以及端口号的作用(区分不同服务和应用)。这些内容对于理解TCP的工作原理和面试准备至关重要。
206 1
|
8月前
|
存储 NoSQL 数据挖掘
深入探索MongoDB聚合操作:解析数据之美
深入探索MongoDB聚合操作:解析数据之美
253 1
|
9月前
|
自然语言处理 数据可视化 算法
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集
|
8月前
|
存储 供应链 开发者
Python列表打造简易进销存系统:轻松管理库存信息!
Python列表打造简易进销存系统:轻松管理库存信息!
171 0
|
9月前
|
数据可视化 API 算法框架/工具
Python用T-SNE非线性降维技术拟合和可视化高维数据iris鸢尾花、MNIST 数据
Python用T-SNE非线性降维技术拟合和可视化高维数据iris鸢尾花、MNIST 数据
|
9月前
|
定位技术 数据安全/隐私保护
3分钟部署 我的世界(Minecraft) 联机服务
如何通过计算巢快速部署《我的世界(Minecraft)》联机服务
3分钟部署 我的世界(Minecraft) 联机服务

热门文章

最新文章