斐波那契數列O logn 的求解方法

2021-10-19 22:54:21 字數 1426 閱讀 5607

前言

是的,沒錯,斐波那契數列除了遞推、遞迴演算法之外,還有更加高效的求解方法,那就是矩陣運算+快速冪。

思路:

可以先利用矩陣運算的性質將通項公式變成冪次形式,然後用平方倍增(快速冪)的方法求解第 n 項。

首先我們定義向量

xn=[an an−1],邊界:x1=[a1 a0]

然後我們可以找出矩陣:

a =[

1110

]a=\left[ \begin 1 & 1 \\ 1& 0 \end \right]

a=[11​

10​]

則有:xn=xn−1×a

所以:xn=x1×an−1

由於矩陣具有結合律,所以我們可以先求出 an−1%p,然後再用 x1左乘,即可求出 xn,向量 xn 的第乙個元素就是 an。

具體實現:

#include 

#include

#include

#include

#include

using namespace std;

const int mod

=1000000007

;void

mul(int a[

2], int b[

2], int c[

2]),

};for(int i =

0; i <

2; i ++

)for

(int j =

0; j <

2; j ++

)for

(int k =

0; k <

2; k ++

)for

(int i =

0; i <

2; i ++

)for

(int j =

0; j <

2; j ++

) c[i]

[j]= temp[i]

[j];

}int f_final

(long long n)

; int res[

2]=,

};int t[

2]=,

};long long k = n -1;

while

(k) int c[2]

=;for(int i =

0; i <

2; i ++

)for

(int j =

0; j <

2; j ++

)return c[0]

;}int main()

說明:

斐波那契數列求解

斐波那契數列是一種常見的數列,其滿足下面兩個條件 f0 f1 1 fn fn 1 fn 2 斐波那契數列求解def fib1 n if n 2 return 1 return fib1 n 1 fib1 n 2 不適用遞迴 python def fib2 n f1 f2 1 for i in ran...

Matlab求解斐波那契數列

下面是乙個matlab的指令碼函式,用於求解菲波那切數列,而且可以判斷輸入是否符合實際情況 function fibona n 斐波那契數列,前兩項之和等於第三項 f n f n 1 f n 2 第一項和第二項分別都是1 f 1 1,f 2 1 程式主題 if n 3 disp n warning ...

10 求解斐波那契數列

寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。答案需要取模 1e9 7 1000000007 如計算初...