數論整理之特殊數one:斐波那契數列

數論整理

特殊數方面:

p.s. :黃金分割0.6180339887

①斐波那契數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368(等於將楊輝三角同一斜行的數加起來)

eg:兔子生孩子的增長方式 F(n) = F(n - 1)+F(n - 2)

通項公式 在這裏插入圖片描述
在這裏插入圖片描述
特性:平方與前後項:從第二項開始,每個偶數項的平方都比前後兩項之積少1,每個奇數項的平方和都比前後兩項之積多1
在這裏插入圖片描述
應用:

one:矩形面積:前幾項的平方和可以看成不同大小的正方形,由於斐波那契的遞推公式可以拼成大的矩形。在這裏插入圖片描述
得恆等式:在這裏插入圖片描述
two:每3個連續的數中有且只有一個被2整除,

img

每4個連續的數中有且只有一個被3整除,

每5個連續的數中有且只有一個被5整除,

每6個連續的數中有且只有一個被8整除,

每7個連續的數中有且只有一個被13整除,

每8個連續的數中有且只有一個被21整除,

每9個連續的數中有且只有一個被34整除,

three:尾數循環個位數是60步的循環,進一步,斐波那契數列的最後兩位數是一個300步的循環,最後三位數是一個1500步的循環,最後四位數是一個15000步的循環,最後五位數是一個150000步的循環。

拓拓拓拓:
斐波那契–盧卡斯數列:如1,4,5,9,14,23…,因爲1,4開頭,可記作F[1,4],斐波那契數列就是F[1,1],盧卡斯數列就是F[1,3],斐波那契—盧卡斯數列就是F[a,b]。

eg:1 3 4 7 11 18……盧卡斯數列的通項公式爲 f(n)=[(1+√5)/2] ^ n+[(1-√5)/2] ^ n

特殊聯繫:F(n)*L(n)=F(2n),及L(n)=F(n-1)+F(n+1)
在這裏插入圖片描述

任意兩個或兩個以上斐波那契—盧卡斯數列之和或差仍然是斐波那契—盧卡斯數列。如:F[1,4]n+F[1,3]n=F[2,7]n,F[1,4]n-F[1,3]n=F[0,1]n=F[1,1](n-1),F[1,4]數列:|4 * 4-1 * 5|=11

任何一個斐波那契—盧卡斯數列都可以由斐波那契數列的有限項之和獲得。中間項的平方數與前後兩項之積的差的絕對值是一個恆值。

f(n) = f(n-1) * p + f(n-2) * q,稱爲廣義斐波那契數列。

當p=1,q=2時,我們得到佩爾—勾股弦數(跟邊長爲整數的直角三角形有關的數列集合)。

當p=2,q=-1時,我們得到等差數列。其中f1=1,f2=2時,我們得到自然數列1,2,3,4…。自然數列的特徵就是每個數的平方與前後兩數之積的差爲1(等差數列的這種差值稱爲自然特徵)。

//遞歸算法優化
# include <iostream>
# include <cstdio>
# define MAX (101)
using namespace std;
int a[MAX];
int f(int n){
    if(a[n]!=-1) return a[n];
    else{
        a[n]=f(n-1)+f(n-2);
        return a[n];
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<=MAX-1;i++){        //初始化 
        a[i]=-1;
    }
    a[0]=0;a[1]=1;
    printf("%d",f(n));
    return 0;
}
//高精度計算
char sum[1200];
int s=0,m=0,n;
int main()
{
    cin>>n;
    string s1,s2;
    int a[1200],b[1200];
    int he,i;
 
    s1="0";
    s2="1";
    for(m=2;m<n;m++)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        a[0]=s1.length();
        for(i=1;i<=a[0];i++)
        {
            a[i]=s1[a[0]-i]-'0';
        }
        b[0]=s2.length();
        for(i=1;i<=b[0];i++)
        {
            b[i]=s2[b[0]-i]-'0';
        }
        he=(a[0]>b[0]?a[0]:b[0]);
        for(i=1;i<=he;i++)
        {
            a[i]+=b[i];
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        he++;
        while((a[he]==0)&&(he>1))
        he--;
            for(i=he,s=0;i>=1;i--,s++)
            {
                sum[s]=a[i]+'0';
            }
        s1=s2;
        s2=sum;
    }
    cout<<s2<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章