2009-06-08 27 views
5

在最近回答涉及阿克曼函數的問題後,其中一部分涉及用於計算數字係數的函數。這讓我深思,是否有更有效的方法來做到這一點。我自己做了一些測試,但主要受限於5^3 = 5^3125這樣的數字大概是10^2,這意味着5^3125 = 10 ^(3125 * 2/3)約2000位數字。有沒有一個有效的tetration實施?

該函數不借給本身分而治之由於冪是如何完成的性質的方法,即:

2 ^^ 5 = 2 ^(2 ^(2 ^(2^2 ))))= 2 ^(2 ^(2^4))= 2 ^(2^16)= 2^65536 = = 10 ^(65536 * 3/10)因此大約20k位...

問題的本質,因爲它從電源樹的頂端開始,並且降低了我的工作量,因此我覺得它是階乘因素。一個快速的功率算法可以用來明顯地進行冪運算,但是我一直無法找到縮小指數運算次數的方法。

在任何情況下,目前還不清楚我談論這裏的wiki article,本質上不過是迭代冪次:

一個^^ B = A^A^A^...... A,B三次,然後開始在電源樹的頂端元素上取冪,然後繼續工作。

目前我使用的是(雖然我使用的紅寶石版本,如果我實際上希望值)的算法:

long int Tetration(int number, int tetrate) 
{ 
    long int product=1; 
    if(tetrate==0) 
     return product; 
    product=number; 
    while(tetrate>1) 
    { 
     product=FastPower(number,product); 
     tetrate--; 
    } 
    return product; 
} 

任何想法,將不勝感激。

+0

我認爲很多取決於你需要什麼樣的數字表示。你需要精確的整數表示嗎?或者是近似數值(浮點)表示是否足夠? – RBarryYoung 2009-06-08 06:52:26

+0

出於好奇,這純粹是一個問題,所以我會好奇你怎麼才能用浮點表示法編寫更高效的算法。 – JSchlather 2009-06-08 14:48:40

+0

我確實研究過這個,但很快就意識到整數數字長度問題(Dave下面解釋)也會折磨任何tetration函數輸出的指數,只是在一個遞歸更少的情況下。基本上,浮點可以處理指數乘積,因爲它是LOG格式的表示。國際海事組織,爲了有效地處理tetration產品,你需要開發一個基於超級日誌的格式。這聽起來很難但很有趣,甚至可能是有價值的論文(無論如何)。 – RBarryYoung 2009-06-13 00:40:36

回答

4

如果最終答案是d位,那麼所有中間結果都是O(log d)數字,而不是O(d)冪數的指數。因爲與最終結果相比,限制的中間結果非常小,所以通過分而治之並不能節省開支。由於指數不關聯,因此在單位成本RAM中保存指數運算的方法也不太可能。

0

快速測試證實可以使用相同類型的加速的作爲功率算法:

一個↑↑2B =(A^A)

並且甚至更一般: 一個↑ⁿ2B =(A↑ⁿ⁻¹一)↑ⁿb

用來確認此代碼:

for(long a = 2; a < 5; a++) { 
     for(long b = 2; b < 5; b++) { 
      if(b%2 == 0) { 
       System.out.println(a+"↑↑"+b+"="+tetration(BigInteger.valueOf(a), BigInteger.valueOf(b))); 
       long pow = (long) Math.pow(a, a); // pow = tetration(a,2) 
       System.out.println(pow+"↑↑"+b/2+"="+tetration(BigInteger.valueOf(pow), BigInteger.valueOf(b/2))); 
      } 
     } 
    } 
-1

我不認爲有一個簡單的方法來做到迭代冪次, 所以我這樣做:

<!DOCTYPE html> 
    <html> 
     <head> 
      <script> 
       var x = 1 
       //That is ▽ The Number You Are Powering// 
       var test = 3 
       var test2 = test 
       setInterval (function() { 
        // that is ▽ How many times you power it so this would be 3 tetra 3  which is 7625597484987// 
        if (x < 3) { 
         document.getElementById('test').innerHTML = test=test2**test 
         x++ 
        } 
       }, 1); 
      </script> 
      <p id="test">0</p> 
相關問題