非线性递归关系

时间:2017-01-18 13:14:39

标签: algorithm recurrence

如何找到此递归关系的第N个术语

F(n) = F(n-1) + F(n-2) + F(n-1)*F(n-2)

我必须找到模数10^9+7的递归关系的第N个术语。

我知道如何找到线性递归关系的第N个术语,但无法继续进行此操作。

1<=N<=10^9

提供F(0)和F(1)作为输入。

1 个答案:

答案 0 :(得分:12)

有一个技巧。让G(n) = F(n) + 1。等式

F(n) = F(n-1) + F(n-2) + F(n-1)*F(n-2)

变为

G(n) - 1 = G(n-1) - 1 + G(n-2) - 1 + (G(n-1) - 1) * (G(n-2) - 1)
         = G(n-1) - 1 + G(n-2) - 1 + G(n-1)*G(n-2) - G(n-1) - G(n-2) + 1
         = G(n-1)*G(n-2) - 1,

所以向两边添加1

G(n) = G(n-1)*G(n-2).

这是熟悉的Fibonacci复发的乘法等价物。解决方案是

G(n) = G(0)^Fib(n-1) * G(1)^Fib(n),

与线性复发理论类比(其中Fib(-1) = 1Fib(0) = 0Fib(1) = 1),因为

G(n-1)*G(n-2) = G(0)^Fib(n-2) * G(1)^Fib(n-1)
              * G(0)^Fib(n-3) * G(1)^Fib(n-2)
              = G(0)^Fib(n-1) * G(1)^Fib(n)
              = G(n).

因此,

F(n) = (F(0)+1)^Fib(n-1) * (F(1)+1)^Fib(n) - 1,

通过每个Fermat's little theorem的矩阵幂方法mod Fib和指数mod p-1进行p次计算。