問題の完全なコンテキストはここで見ることができます 詳細。
また、私のソースコードを試して、少数の再帰をプロットすることもできます: 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が呼び出される頻度を見ると、n番目のフィボナッチ数としてF(n)を使用したa ^(F(n))* b ^(F(n + 1))のように見えます。だから私の問題は:どうすれば非常に巨大なフィボナッチ数を法として得ることができますか、私はこれについて多くの研究を行い、フィボナッチのサイクル長を読み、いくつかの再帰を試しました:
F(a + b)= F(a + 1)* F(b)+ F(a)* F(b-1)
しかし、pを2つの数値に分割する場合、最初の再帰が深くても、再帰の深さ(log_2(1.000.000.000)〜= 30)のように見えます。
a= floor(n/2)
b= ceiling(n/2)
私がフィボナッチ数を持っているとき、乗算とべき乗は私の観点では問題ではないはずです。
残念ながら違います :/
私はまだ問題で立ち往生しています。指数のフィボナッチ数を計算しても、最初は問題が正しく解決されませんでした。そこで適用した数学式が間違っていました:/
だから私は式を計算する他の方法を考えました:
(a^(Fibonacci(n-2))*b^(Fibonacci(n-1))) mod p
しかし、フィボナッチ数が非常に大きくなるにつれて、フィボナッチ数全体を計算してから、BigInteger/BigFloatを使用して離散指数関数を適用するよりも簡単な方法があるはずだと思います。誰かが私にヒントを持っていますか、私はそれ以上の進歩は見られません。ありがとう
だから、これは私が今のところいるところです、私が見逃しているほんの少しのことかもしれませんので、あなたの返事を楽しみにしています
ありがとう