1. 程式人生 > >淺談斐波那契數列——從遞推到矩陣乘法

淺談斐波那契數列——從遞推到矩陣乘法

說在前面

相信大家都已經知道這個中外著名的費波納切數列了吧,關於費波那契數列有很多有趣的性質,但我們這裡不講,在這裡我們只是利用斐波那契數列來引出另一個神奇的東西,矩陣乘法,遞推在這裡是起一個對比與鋪墊的作用,(沒有對比就不知道矩陣乘法有多快)。

斐波那契數列

定義一個數列

F(n)=0,1Fn1+Fn2,n=0 n=1n2

遞推

遞推(我當大家都會了),但是這樣的做法時間複雜度是O(n),的,當n很大時,這個演算法就會T。

通項公式

斐波那契數列有一個通項公式,

F(n)=15×(1+52)n(152))n,直接用快速冪計算兩個log,但是如果要取模怎麼辦?求一個非整數的逆元?通項公式似乎很難。

進入正題——矩陣乘法

知識預備:
①設

A=[110321]
B=321110
AB=[(1×3+0×2+2×1)(1×3+3×2+1×1)(1×1+0×1+2×0)(1×1+3×1+1×0)]=[5412]
②設
A=[abcd]
B=[ef]
AB=[ae+cfbe+df]
有了這些東西,接下來就可以做斐波那契了,把相鄰兩項寫在一個2*1的矩陣中,
[FnFn1]=[Fn1+Fn2Fn1]=[Fn1×1+Fn2×1Fn1×1+Fn2×0]=[1110]×[Fn1Fn2]=[1110]

相關推薦

數列——矩陣乘法

說在前面 相信大家都已經知道這個中外著名的費波納切數列了吧,關於費波那契數列有很多有趣的性質,但我們這裡不講,在這裡我們只是利用斐波那契數列來引出另一個神奇的東西,矩陣乘法,遞推在這裡是起一個對比與鋪墊的作用,(沒有對比就不知道矩陣乘法有多快)。 斐波那

數列陣列,普通迴,記憶化搜尋,矩陣快速冪,和公式法

直接數列遞推推的時候是O(n)的複雜度,查詢的時候是O(1),但是當n很大的時候,陣列空間可能有點力不從心 #include <iostream> #include <cstdio> using namespace std; int fb[4

數列歸和非歸解法

err nbsp div clas pan 斐波那契 ret ror ++ //遞歸解法 function fib(n){ if(n < 1){ throw new Error(‘invalid arguments‘); }

數列歸、非歸算法)

opened 下午 之前 imp spl alt string TE pan 題目 斐波那契數,亦稱之為斐波那契數列(意大利語: Successione di Fibonacci),又稱黃金分割數列、費波那西數列、費波拿契數、費氏數列,指的是這樣一個數列:1、1、2、3、5

數列迴與非迴)

#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 1e2+10; ll a[MAXN]; ll F[MAXN]; ll f(ll n) ///遞迴 { if

Java實現數列迴、遍歷、矩陣

什麼是斐波那契數列 其實很簡單,可以理解為: F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*) 比如這樣一個數列:1、1、2、3、5、8、13、21、34、…… 有興趣可以看百度百科 下面我們就來實現,給定一個n,求f(n)的值

數列迴還是迴圈好

/** * */ /** * @author jueying: * @version 建立時間:2018-11-15 下午10:21:26 * 類說明 */ /** * @author jueying * */ public class Test12

python實現數列迴實現求第N個菲數列

斐波那契數列即著名的兔子數列:1、1、2、3、5、8、13、21、34、…… 數列特點:該數列從第三項開始,每個數的值為其前兩個數之和,用python實現起來很簡單: a=0 b=1 while b < 1000: print(b) a, b = b, a+b

【劍指offer】數列迴求解第N項

public class Solution {    public int Fibonacci(int n) {       //錯誤輸入處理       if

【劍指offer】數列歸求解第N項

非遞歸 acc 斐波那契 錯誤 bsp fibonacci 更新 off for public class Solution { public int Fibonacci(int n) { //錯誤輸入處理 if(n<0) return

數列迴與迴圈實現及複雜度分析

一、斐波那契數列的定義: 二 、遞迴實現: 經典例題(杭電2041):  AC程式碼: #include <iostream> using namespace std; int f[41]; int main() { int num,m;

數列迴與非迴的實現

0,1,1,2,3,5,8…這樣的數列稱作斐波那契數列 1、遞迴實現方式 //斐波那契數列遞迴實現 long long Fib1(long long n) { if (n<=1) retur

數列(Fibonacci)迴與非迴的效能對比

費波那契數列由0和1開始,之後的數就由之前的兩數相加 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,………. 遞迴演算法 用遞迴演算法來求值,非常好理解.虛擬碼: f(n) =

數列(二)--矩陣優化演算法

之前寫了一篇從斐波那契數列分析遞迴與動態規劃(JAVA)來優化斐波那契數列,這樣可以使演算法的時間複雜度從O(n^2)變到O(n),這是使用遞迴公式f(n)=f(n-1)+f(n-2)求斐波那契數列的最

數列高效迴求法

時間;2014.05.19 地點:圖書館 ------------------------------------------------------------------- 一、簡述   前面給出了一種斐波那契數列解法的矩陣冪方法,這是最高效的方法,時間複雜度為O(lo

用shell指令碼語言實現一個數列迴和非迴版本

程式碼: #!/bin/bash -x #第一種寫法 #first=1 #second=1 #last=1 # #if [ $1 -le 2 ];then # echo 1 #fi # #i=3 #while [ $i -le $1 ] #do # let last=

PHP實現數列迴 + 非迴)實現

斐波那契數列: 1 1 2 3 5 8 13 21 34 55 … 概念: 前兩個值都為1,該數列從第三位開始,每一位都是當前位前兩位的和 規律公式為: Fn = F(n-1) + F(n+1) F:指當前這個數列 n:指數列的下標 非遞迴寫

python實現數列迴實現求第N個菲數列

斐波那契數列即著名的兔子數列:1、1、2、3、5、8、13、21、34、…… 數列特點:該數列從第三項開始,每個數的值為其前兩個數之和,用python實現起來很簡單: a=0 b=1 while b < 1000: print(b) a, b = b

數列迴和非迴實現 —— python

# -*- coding:utf-8 -*- #遞迴實現 def Fibonacci(n): if n <= 1: return n return (Fibonac

python 關於數列迴思路

斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........數列從第3項開始,每一項都等於前兩項之和。