问题的完整上下文可以在此处查看 详细信息。
您也可以尝试我的源代码来绘制小数字的递归: Pastebin
我正在以数学方式看待这个问题,它是一个嵌套递归,如下所示:
Function Find(integer n, function func)
If n=1
For i = 1 to a do func()
Elseif n=2
For i = 1 to b do func()
Else Find(n-1,Find(n-2,func))
Function Main
Find(n,funny)
我在没有模运算的 Mathematica 中的实现是:
$IterationLimit = Infinity
Clear[A]
A [a_, b_, f_, 1] := A [a, b, f, 1, p] = (f a);
A [a_, b_, f_, 2] := A [a, b, f, 2, p] = (f b);
A [a_, b_, f_, n_] :=
A [a, b, f, n, p] = (A[a, b, A[a, b, f, n - 2], n - 1]);
这揭示了一般a和b的一些不错的输出
A[a, b, funny, 1]
a funny
A[a, b, funny, 2]
b funny
A[a, b, funny, 3]
a b funny
A[a, b, funny, 4]
a b^2 funny
A[a, b, funny, 5]
a^2 b^3 funny
A[a, b, funny, 6]
a^3 b^5 funny
因此,当我们查看调用 Func 的频率时,它看起来像 a^(F(n)) * b^(F(n+1)),其中 F(n) 作为第 n 个斐波那契数。所以我的问题是:我如何获得非常大的斐波那契数模 p,我对此做了很多研究,通读了斐波那契的周期长度,尝试了一些递归:
F(a+b) = F(a+1) * F(b) + F(a)*F(b-1)
但似乎递归深度 (log_2(1.000.000.000) ~=30 ) 将 p 分成两个数字时要多得多,即使是第一次递归也是如此。
a= floor(n/2)
b= ceiling(n/2)
当我有 Fib 数字时,乘法和求幂在我看来应该不是问题。
不幸的是:/
我仍然坚持这个问题。首先计算指数中的斐波那契数并没有正确解决问题,这是我在那里应用的错误数学公式:/
所以我想到了其他计算公式的方法:
(a^(Fibonacci(n-2))*b^(Fibonacci(n-1))) mod p
但是随着斐波那契数变得非常大,我假设必须有一种比计算整个斐波那契数然后使用 BigInteger/BigFloat 应用离散指数函数更简单的方法。有人对我有提示吗,我看不到进一步的进展。谢谢
所以这就是我到目前为止的地方,可能只是我错过的一件小事,所以期待你的回复
谢谢