斐波那契數列的性質


斐波那契遞推式:



斐波那契通項公式:

求證過程如下:



 

斐波那契和矩陣的關系:

描述這個。那還是描述矩陣和線性遞推式的關系吧

線性遞推式。即F(n)和F(n-1),F(n-2),F(n-3),F(n-4)...其階均是一次的關系。

如F(n)=2F(n-1)+F(n-2).F(n)=F(n-1)+2F(n-3)+4F(n-4)...

矩陣可以求解這樣的遞推式。也就是說可以快速計算F(n).時間復雜度可以到達log(n)級別。

 

先介紹一下我們需要用到的關於矩陣的知識。

描述矩陣規模時:n行m列。即大小為n*m.

矩陣乘法:

 


形狀上:2*2 和 2*3 的矩陣乘積后,結果是2*3的矩陣。

           即 a*b 矩陣 和 c*d的矩陣乘積結果是a*d的矩陣。             其中b和c必須相等。原因看下面。

運算法則:對於結果矩陣的第i行第j列的位置的結果是由前一個矩陣的對應的行。和后一個矩陣對應的列。對應位置       乘積和獲得的。比如第1行第1列的11.是由前矩陣的第一行(1,3)和后矩陣的第一列(2,3)對應位置乘      積和。1*2+3*3 = 11 獲得的。如果上述b和c如果不相等。那么會有地方"失配"沒有數值可以進行      計算。不符合矩陣乘法定義。

矩陣乘法性質:

     矩陣乘法不符合交換律。符合結合律。(具體不分析了。稍加思考即得。)

 

矩陣的冪運算:

即計算以下式子。


其中朴素想法可以通過一步一步矩陣乘法來獲得結果矩陣。

但是從宏觀角度上去想。我們把矩陣的乘法理解成一種普通的數的乘法。我們現在要計算數的冪。

可以類比快速冪。那么矩陣也有矩陣的快速冪。分治思想。具體實現其實就是快速冪把乘法那部分改成矩陣乘法即可。代碼百度上有很多。等下我會放一份。(acdreamer矩陣的模板)

 

矩陣計算遞推式。

比如:對於F(n)=aF(n-1)+bF(n-2)

我們可以構造矩陣和矩陣

二者乘積為:

會發現經過一次乘積。我們可以獲得矩陣。那么我們再將這個矩陣乘一次

就會得到F(3),F(2)的矩陣。所以我們可以發現。只要我們將我們的初始矩陣乘我們構造出來的1,1,1,0矩陣n-1次。就能獲得F(n),F(n-1)的矩陣。然后F(n)就是我們想要的了。而乘n-1次1,1,1,0矩陣。根據結合律。我們可以讓1,1,1,0矩陣自乘n-1次。最后再乘初始矩陣即可獲得最后我們想要的結果。

即求。我們可以利用快速矩陣冪。就可以在log(n)復雜度中解決了。

 



關於斐波那契的一些恆等式:

 

 

具體證明:1~4.都是用類似的方法。我提一提。就好吧。

比如1. F(1)=F(3)-F(1) , F(2)= F(4)-F(3)。。。F(n)=F(n+2)-F(n+1)

類似的分解。然后求和就能獲得結果了。

對於5.F(n)=F(n-1)+F(n-2)

   F(n)=2F(n-2)+F(n-3)

   F(n)=3F(n-3)+2F(n-4)

   ...

   F(n)=F(m)F(n-m+1)+F(m-1)F(n-m)

對於6.是個很著名的式子。要想知道證明。百度有好多。就不贅述了。(而且現在還沒用過這個式子。)



斐波那契的數論相關:

性質1:

證明:先證明斐波那契數列相鄰兩項是互素的。

反證法:假設不互素。那么有a=gcd(F(n),F(n-1)),a>1.

    那么對於F(n)=F(n-1)+F(n-2).因為a|F(n),a|F(n-1),所以a|F(n-2).

   由於a|F(n-1),a|F(n-2).又可以獲得a|F(n-3)...可以知道a|F(1)其中。F(1)=1.

   如果a|F(1)->a|1那么與a>1不符。相鄰互素得證.(其實 a|F(2)就已經不行了.)    

   

   那么再由上面斐波那契恆等式5.可以推理。

   

   中間推導依靠一小點數論知識.觀察開始式子和結果。

   一直將上式遞推下去。結合gcd(n,m)=gcd(n-m,m).結果會是gcd(a,b) = gcd(0,gcd(a,b))

   那么就可以證明上述式子成立。

 

性質2:

證明:當n|m時。

 

  必要性也可以通過類似手法得證。

 

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<string>
 5 #include<algorithm>
 6 #define LL long long
 7 #define N 2
 8 #define MOD 100000007
 9 using namespace std;
10 
11 struct Matrix
12 {
13     LL m[N][N];
14 };
15 
16 Matrix A = {
17     1,1,
18     1,0
19 };
20 Matrix I = {
21     1,0,
22     0,1
23 };
24 Matrix multi(Matrix a,Matrix b)
25 {
26     Matrix c;
27     int i,j,k;
28     for(i=0;i<N;i++)
29     {
30         for(j=0;j<N;j++)
31         {
32             c.m[i][j] = 0;
33             for(k=0;k<N;k++)
34             {
35                 c.m[i][j] += a.m[i][k] * b.m[k][j] % MOD;
36             }
37             c.m[i][j] %= MOD;
38         }
39     }
40     return c;
41 }
42 Matrix mat_pow(Matrix A,int k)
43 {
44     Matrix ans = I,p = A; //為了 不更改I 和 A
45     while(k)
46     {
47         if(k&1)
48         {
49             ans = multi(ans,p);
50         }
51         k >>= 1;
52         p = multi(p,p);
53     }
54     return ans;
55 }
56 
57 int main()
58 {
59     int n;
60     while(scanf("%d",&n)!=EOF)
61     {
62         Matrix ans = mat_pow(A,n-1);
63         printf("%I64d\n",ans.m[0][0]);
64         
65     }
66     return 0;
67 }
Matrix

 

 

  
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM