2009-06-08 20 views
5

हाल ही में एकरमैन फ़ंक्शन भाग से जुड़े एक प्रश्न का उत्तर देने के बाद जिसमें एक संख्या के टेट्रेशन की गणना करने के लिए एक फ़ंक्शन शामिल था। जिसने मुझे यह सोचने का नेतृत्व किया कि क्या ऐसा करने का एक और अधिक प्रभावी तरीका था। मैंने अपने आप पर कुछ परीक्षण किया लेकिन मैं मुख्य रूप से इस तथ्य से सीमित हूं कि 5 ^^ 3 = 5^3125 दिया गया 5^3 भी लगभग 10^2 है, जिसका अर्थ है 5^3125 ~ = 10^(3125 * 2/3) लगभग 2000 अंक।क्या टेट्रेशन का कोई प्रभावी कार्यान्वयन है?

समारोह में ही उधार नहीं करता विभाजित और कैसे घातांक किया जाता है की प्रकृति के कारण तरीकों, यानी जीत के लिए:

2 ^^ 5 = 2^(2^(2^(2^2)))) = 2^(2^(2^4)) = 2^(2^16) = 2^65536 ~ = 10^(65536 * 3/10) तो लगभग 20k अंक ...

समस्या की प्रकृति, क्योंकि यह बिजली के पेड़ के शीर्ष पर शुरू होती है और इसे नीचे काम करता है, मुझे तथ्यात्मक के रूप में मारता है। तेजी से एक्सपोनिएशन ऑपरेशन करने के लिए एक फास्ट पावर एल्गोरिदम का उपयोग किया जा सकता है, लेकिन मैं एक्सपोनिएशन ऑपरेशंस की संख्या को कम करने का कोई तरीका नहीं देख पा रहा हूं।

मामले में किसी को भी स्पष्ट नहीं है क्या मैं के बारे में यहाँ बात कर रहा हूँ wiki article है, अनिवार्य रूप से हालांकि tetration है:

एक ^^ b = एक^एक^एक ....^क, ख बार और फिर शुरू करने बिजली के पेड़ के शीर्ष तत्व पर exponentiation और नीचे काम कर रहा है।

एल्गोरिथ्म मैं वर्तमान में उपयोग कर रहा हूँ होगा (अगर मैं वास्तव में मूल्यों चाहते हैं, हालांकि मैं एक गहरे लाल रंग का संस्करण का उपयोग कर रहा हूँ):

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

+0

यह जिज्ञासा से पूरी तरह से एक प्रश्न है, इसलिए मैं यह देखने के लिए उत्सुक हूं कि आप फ्लोटिंग पॉइंट प्रस्तुति के साथ एक अधिक कुशल एल्गोरिदम कैसे लिख सकते हैं। – JSchlather

+0

मैंने इस पर ध्यान दिया लेकिन जल्दी से एहसास हुआ कि पूर्णांक अंकों की लंबाई की समस्या (जो डेव नीचे बताती है) किसी भी टेट्रेशन फ़ंक्शन आउटपुट के एक्सपोनेंट को भी प्रभावित करती है, केवल एक रिकर्सन कम होती है। असल में, फ़्लोटिंग-पॉइंट एक्सपोनिएशन उत्पादों को संभाल सकता है क्योंकि यह एक LOG प्रारूपित प्रतिनिधित्व है। आईएमओ, कुशलतापूर्वक टेट्रेशन उत्पादों को संभालने के लिए, आपको एक सुपरलॉग आधारित प्रारूप विकसित करने की आवश्यकता होगी। यह मुश्किल लेकिन दिलचस्प लगता है, शायद यह भी योग्य है (मास्टर्स वैसे भी)। – RBarryYoung

उत्तर

4

टेट्रेशन के साथ, यदि अंतिम उत्तर डी अंक है, तो सभी इंटरमीडिएट परिणाम ओ (लॉग डी) अंक हैं, एक्सपोनिएशन के साथ ओ (डी) अंकों के विपरीत। चूंकि अंतिम परिणाम की तुलना में टेट्रेशन के मध्यवर्ती परिणाम इतने छोटे होते हैं, विभाजन और जीत के माध्यम से कोई बचत नहीं होती है। यह भी असंभव है कि एक इकाई लागत वाली रैम में एक्सपोनिएशन ऑपरेशंस को बचाने का एक उपयोगी तरीका है, क्योंकि एक्सपोनेंटिएशन सहयोगी नहीं है।

+1

तो मैं इसे लेता हूं कि यह नहीं है? – JSchlather

0

एक त्वरित परीक्षण की पुष्टि करता है कि आप सत्ता एल्गोरिथ्म के लिए के रूप में speedup के एक ही प्रकार का उपयोग कर सकते हैं:

एक ↑↑ 2 बी = (क^क)

और भी अधिक सामान्य: एक ↑ ⁿ 2b = (क ↑ ⁿ⁻¹ क) ↑ ⁿ ख

इस बात की पुष्टि करने के लिए इस्तेमाल कोड:

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

मुझे लगता है कि tetration करने के लिए एक आसान तरीका है कि वहाँ नहीं है, तो मैंने यह किया:

<!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> 
+0

क्या आप समझा सकते हैं कि यह थोड़ा कैसे काम करता है? – sanastasiadis

संबंधित मुद्दे