用相似對角矩陣加速矩陣的冪,以斐波那契數列為例

《用相似對角矩陣加速矩陣的冪,以斐波那契數列為例》

在計算機科學和線性代數領域,矩陣的冪是一個常見而重要的問題。特別是對于大型矩陣,直接計算冪可能會變得十分耗時。然而,通過相似對角矩陣的方法,我們能夠以更為高效的方式解決這個問題。本文將探討這一方法,并以斐波那契數列為例進行說明。
這個方法要保證矩陣有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 P?1AP=Λ,其中 Λ \Lambda Λ 是對角矩陣,那么我們說矩陣 A A A 和對角矩陣 Λ \Lambda Λ 是相似的,而 P P P 就是相似變換矩陣。

矩陣的冪和斐波那契數列

考慮矩陣 A = [ 1 1 1 0 ] A = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} A=[11?10?],這是斐波那契數列的矩陣形式。我們知道斐波那契數列的定義是 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 λ1?1.618 λ 2 ≈ ? 0.618 \lambda_2 \approx -0.618 λ2??0.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 ??1?21?5 ??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 ??0?021?5 ???]

用相似對角矩陣加速矩陣的冪

通過相似對角矩陣的形式,我們可以高效地計算 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.pswp.cn/news/213090.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213090.shtml
英文地址,請注明出處:http://en.pswp.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…