【问题标题】:Fibonacci - Divide and conquer algorithm [closed]斐波那契 - 分而治之算法[关闭]
【发布时间】:2013-12-20 04:19:43
【问题描述】:
#include <iostream>
using namespace std;

int main() {
    int i=1;
    int j=0;
    int k=0;
    int h=1;
    int t=0;
    int n;
    cin>>n;

    while (n) {
        if (n%2) {
            t=j*h;
            j=i*h+j*k+t;
            i=ik+t;
        }

        t=h*h;
        h=2*k*h+t;
        k=k*k+t;
        n=n/2;
    }

    cout<<j;
    return 0;
}

这是我在互联网上找到的最快的斐波那契算法。我理解的其他算法,但这一个对我来说没有任何意义。

我不明白该算法与矩阵乘法或平方乘方有何关系。谁能解释一下?

【问题讨论】:

  • 笔和纸。写出来。
  • 已经试过了。我就是不明白。

标签: c++ algorithm matrix-multiplication fibonacci exponentiation


【解决方案1】:

矩阵解是取矩阵

1 1
0 1

并将其提高到等于您想要的斐波那契数的幂。您可以使用 log(n) 步骤来做到这一点。您使用幂的二进制格式。在每个步骤中,您将矩阵与自身相乘(相当于将指数乘以 2),如果该位为 1,则与原始矩阵相乘(相当于将 1 加到指数上)。

现在再次检查代码。变量对矩阵中的 4 个单元格进行编码,并且有一些乘法逻辑的内联,但它仍然是相同的。

【讨论】:

  • 谢谢,但我说我熟悉矩阵解决方案。我不明白为什么这段代码使用矩阵 {{1,0},{1,0}}
【解决方案2】:

这是计算斐波那契数的标准矩阵方法。变量 h、i、j 和 k 是矩阵的四个元素。矩阵算术是“手写”写出来的。

【讨论】:

  • 我认为可以达到第 n 个斐波那契:{{0,1},{1,1}}^n 但这里我有矩阵:{{1,0},{1, 0}}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多