用相似对角矩阵加速矩阵的幂,以斐波那契数列为例

《用相似对角矩阵加速矩阵的幂,以斐波那契数列为例》

在计算机科学和线性代数领域,矩阵的幂是一个常见而重要的问题。特别是对于大型矩阵,直接计算幂可能会变得十分耗时。然而,通过相似对角矩阵的方法,我们能够以更为高效的方式解决这个问题。本文将探讨这一方法,并以斐波那契数列为例进行说明。
这个方法要保证矩阵有n个线性无关的特征向量,所以一般在知道要计算的矩阵时,或保证矩阵满足条件后使用

参考

参考
https://zhuanlan.zhihu.com/p/138285148
扩展
https://oi-wiki.org/math/poly/linear-recurrence/

什么是相似对角矩阵?

在线性代数中,如果存在一个可逆矩阵 P P P 使得 P − 1 A P = Λ P^{-1}AP = \Lambda P1AP=Λ,其中 Λ \Lambda Λ 是对角矩阵,那么我们说矩阵 A A A 和对角矩阵 Λ \Lambda Λ 是相似的,而 P P P 就是相似变换矩阵。

矩阵的幂和斐波那契数列

考虑矩阵 A = [ 1 1 1 0 ] A = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} A=[1110],这是斐波那契数列的矩阵形式。我们知道斐波那契数列的定义是 F n + 2 = F n + 1 + F n F_{n+2} = F_{n+1} + F_n Fn+2=Fn+1+Fn,其中 F 0 = 0 , F 1 = 1 F_0 = 0, F_1 = 1 F0=0,F1=1。我们可以通过计算 A n A^n An 来得到第 n n n 个斐波那契数。

相似对角矩阵的计算

首先,我们计算矩阵 A A A 的特征值和特征向量。经过计算,我们得到特征值 λ 1 ≈ 1.618 \lambda_1 \approx 1.618 λ11.618 λ 2 ≈ − 0.618 \lambda_2 \approx -0.618 λ20.618,以及对应的特征向量。通过构建相似矩阵 P P P 和对角矩阵 Λ \Lambda Λ,我们有了相似对角矩阵的形式。

P = [ 1 + 5 2 1 − 5 2 1 1 ] P = \begin{bmatrix} \frac{1 + \sqrt{5}}{2} & \frac{1 - \sqrt{5}}{2} \\ 1 & 1 \end{bmatrix} P=[21+5 1215 1]

Λ = [ 1 + 5 2 0 0 1 − 5 2 ] \Lambda = \begin{bmatrix} \frac{1 + \sqrt{5}}{2} & 0 \\ 0 & \frac{1 - \sqrt{5}}{2} \end{bmatrix} Λ=[21+5 00215 ]

用相似对角矩阵加速矩阵的幂

通过相似对角矩阵的形式,我们可以高效地计算 A n A^n An。这涉及计算对角矩阵的幂,以及相似变换矩阵的逆矩阵。利用这些结果,我们可以在 O ( log ⁡ n ) O(\log n) O(logn) 的时间内得到 A n A^n An

斐波那契数列的计算

最终,我们将这个方法应用于斐波那契数列。通过计算 A n A^n An,我们可以高效地获得斐波那契数列的第 n n n 个数。这个方法相较于直接计算幂的方式在大型 n n n 值时更为高效。

示例

https://leetcode.cn/problems/climbing-stairs/description/?envType=daily-question&envId=2023-12-10

class Solution
{
public:int climbStairs(int n){if (n == 1)return 1;auto mul = [&](std::vector<std::vector<double>> a, std::vector<std::vector<double>> b){int n = a.size(), m = a.front().size(), q = b.front().size();std::vector<std::vector<double>> result(n, std::vector<double>(q, 0));for (int i = 0; i < n; i++){for (int j = 0; j < q; j++){double &res = result[i][j];for (int k = 0; k < m; k++)res += a[i][k] * b[k][j];}}return result;};int k = n;double sqrt5 = sqrt(5);std::vector<std::vector<double>> P{{(1 + sqrt5) / 2, (1 - sqrt5) / 2}, {1, 1}};std::vector<std::vector<double>> A{{pow((1 + sqrt5) / 2, k), 0}, {0, pow((1 - sqrt5) / 2, k)}};std::vector<std::vector<double>> P_{{1 / sqrt5, (-1 + sqrt5) / 2 / sqrt5}, {-1 / sqrt5, (1 + sqrt5) / 2 / sqrt5}};std::vector<std::vector<double>> Result = mul(mul(P, A), P_);return (int)Result[0][0];}
};

结论

通过相似对角矩阵加速矩阵的幂,我们在处理斐波那契数列这一经典问题时展示了这一方法的实际应用。这种技术对于解决其他矩阵幂的计算问题同样具有广泛的应用,尤其是在处理大型矩阵时。希望本文能为理解矩阵的幂和相似对角矩阵的概念提供一些启示。

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

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

相关文章

多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现RIME-CNN-…

python字符串格式化--数字精度控制和快速写法与表达式格式化

数字精度控制 我们可以使用m.n来控制数字的宽度和精度&#xff1a; m是宽度&#xff0c;设置必须为数字&#xff0c;且如果设置的数字小于本身&#xff0c;则不生效n控制小数点精度&#xff0c;必须为数字&#xff0c;会进行四舍五入 示例&#xff1a; 5d&#xff1a;是将宽…

idea本地调试hadoop 遇到的几个问题

1.DEA对MapReduce的toString调用报错&#xff1a;Method threw ‘java.lang.IllegalStateException‘ exception. Cannot evaluate org.apache.hadoop.mapreduc 解决方法&#xff1a;关闭 IDEA 中的启用“ tostring() ”对象视图 2.代码和hdfs路径都对的情况下&#xff0c;程序…

架构设计系列之基础:初探软件架构设计

11 月开始突发奇想&#xff0c;想把自己在公司内部做的技术培训、平时的技术总结等等的内容分享出来&#xff0c;于是就开通了一个 Wechat 订阅号&#xff08;灸哥漫谈&#xff09;&#xff0c;开始同步发送内容。 今天&#xff08;12 月 10 日&#xff09;也同步在 CSDN 上开通…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《面向微电网群的云储能经济-低碳-可靠多目标优化配置方法》

这篇文章的标题涵盖了以下关键信息&#xff1a; 面向微电网群&#xff1a;研究的重点是微电网群&#xff0c;这可能指的是多个微电网系统的集合&#xff0c;而不仅仅是一个单独的微电网。微电网是指由分布式能源资源、储能系统和智能控制组成的小型电力系统&#xff0c;通常能够…

记录每日LeetCode 406.根据身高重建队列 Java实现

题目描述&#xff1a; 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构…

《C++新经典设计模式》之附录A 类和对象

《C新经典设计模式》之附录A 类和对象 A.1 静态对象的探讨与全局对象的构造顺序A.1.1 静态对象的探讨A.1.1.cpp A.1.2 全局对象的构造顺序问题A.1.2.cpp A.2 拷贝构造函数和拷贝赋值运算符A.2.1 拷贝构造函数和拷贝赋值运算符的书写A.2.1.cpp A.2.2 对象自我赋值产生的问题A.2.…

实现加盐加密方法以及java nio中基于MappedByteBuffer操作大文件

自己实现 传统MD5可通过彩虹表暴力破解&#xff0c; 加盐加密算法是一种常用的密码保护方法&#xff0c;它将一个随机字符串&#xff08;盐&#xff09;添加到原始密码中&#xff0c;然后再进行加密处理。 1. 每次调用方法产生一个唯一盐值&#xff08;UUID &#xff09;密码…

UDS诊断 10服务

文章目录 简介诊断会话切换请求和响应1、请求2、子功能3、肯定响应4、否定响应5、特殊的NRC 为什么划分不同会话报文示例UDS中常用 NRC参考 简介 10服务&#xff0c;即 Diagnostic Session Control&#xff08;诊断会话控制&#xff09;服务用于启用服务器中的不同诊断会话&am…

(四) python门面模式

文章目录 4.1 结构型设计模式4.1.1 简介4.1.2 常见的几种结构型设计模式 4.2 理解门面设计模式4.2.1 门面设计模式概述4.2.2 门面设计模式的作用 4.3 UML类图4.3.1 门面4.3.2 系统4.3.3 客户端 4.4 门面模式的代码实现4.4.1 场景&#xff1a;4.4.2 python实现 4.5 原理&#xf…

Compose for iOS:kotlin 与 swift 互操作

前言 类似于 Android 上的 compose&#xff0c;在 iOS 上的 compose 同样支持嵌套显示 compose UI 和 swiftUI 或是 uikit 。 但是不同于 Android 原生就是使用 kotlin 作为开发语言&#xff0c;iOS 的开发语言是 swift 或者 object-c 。虽然大多数业务逻辑都可以直接使用 ko…

渲染(iOS渲染过程解析)

渲染 渲染原理 一个硬核硬件科普视频 CPU和GPU CPU&#xff08;Central Processing Unit&#xff09;&#xff1a;现代计算机整个系统的运算核心、控制核心&#xff0c;适合串行计算。GPU&#xff08;Graphics Processing Unit&#xff09;&#xff1a;可进行绘图运算工作的…

安防音频接口选型的高性能国产芯片分析

在人工智能兴起之后&#xff0c;安防市场就成为了其全球最大的市场&#xff0c;也是成功落地的最主要场景之一。对于安防应用而言&#xff0c;智慧摄像头、智慧交通、智慧城市等概念的不断涌现&#xff0c;对于芯片产业催生出海量需求。今天&#xff0c;我将为大家梳理GLOBALCH…

springboot_3.2_freemark_基础环境配置

springboot_3.2_freemark_基础环境配置 一、前言二、环境三、相关资料四、目标五、默认配置项六、构建springboot 3.2项目6.1 pom.xml 内容&#xff1a;6.2 启动类6.3 添加ftlh模板6.4 controller内容6.5 bootstrap.yml配置 七、总结 一、前言 FreeMarker 是一款模板引擎&…

Linux——缓冲区与实现C库的fopen,fwrite,fclose

目录 一.缓冲区 1缓冲区的概念 2.缓冲区存在的意义 3.缓冲区刷新策略 4.什么是刷新&#xff1f; C语言的缓冲区在哪里&#xff1f; ​编辑 仿写C库里的fopen&#xff0c;fclose&#xff0c;fwrite。 mystdio.h mystdio.c main.c(向文件中写入20次msg) 一.缓冲区 1…

b站pwn的学习总结

写的很乱 1.c语言的运行过程 了解了c语言需要经过以上2个过程&#xff08;编译和汇编&#xff09;&#xff0c;才能让机器按指令运行。机器只能听得懂机器码&#xff0c;所以要“汇编”。 那问题就来了&#xff0c;“编译”这个动作有啥用&#xff0c;c语言这种高级语言&…

玩转大数据10:深度学习与神经网络在大数据中的应用

目录 1. 引言&#xff1a;深度学习和神经网络在大数据中的重要性和应用场景 2. 深度学习的基本概念和架构 3. Java中的深度学习框架 3.1. Deeplearning4j框架介绍及Java编程模型 3.2. DL4J、Keras和TensorFlow的集成 4. 大数据与深度学习的结合 4.1. 大数据与深度学…

电脑端同时登录多个微信

1、建立一个txt文件 2、右击微信查看应用的属性&#xff0c;记录文件的位置 3、将步骤二得到的路径按照下方的格式输入到步骤一的文本中 4、保存之后将文本后缀名的.txt改成.bat 5、在未登录微信的情况下&#xff0c;双击即可得到两个微信登录窗口

Python高级算法——回溯法(Backtracking)

Python中的回溯法&#xff08;Backtracking&#xff09;&#xff1a;高级算法解析 回溯法是一种通过尝试所有可能的解来找到问题解的算法设计方法。它通常应用于组合问题、排列问题、子集问题等。在本文中&#xff0c;我们将深入讲解Python中的回溯法&#xff0c;包括基本概念…

解决oracle.sql.TIMESTAMP序列化转换失败问题 及 J2EE13Compliant原理

目录 报错现象报错内容处理方法Oracle驱动源码总结 报错现象 oracle表中存在TIMESTAMP类型的列时&#xff0c;jdbc查出来做序列化时报错 报错内容 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframewo…