【发布时间】:2012-05-03 10:37:14
【问题描述】:
问题的完整上下文可以在这里看到 Details.
您也可以尝试我的源代码来绘制小数的递归: 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)
当我有斐波数时,乘法和求幂 在我看来应该不是问题。
很遗憾没有:/
我仍然遇到问题。首先计算指数中的斐波那契数并没有正确解决问题,这是我在那里应用的错误数学公式:/
所以我想到了其他计算公式的方法:
(a^(Fibonacci(n-2))*b^(Fibonacci(n-1))) mod p
但是随着斐波那契数变得非常大,我假设必须有一种比计算整个斐波那契数然后使用 BigInteger/BigFloat 应用离散指数函数更简单的方法。有人对我有提示吗,我看不到进一步的进展。谢谢
所以这就是我目前为止的地方,可能只是我缺少的一个小东西,所以期待你的回复
谢谢
【问题讨论】:
标签: math functional-programming nested-loops fibonacci