如何解决:f(n) = f(n-1) + 3*f(n-2) + 3*f(n-3) + f(n-4)

how to solve: f(n) = f(n-1) + 3*f(n-2) + 3*f(n-3) + f(n-4)

本文关键字:n-2 n-4 n-3 n-1 何解决 解决      更新时间:2023-10-16

如何解决

f(n) = f(n-1) + 3*f(n-2) + 3*f(n-3) + f(n-4) maximum value of n = 10^18 minimum is 1
initial conditions are
f(1) = 1
f(2) = 3
f(3) = 3
f(4) = 1

什么时候f(n)可以大? print f(n) modulus 10000007

我对这个问题的尝试如下(使用模数可能是错误的(

1st test case:
3
2
5
9
output:
3
20
695
(working fine)
2nd tst case:
3
1554894
5959595
2562651
output:
7505501
9551828
6592801
(working fine)

但对于更大的数字,程序失败;为什么?

#!/usr/bin/python
T = int(raw_input())
def fib_iter(n):
    if n == 1:
        return 1
    if n == 2:
        return 3
    if n == 3:
        return 3
    if n == 4:
        return 1   
    prev1, prev2, prev3, prev4 = 1, 3, 3, 1
    i = 5
    while i < n+1:
        curr = (prev1%10000007 + 3*prev2%10000007 + 3*prev3%10000007 + prev4%10000007)%10000007
        prev1, prev2, prev3, prev4 = prev2%10000007, prev3%10000007, prev4%10000007, curr%10000007
        i = i + 1
    return curr%10000007
for t in xrange(T):
    n = int(raw_input())
    print fib_iter(n)

阅读本书,然后手动解决。

编辑:当我被要求提供更多细节时:对于"求解",我的意思是推导出一个明确的公式,该公式直接为您提供系数f(n([这样就不需要递归]。对于正常的斐波那契级数,这是由比奈公式给出的。按照链接书中的食谱,您可以通过以下步骤进行操作:

  1. 推导出第 n 个系数的生成函数。基本上,这是通过考虑一个在所寻求的系数 f(n( 方面具有幂级数展开的函数,并将多个项组合成一个函数来完成的。

  2. 给定生成函数,推导出位于单项式 x^n 前面的膨胀系数。由于您指定的生成函数最多包含四阶多项式,因此甚至可以通过分析来完成。

如果

这里有一些数学模式,我会提供更多的数学细节,如果运气好的话,也会提供解决方案。但是就这样尝试一下,这很容易,而且这本书的可读性很好。

更新 - 尝试将循环中的这两行更改为:

    curr = (prev1 + 3*prev2 + 3*prev3 + prev4)%10000007
    prev1, prev2, prev3, prev4 = curr, prev1, prev2, prev3

对于模数10000007,n = 15616511848,你应该得到你提到的5370032。请注意,10000007 = 941 x 10627 并且不是素数。我不确定为什么选择它。通常,这些类型的问题使用质数1000000007(7 + 10^9(。

加速这个算法更像是一个数学问题,而不是一个编程问题。其矩阵形式为:

       |  1  3  3  1 |
   a = |  1  0  0  0 |
       |  0  1  0  0 |
       |  0  0  1  0 |
       |  1 |
x[4] = |  3 |
       |  3 |
       |  1 |
x[i+1] = a x[i]
x[i+j] = a^j x[i]

重复平方可用于加快计算 a^j 的速度。

如果你好奇没有模量的 x[0] 到 x[4]。对于模数,将模数 (10000007( 添加到负数:

x[0] =  -14,  39, -73, 117
x[1] =    1, -14,  39, -73
x[2] =    3,   1, -14,  39
x[3] =    3,   3,   1, -14
x[4] =    1,   3,   3,   1

使用矩阵方法,执行变得非常快速和可靠。http://x-perienceo.blogspot.in/

我在这里写了一个更详细的答案。

  1. 重要的是要知道1000007是首要的。因此,您可以使用欧拉定理。欧拉定理指出,对于素数p,如果x % (p-1) == y % (p-1),则a**x % p == a**y % p(Python符号(。

  2. 尝试找到一个矩阵符号来计算任何 n 的 f(n(,而无需首先递归计算 f(n-1( 等。然后通过平方使用幂来计算它(直到你的模数,如上面的 1. 所述(。

相关文章:
  • 没有找到相关文章