矩阵快速幂——斐波那契数列进一步优化

news/2024/12/28 14:28:10/文章来源:https://www.cnblogs.com/dianman/p/18637483

快速幂优化矩阵幂、乘法


对于一般的矩阵计算有 \(A_{m,n}*B_{n,p}=C_{m,p}\),其中作为乘积因子的两个矩阵必须满足前因子列数与后因子行数相同

积的行数等于前因子的行数,列数等于后因子的列数 ,任意的 \(c_{i,j}\) 可由定义的计算得出 \(c_{i,j}=\sum_{k=0}^{n} a_{i,k}*b_{k,j}\)


幂运算

可以通过快速幂优化矩阵的幂乘法,即计算 \(A^k\)

struct matrix {long long mtx[N][N];matrix() { memset(mtx, 0, sizeof mtx); }
};//定义矩阵结构体

其中 matrix() { memset(mtx, 0, sizeof mtx); }可以在每次定义矩阵时,都对矩阵成员进行初始化为 \(0\)

matrix operator*(matrix& x, matrix& y) {matrix t;for (int i = 1; i <= n; i++)//行for (int j = 1; j <= n; j++)//列for (int k = 1; k <= n; k++)//当前矩阵的内数t.mtx[i][j] += x.mtx[i][k] * y.mtx[k][j];return t;
}

重载矩阵的乘法运算符,通过普遍公式计算给出

matrix matrix_quick_pow(matrix a, long long k) {//矩阵类型的快速幂计算函数matrix res;for (int i = 1; i <= n; i++) res.mtx[i][i] = 1;while (k) {if (k & 1) res = res * a;a = a * a;k >>= 1;}return res;
}

定义 res 时,需要对其进行初始化为一个单位矩阵作为乘积的基


加速斐波那契数列

对于斐波那契数列有以下通项公式 \(F_n=F_{n-1}+F_{n-2}\)

设存在矩阵 \(A\) 使得

\[\left[\begin{matrix}F_n&F_{n-1}\end{matrix}\right] = \left[\begin{matrix}F_{n-1}&F_{n-2}\end{matrix}\right] * A & A=\left[\begin{matrix}a&b\\c&d\end{matrix}\right] \]

结合通项公式,合并矩阵后等式变化为

\[\left[\begin{matrix}F_n&F_{n-1}\end{matrix}\right] = \left[\begin{matrix}F_{n-1}&F_{n-2}\end{matrix}\right] * \left[\begin{matrix}1&1\\1&0\end{matrix}\right] \]

因为\(F_1=F_2=1\) 已知,递推到底层有

\[\left[\begin{matrix}F_n&F_{n-1}\end{matrix}\right] = \left[\begin{matrix}F_{2}&F_{1}\end{matrix}\right] * \left[\begin{matrix}1&1\\1&0\end{matrix}\right]^{n-2} \]

最终可化简为

\[\begin{cases} \left[\begin{matrix}F_n&F_{n-1}\\F_{n-1}&F_{n-2}\end{matrix}\right] = \left[\begin{matrix}1&1\\1&0\end{matrix}\right]^{n-1}&(n>2) \\\\F_n=1&(n=1,2) \end{cases} \]

此时可以发现,计算斐波那契数列的各项值就只需要计算矩阵的 \(n\) 次方,结合上面的矩阵快速幂,可以做到在 \(O(\log n)\) 的时间复杂度内计算出第 \(n\)


matrix a;
init(a);
void init(matrix &a) {a.mxt[1][1] = 1;a.mxt[1][2] = 1;a.mxt[2][1] = 1;
}

初始化斐波那契矩阵

auto ans = matrix_quick_pow(a, n - 1);
cout << ans.mxt[1][1] << endl;

根据公式,最后输出第一行第一列的元素即可

完整代码:

#include <iostream>
#include <cstring>
using namespace std;const long long mod = 1e9 + 7;
long long n;struct matrix {long long mxt[3][3];matrix() { memset(mxt, 0, sizeof mxt); };
};matrix operator*(matrix& x, matrix& y) {matrix t;for (int i = 1; i <= 2; i++)for (int j = 1; j <= 2; j++)for (int k = 1; k <= 2; k++)t.mxt[i][j] = (t.mxt[i][j] + x.mxt[i][k] * y.mxt[k][j]) % mod;return t;
}void init(matrix &a) {a.mxt[1][1] = 1;a.mxt[1][2] = 1;a.mxt[2][1] = 1;
}matrix matrix_quick_pow(matrix a, long long n) {matrix res;for (int i = 0; i <= 2; i++)res.mxt[i][i] = 1;while (n){if (n & 1) res = res * a;a = a * a;n >>= 1;}return res;
}int main()
{matrix a;init(a);cin >> n;auto ans = matrix_quick_pow(a, n - 1);cout << ans.mxt[1][1] << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860386.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Navicat密码导出解密导入到DataGrip中

使用Navicat导出密码:目前使用Navicat17亲测有效使用php解密代码 <?php class NavicatPassword {protected $version = 0;protected $aesKey = libcckeylibcckey;protected $aesIv = libcciv libcciv ;protected $blowString = 3DC5CA39;protected $blowKey = null;protec…

鸿蒙原生页面高性能解决方案上线OpenHarmony社区 助力打造高性能原生应用

随着HarmonyOS NEXT的正式推出,鸿蒙原生应用开发热度高涨,数量激增。但在三方应用鸿蒙化进程中,性能问题频出。为此,HarmonyOS NEXT推出了一整套原生页面高性能解决方案,包括Nodepool、HMrouter和DataCache 三大解决方案,并上架OpenHarmony开源社区,分别针对应用页面滑动…

数值计算方法(2) 数值积分方法

+++ date = 2024-12-21T13:49:00+08:00 draft = true title = 数值计算方法(2) 数值积分方法 +++ 初次发布于我的个人文档 上一期讲了插值方法,这一次自然是要运用一下插值方法了。所以这一期的主题是用插值方法计算定积分。 机械求积方法 下面我们来介绍一下怎么用插值法来得…

AI烟雾监测识别摄像机

AI烟雾监测识别摄像机的应用范围广泛,不仅可以安装在家庭、商业建筑、工厂等场所,还可以应用于地铁、火车站等公共场所,为人们的生命财产安全提供全方位的保障。总的来说,AI烟雾监测识别摄像机作为智能化安全防范的重要工具,具有广阔的应用前景和社会意义。通过提高火灾预…

Omnissa Horizon Clients 2412 发布 - 虚拟桌面基础架构 (VDI) 和应用软件

Omnissa Horizon Clients 2412 发布 - 虚拟桌面基础架构 (VDI) 和应用软件Omnissa Horizon Clients 2412 发布 - 虚拟桌面基础架构 (VDI) 和应用软件 Omnissa Horizon,之前称为 VMware Horizon, 通过高效、安全的虚拟桌面交付增强您的工作空间 请访问原文链接:https://sysin.…

题目集7-8总结:智能家居强电电路模拟系统

一、前言 1.1 题目背景 题目集7和8以智能家居为主题,通过强电电路的模拟设计,引导我们从基本开关电路到多功能调速器和受控设备模拟的深入探索,体现了物联网技术在智能家居中的实际应用。 1.2 题目特点 知识点:涵盖开关逻辑、电路模拟、受控设备特性、并联与串联电路等核…

业务凭证与总账凭证有何异同

在企业财务管理中,"业务凭证"和"总账凭证"是两个核心概念,它们在会计核算和ERP系统中扮演着至关重要的角色。本文将深入探讨这两个概念的异同点,帮助读者更好地理解它们在记录企业经济活动、会计分录以及财务报表编制中的作用和区别。在ERP财务系统里,…

Qt - 实现HTTP服务器和HTTP客户端

1. WebSocket服务器和HTTP服务器的区别 WebSocket服务器和HTTP服务器是两种不同的服务器类型,它们在协议、连接方式和通信模式等方面有所区别。协议:HTTP服务器使用HTTP协议进行通信,而WebSocket服务器使用WebSocket协议。HTTP协议是无状态的,客户端发起请求,服务器响应请…

“代码之舟”——2024秋软工实践纪

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315这个作业的目标 回顾这一学期所完成的软工任务,总结这一学期的收获学号 102202102 王子聪引言: 在上这门课之前还没有真正的体…

Python-DdddOcr的简单使用

前言:我们在做WEB端UI自动化时,会遇到图片验证码校验的登录方式。我在之前的文章也做过介绍:https://www.cnblogs.com/TSmagic/p/16082799.html (Pillow + pytesseract + tesseract-ocr 破解简单的图形验证码)https://www.cnblogs.com/TSmagic/p/16117861.html(Python + 超…

Omnissa ThinApp 2412 - 应用虚拟化软件

Omnissa ThinApp 2412 - 应用虚拟化软件Omnissa ThinApp 2412 - 应用虚拟化软件 Omnissa ThinApp, formerly VMware ThinApp 请访问原文链接:https://sysin.org/blog/omnissa-thinapp/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.orgOmnissa ThinApp 通过将应用…

Omnissa App Volumes 4, version 2412 - 实时应用程序交付系统

Omnissa App Volumes 4, version 2412 - 实时应用程序交付系统Omnissa App Volumes 4, version 2412 - 实时应用程序交付系统 Omnissa App Volumes, formerly VMware App Volumes 请访问原文链接:https://sysin.org/blog/omnissa-app-volumes/ 查看最新版。原创作品,转载请保…