यह कोड गोल्फ कब बना? मैंने सोचा कि यह सबसे अच्छा एल्गोरिथ्म के साथ आने के लिए एक कोड चुनौती थी!
कोड गोल्फ
एपीएल, 33 वर्ण
{r←⍵⋄⍺{1≥⍵⍟⍣⍺⊢r:⍵⋄⍺∇⍵+i}1+i←1e¯6}
यह एक सरल रेखीय खोज है, जो C = 1 + 10 -6 से शुरू होती है और इसे 10 -6 तक बढ़ाती है, जब तक कि
लॉग C लॉग C लॉग C C A
log 1 नहीं होता है, जहां लॉग C फ़ंक्शन को पुनरावर्ती B बार लागू किया जाता है।
उदाहरण
4 {r←⍵⋄⍺{1≥⍵⍟⍣⍺⊢r:⍵⋄⍺∇⍵+i}1+i←1e¯6} 65536
2.0000009999177335
3 {r←⍵⋄⍺{1≥⍵⍟⍣⍺⊢r:⍵⋄⍺∇⍵+i}1+i←1e¯6} 7625597484987
3.0000000000575113
यह कोड बहुत धीमा है, लेकिन छोटे अड्डों जैसे 2 या 3 के लिए यह कुछ ही सेकंड में पूरा हो जाता है। एक बेहतर चीज के लिए नीचे देखें।
कोड-चुनौती
एपीएल, लॉगरिदमिक जटिलता
वास्तव में जड़ क्रम पर रैखिक जटिलता, परिणाम आकार और सटीकता पर लघुगणक:
समय = O (B × log (C) + B × log (D))
जहाँ B मूल क्रम है, C को tetration base कहा जा रहा है, और D, सटीक पूछे जाने वाले अंकों की संख्या है। यह जटिलता मेरी सहज समझ है, मैंने इसका औपचारिक प्रमाण नहीं दिया है।
इस एल्गोरिथ्म को बड़े पूर्णांक की आवश्यकता नहीं है, यह केवल नियमित फ्लोटिंग पॉइंट नंबरों पर लॉग फ़ंक्शन का उपयोग करता है, इसलिए यह बहुत बड़ी संख्याओं पर काफी कुशल है, फ़्लोटिंग पॉइंट कार्यान्वयन की सीमा तक (या तो डबल परिशुद्धता, या मनमाना बड़े एफपी नंबर पर) एपीएल कार्यान्वयन जो उन्हें प्रदान करते हैं।)
⎕CTवांछित स्वीकार्य त्रुटि पर सेटिंग (तुलना सहिष्णुता) द्वारा परिणाम की शुद्धता को नियंत्रित किया जा सकता है (मेरे सिस्टम पर यह 1ely14 तक चूक जाता है, लगभग 14 दशमलव अंक)
sroot←{ ⍝ Compute the ⍺-th order super-root of ⍵:
n←⍺ ⋄ r←⍵ ⍝ n is the order, r is the result of the tetration.
u←{ ⍝ Compute u, the upper bound, a base ≥ the expected result:
1≥⍵⍟⍣n⊢r:⍵ ⍝ apply ⍵⍟ (log base ⍵) n times; if ≤1 then upper bound found
∇2×⍵ ⍝ otherwise double the base and recurse
}2 ⍝ start the search with ⍵=2 as a first guess.
(u÷2){ ⍝ Perform a binary search (bisection) to refine the base:
b←(⍺+⍵)÷2 ⍝ b is the middle point between ⍺ and ⍵
t←b⍟⍣n⊢r ⍝ t is the result of applying b⍟ n times, starting with r;
t=1:b ⍝ if t=1 (under ⎕CT), then b is the super-root wanted;
t<1:⍺∇b ⍝ if t<1, recurse between ⍺ and b
b∇⍵ ⍝ otherwise (t>1) returse between b and ⍵
}u ⍝ begin the search between u as found earlier and its half.
}
मुझे यकीन नहीं है कि 1≥⍵⍟⍣nऊपर एक डोमेन त्रुटि के साथ विफल हो सकता है (क्योंकि एक नकारात्मक तर्क का लॉग या तो तुरंत विफल हो सकता है, या एक जटिल परिणाम दे सकता है, जो डोमेन में नहीं होगा ≥) लेकिन मुझे नहीं मिल पाया है एक मामला जो विफल रहता है।
उदाहरण
4 sroot 65536
1.9999999999999964
4 sroot 65537
2.000000185530773
3 sroot 7625597484987
3
3 sroot 7625597400000
2.999999999843567
3 sroot 7625597500000
3.000000000027626
'3' एक सटीक मान के रूप में सामने आता है क्योंकि यह बाइनरी खोज (2 से शुरू होकर, 4 से दोगुना, 3 से द्विगुणित) से सीधे हिट होने वाले मानों में से एक होता है। सामान्य स्थिति में ऐसा नहीं होता है, इसलिए परिणाम aCT त्रुटि के साथ मूल मान को अनुमानित करेगा (अधिक सटीक रूप से, हर उम्मीदवार के आधार का लघुगणक परीक्षण tolerCT सहिष्णुता के साथ किया जाता है।)