fibonacci数列的矩阵算法

原创 2012年03月30日 19:37:22
#include <cassert>
#include <iostream>

///////////////////////////////////////////////////////////////////////
// A 2 by 2 matrix
///////////////////////////////////////////////////////////////////////
struct Matrix2By2
{
      Matrix2By2
      (
            long long m00 = 0,
            long long m01 = 0,
            long long m10 = 0,
            long long m11 = 0
      )
      :m_00(m00), m_01(m01), m_10(m10), m_11(m11)
      {
      }

      long long m_00;
      long long m_01;
      long long m_10;
      long long m_11;
};

Matrix2By2 MatrixMultiply
(
      const Matrix2By2& matrix1,
      const Matrix2By2& matrix2
)
{
      return Matrix2By2(
            matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10,
            matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11,
            matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10,
            matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11);
}

///////////////////////////////////////////////////////////////////////
// The nth power of matrix
// 1  1
// 1  0
///////////////////////////////////////////////////////////////////////
Matrix2By2 MatrixPower(unsigned int n)
{
      assert(n > 0);

      Matrix2By2 matrix;
      if(n == 1)
      {
            matrix = Matrix2By2(1, 1, 1, 0);
      }
      else if(n % 2 == 0)
      {
            matrix = MatrixPower(n / 2);
            matrix = MatrixMultiply(matrix, matrix);
      }
      else if(n % 2 == 1)
      {
            matrix = MatrixPower((n - 1) / 2);
            matrix = MatrixMultiply(matrix, matrix);
            matrix = MatrixMultiply(matrix, Matrix2By2(1, 1, 1, 0));
      }

      return matrix;
}

///////////////////////////////////////////////////////////////////////
// Calculate the nth item of Fibonacci Series using devide and conquer
///////////////////////////////////////////////////////////////////////
long long Fibonacci_Solution3(unsigned int n)
{
      int result[2] = {0, 1};
      if(n < 2)
            return result[n];

      Matrix2By2 PowerNMinus2 = MatrixPower(n - 1);
      return PowerNMinus2.m_00;
}

int main()
{
    unsigned int n;
    std::cout<<"Enter n:";
    std::cin>>n;
    std::cout<<"fib("<<n<<")="<<Fibonacci_Solution3(n);

}


fibonacci数列矩阵快速幂

对于矩阵 [ 1 1                     1 0 ] 的n次幂,第一行第二个元素(右上角)的元素即为fibonacci数列的第n项,由此可以根据矩阵的乘法计算fibonacci数...
  • tingyu1995
  • tingyu1995
  • 2015年06月14日 11:05
  • 523

优美的Fibonacci数列与矩阵

题目:http://codeforces.com/contest/392/problem/C   题意:给定Fibonacci数列F[],令,求的值。   分析:对于Fibonacci数列的题目来说一...
  • ACdreamers
  • ACdreamers
  • 2014年05月09日 16:11
  • 1705

算法——Fibonacci数列的多种解法(递归算法)

咳咳,金宸欧巴今天来更新博客了,今天想写的一点内容是关于斐波那契数列的解法,fibonacci数列的定义如下:F(n)= { a, ...
  • JacksonWant
  • JacksonWant
  • 2016年04月14日 01:02
  • 3969

利用矩阵求斐波那契数列

利用矩阵求斐波那契数列flyfish 2015-8-27 矩阵(matrix)定义一个m*n的矩阵是一个由m行n列元素排成的矩形阵列。矩阵里的元素可以是数字符号或者数学式.形如{acbd}\begi...
  • flyfish1986
  • flyfish1986
  • 2015年08月27日 00:07
  • 5332

fibonacci 数列的快速幂求法

一、经典解法        Fibonacci数列的经典解法,即递归解法,如下 int fib(int n){ if(n ...
  • zhangpiu
  • zhangpiu
  • 2016年03月25日 14:19
  • 814

蓝桥杯:Fibonacci数列【JAVA算法实现】

题目描述 你的任务是计算若干整数的和。 输入格式 每行的第一个数N,表示本行后面有N个数。 输出 对于每一行数据需要在相应的行输出和。 样例输入 4 1 2 3 ...
  • u011028655
  • u011028655
  • 2015年04月11日 21:53
  • 1935

矩阵快速幂入门 + 求Fibonacci数列

两矩阵相乘,朴素算法的复杂度是O(N^3)。如果求一次矩阵的M次幂,按朴素的写法就是O(N^3*M)。既然是求幂,不免想到快速幂取模的算法,a^b %m 的复杂度可以降到O(logb)。如果矩阵相乘是...
  • zhulei19931019
  • zhulei19931019
  • 2016年10月03日 23:01
  • 227

Fibonacci 数列及其计算方法

Fibonacci 数列及其计算方法斐波那契数列(Fibonacci sequence),又称黄金分割数列,这个数列最早是由印度数学家提出来的。不过更多的人学习到这个数列是因为意大利数学家列昂纳多·斐...
  • liyuanbhu
  • liyuanbhu
  • 2016年06月17日 23:02
  • 7954

矩阵快速幂求Fibonacci数列

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7241 ...
  • an505479313
  • an505479313
  • 2016年07月04日 11:52
  • 330

求Fibonacci数列的三种思路和算法(C++实现)

摘要:本文主要介绍求Fibonacci数列的三种思路和算法:二分递归、线性递归和动态规划法,并直观得体现了三者得运行效率的不同。...
  • icurious
  • icurious
  • 2016年11月12日 20:41
  • 2205
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fibonacci数列的矩阵算法
举报原因:
原因补充:

(最多只允许输入30个字)