扩展Fibonacci数

本文介绍了一种利用矩阵快速求解扩充Fibonacci数的算法,通过迭代运算优化时间复杂度至O(n),并提供了两种实现方式:直接迭代法和矩阵快速幂法。同时,解释了算法背后的数学原理,包括递推关系和矩阵表示,并通过实例演示了如何应用这些概念解决实际问题。
部署运行你感兴趣的模型镜像

问题描述:

定义一组叫做扩充的Fibonacci数如下,己知X与Y 两个数,于是扩充Fibonacci数Fi为:
Fi=11XFi2+YFi1i=1i=2i>2
因此,当X=Y=l 时,这一组扩充的Fibonacci 数就变成一般的Fibonacci 数了,现在请写一个函数,
接收一个n 值,不用数组与递归的方法算出下面的结果:
F0Fn+F1Fn1++FiFni++Fn1F1+FnF0

#include<iostream>
using namespace std;

/*
定义一组叫做扩充的Fibonacci数如下,己知X与Y 两个数,于是扩充Fibonacci数Fi为:
   | 1, i=1
Fi=| 1, i=2
   | X*Fi-2+ Y*Fi-1
因此,当X=Y=l 时,这一组扩充的Fibonacci 数就变成一般的Fibonacci 数了,
现在请写一个函数,接收一个n 值,不用数组与递归的方法算出下面的结果:
F0*Fn + F1*Fn-1 +…+ Fi*Fn-i +…+ Fn-1*F1 +FnF0
*/


class U4X4Matrix
{
public:
    unsigned long A[4][4];

public:
    //赋值构造函数
    U4X4Matrix(unsigned long B[4][4]){

        for (int i(0); i < 4; i++)
        for (int j(0); j < 4; j++)
            A[i][j] = B[i][j];
    }
    //赋值复制构造函数
    U4X4Matrix(const U4X4Matrix &m){
        for (int i(0); i < 4; i++)
        for (int j(0); j < 4; j++)
            A[i][j] = m.A[i][j];    
    }
    //拷贝复制构造函数
    U4X4Matrix operator = (const U4X4Matrix &m){
        for (int i(0); i < 4; i++)
        for (int j(0); j < 4; j++)
            A[i][j] = m.A[i][j];
        return *this;
    }

    //A * leftMatrix
    void U4X4MatrixRightMul(U4X4Matrix leftMatrix){
        U4X4Matrix temp = *this;

        for (int i(0); i < 4;i++)
        for (int j(0); j < 4; j++)
        {
            A[i][j] = temp.A[i][0] * leftMatrix.A[0][j] + temp.A[i][1] * leftMatrix.A[1][j] +
                temp.A[i][2] * leftMatrix.A[2][j] + temp.A[i][3] * leftMatrix.A[3][j];
        }
    }

    void U4X4Matrix_Power_N(int n){

        if (n == 1) return;
        if (n % 2 == 0){

            U4X4Matrix_Power_N(n >> 1);
            U4X4Matrix temp = *this;
            U4X4MatrixRightMul(temp);
            return;
        }
        U4X4Matrix temp1 = *this;
        U4X4Matrix_Power_N(n >> 1);
        U4X4Matrix temp2 = *this;
        U4X4MatrixRightMul(temp1);
        U4X4MatrixRightMul(temp2);
    }

};




unsigned long BroadFibonacci_v1(const unsigned long  &n, const unsigned long &x, const unsigned long &y){

    unsigned tempF, tempA;
    unsigned Fnminus1(1), Fnminus2(1);
    unsigned Anminus1(2), Anminus2(1);

    for (int i(2); i <n; i++){

        tempF = Fnminus1;
        Fnminus1= y*Fnminus1 + x*Fnminus2;
        Fnminus2 = tempF;

        tempA = Anminus1;
        Anminus1 = y*Anminus1 + x*Anminus2 + (1-y)*Fnminus2 + Fnminus1;
        Anminus2 = tempA;
    }

    return Anminus1;

}


unsigned long BroadFibonacci_v2(const unsigned long  &n, const unsigned long &x, const unsigned long &y){


    unsigned long MatrixArray[4][4] = {
        { y, x, 1, x },
        { 1, 0, 0, 0 },
        { 0, 0, y, x },
        { 0, 0, 1, 0 }
    };

    U4X4Matrix _4x4Matrix(MatrixArray);

    _4x4Matrix.U4X4Matrix_Power_N(n - 2);

    return _4x4Matrix.A[0][0] * 2 + _4x4Matrix.A[0][1] + _4x4Matrix.A[0][2] + _4x4Matrix.A[0][3];
}

int main(){

    unsigned long x,y; 
    unsigned long n;

    cout << "输入系数x、y和序数n,以空格键分隔" << endl;
    cin >> x >> y>>n;

    cout<<"BroadFibonacci_v1结果:"<<BroadFibonacci_v1(n, x, y)<<endl;
    cout <<"BroadFibonacci_v2结果:" << BroadFibonacci_v2(n, x, y) << endl;

    system("pause");
}

算法说明:

An=F0Fn+F1Fn1++FiFni++Fn1F1+FnF0 于是可以得到An的递推关系式:
An=XAn2+YAn1+Fn+XFn1,这样就可以用自低向上的方法求出An,O(n)=n。
其实这个递推式还可以用矩阵来求解,可以将算法的时间复杂度降低到log(n):

AnAn1FnFn1= Y100X00010Y1X0X0 An1An2Fn1Fn2

可以化为:

AnAn1FnFn1= Y100X00010Y1X0X0n2 A2A1F2F1

A2=2,A1=1,F2=1,F1=1

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 斐波那契扩展计算公式 斐波那契数列的经典定义是从第三项起每一项都是前两项之和。然而,在某些应用场景中,可能需要对这一经典定义进行扩展或变体。 #### 经典斐波那契数列定义 经典的斐波那契数列 \( F(n) \),其中 \( n \geq 0 \),由如下递推关系给出: \[ F(0)=0, F(1)=1; F(n)=F(n-1)+F(n-2),\text{对于}n>1 \] 此表达式描述了标准的斐波那契序列[^1]。 ```python def fibonacci_classic(n): if n <= 0: return 0 elif n == 1: return 1 else: a, b = 0, 1 for _ in range(2, n + 1): a, b = b, a + b return b ``` #### 扩展形式之一:广义斐波那契数列 一种常见的扩展方式是引入参化的初始条件以及不同的线性组合系来构建更广泛的类斐波那契数列。设两个整常量 \( p \) 和 \( q \),则可以定义一个新的数列为: \[ G(p,q)(0)=p,\quad G(p,q)(1)=q;\quad G(p,q)(n)=G(p,q)(n−1)+G(p,q)(n−2)\] 这种类型的数列仍然保持原有的递增性质,但是可以根据具体需求调整起点值\( (p,q) \)。 ```python def generalized_fibonacci(p, q, n): if n == 0: return p elif n == 1: return q else: prev, curr = p, q for i in range(2, n + 1): prev, curr = curr, prev + curr return curr ``` #### 另一类扩展——矩阵表示方法下的快速幂运算 除了上述基于迭代的方法外,还可以利用矩阵乘法配合快速幂技术高效地求解大范围内的斐波那契值。这种方法不仅限于传统的斐波那契数列,也可以应用于任何具有相似递归结构的形式化数列上。 给定转移方程: \[ M=\begin{pmatrix} 1 & 1 \\ 1 & 0\\ \end{pmatrix},\; V_n=M^n*V_0, \] 其中, \[ V_0=\begin{pmatrix} f_{1}\\ f_{0}\\ \end{pmatrix}. \] 因此可以通过计算 \( M^{n}\cdot V_0 \) 来获得所需的斐波那契。 ```python import numpy as np def matrix_power(matrix, power): result = np.identity(len(matrix), dtype=int) base = matrix while power > 0: if power % 2 == 1: result = np.dot(result, base) base = np.dot(base, base) power //= 2 return result def fast_matrix_fibonacci(n): if n < 2: return n fib_matrix = np.array([[1, 1], [1, 0]], dtype=object) powered_matrix = matrix_power(fib_matrix, n - 1) return powered_matrix[0][0] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值