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);

}


相关文章推荐

POJ - 3070 - Fibonacci (矩阵快速幂 + 斐波那契数列)

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10096   Acc...

POJ 3070-Fibonacci(矩阵快速幂求斐波那契数列)

Fibonacci Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Stat...

HDU 3117 Fibonacci Numbers(斐波那契数列通项+矩阵快速幂)

大意: 8位及以下的fib直接输出,8位以上的输出XXXX(fib前四位)...XXXX(fib后四位)。 思路: 8位以下的打表输出就好了。 fib的前四位可以利用通项公式fn=1/√5/*...

poj3070 Fibonacci 斐波那契数列的第n项的矩阵求法

对于满足(F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2)的斐波那契数列,第n项可由矩阵求出公式如下:...

快速幂、矩阵快速幂+斐波那契数列(Fibonacci Sequence)

1、快速幂 什么是幂? 可能有人对这个概念并不很清楚。我们来简单的回顾一下。比如n个a相乘,那我们平常的数学表示就是a^n,读作a的n次幂。那么a就是幂的底,n就是幂指数。 快速幂是什么?...

nyoj 148 fibonacci数列(二)【矩阵】

fibonacci数列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 In the Fibonacci integer sequence, F0...

1250 Fibonacci数列(矩阵乘法)

1250 Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 定义:f...

nyoj fibonacci数列(二) 矩阵乘法

http://acm.nyist.net/JudgeOnline/problem.php?pid=148 fibonacci数列(二) 时间限制:1000 ms  |  内存限制:65...

【数论】矩阵快速幂求Fibonacci数列

我们可以用如下方式求斐波那契数列。 原理如下图 因为是幂次,容易联想到快速幂。 用结构体封装矩阵,就可快速求出F(n) 时间复杂度为O(logn * 2^3) 代码如下 #in...

nyoj 301 递推求值 和 nyoj 148 fibonacci数列(二) 【矩阵】

原题链接: nyoj 301 :http://acm.nyist.net/JudgeOnline/problem.php?pid=301 nyoj 148 :http://acm.nyist.ne...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fibonacci数列的矩阵算法
举报原因:
原因补充:

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