2012-05-03 72 views
0

問題的完整的上下文可以在這裏 Details看到。ACM 4744蠻力算法

你也可以試試我的源代碼繪製遞歸小數字: 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]); 

這揭示了一些很不錯的輸出FO [R一般一個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被頻繁程度,這似乎是一個^(F(N))* B ^(F(N + 1) ) 與F(n)作爲第n個斐波納契數。所以我的問題是:我如何獲得非常巨大的斐波那契數,數模p,我做了很多的這個研究,通讀週期Lenghts斐波那契的,嘗試了一些遞歸有:

F(A + B)= F(a + 1)* F(b)+ F(a)* F(b-1)

但似乎像遞歸深度(log_2(1.000.000.000)〜= 30)即使進行了深度的第一次遞歸,兩個數字也是非常重要的。

a= floor(n/2) 
b= ceiling(n/2) 

時,我有一個Fib號碼,乘法和乘方 不應該在我的角度來看問題。

遺憾的是沒有:/

我還是堅持了問題。計算在指數的斐波那契數號碼第一次沒解決的問題是正確的,這是一個錯誤遵從數學我申請有:/

所以我想其他的方法計算公式:

(a^(Fibonacci(n-2))*b^(Fibonacci(n-1))) mod p 

但隨着斐波那契數字變得非常大,我假設必須比計算整個斐波納契數然後將離散指數函數應用於BigInteger/BigFloat更簡單。有人對我有暗示,我看不到進一步的進展。由於

因此,這是我到目前爲止我,可能只是我缺少一點東西,所以期待您的答覆

感謝

回答

0

如果是有關計算斐波那契數,有它是非遞歸的,非迭代的公式。它在荷蘭維基百科頁面上關於斐波納契數字顯着地突出顯示,但在英文頁面上沒有那麼多。

F(N)=((1個+ SQRT(5))^ N - (1- SQRT(5))^ N)/(2^N * SQRT(5))

http://upload.wikimedia.org/wikipedia/nl/math/1/7/4/1747ee745fbe1fbf10fb3d9de36b8927.png

來源:http://nl.wikipedia.org/wiki/Rij_van_Fibonacci

也許有什麼東西你可以用這個公式去做。

+0

是的,這是我的想法之一,Mathematica沒有解決它的問題,但在Java中,我認爲沒有可能將此數字存儲爲,比方說,加倍。而且我不知道Mathematica如何快速計算這些數字。對於大數字,甚至有一個泛化,因爲最後一項限制爲零。謝謝 –

0

對於計算Fibonacci and Lucas numbers的各種方法,您可能會發現對我的反芻有幫助。在那裏我展示瞭如何使用基本上是O(log2(n))的遞歸方案進行計算。它適用於大斐波那契數字。如果你使用一些小的數字來完成這個操作,你甚至不需要用一個大的整數工具來進行計算。即使是巨大的斐波納契數字,這也會非常快。下面這個只是中等大小。

fibonacci(10000) 
ans = 
    33644764876431783266621612005107543310302148460680063906564769974680 
081442166662368155595513633734025582065332680836159373734790483865268263 
040892463056431887354544369559827491606602099884183933864652731300088830 
269235673613135117579297437854413752130520504347701602264758318906527890 
855154366159582987279682987510631200575428783453215515103870818298969791 
613127856265033195487140214287532698187962046936097879900350962302291026 
368131493195275630227837628441540360584402572114334961180023091208287046 
088923962328835461505776583271252546093591128203925285393434620904245248 
929403901706233888991085841065183173360437470737908552631764325733993712 
871937587746897479926305837065742830161637408969178426378624212835258112 
820516370298089332099905707920064367426202389783111470054074998459250360 
633560933883831923386783056136435351892133279732908133732642652633989763 
922723407882928177953580570993691049175470808931841056146322338217465637 
321248226383092103297701648054726243842374862411453093812206564914032751 
086643394517512161526545361333111314042436854805106765843493523836959653 
428071768775328348234345557366719731392746273629108210679280784718035329 
131176778924659089938635459327894523777674406192240337638674004021330343 
297496902028328145933418826817683893072003634795623117103101291953169794 
607632737589253530772552375943788434504067715555779056450443016640119462 
580972216729758615026968443146952034614932291105970676243268515992834709 
891284706740862008587135016260312071903172086094081298321581077282076353 
186624611278245537208532365305775956430072517744315051539600905168603220 
349163222640885248852433158051534849622434848299380905070483482449327453 
732624567755879089187190803662058009594743150052402532709746995318770724 
376825907419939632265984147498193609285223945039707165443156421328157688 
908058783183404917434556270520223564846495196112460268313970975069382648 
706613264507665074611512677522748621598642530711298441182622661057163515 
069260029861704945425047491378115154139941550671256271197133252763631939 
606902895650288268608362241082050562430701794976171121233066073310059947 
366875 

訣竅很簡單。簡單地將第2個Fibonacci和Lucas數字與第n個這樣的數字聯繫起來。它使我們能夠向後工作。所以要計算F(n)和L(n),我們需要知道F(n/2)和L(n/2)。很明顯,只要n是偶數就可以工作。對於奇數n,有類似的方案可以使我們遞歸地向下移動。

對於踢腿,我只是修改上述工具,接受模數。因此,要計算索引1e15的斐波納契數字的最後6位數字,大約需要1/6秒。

tic,[Fn,Ln] = fibonacci(1e15,1000000),toc 
Elapsed time is 0.161468 seconds. 

Fn = 
    546875 

Ln = 
    328127 

注:在我的遞歸的討論計算斐波那契數,我就需要遞歸調用的次數幾點意見。看到這個數字確實與Fibonacci序列本身非常相關。這很容易推導出來。

+0

預先感謝,我會看看它,但也許提示足以讓我自己發掘。我希望我會理解基本的matlab語言,但它似乎像所有函數式編程語言:) –