मैथेमेटिका, 79 बाइट्स
Min[2#/(d=Divisors@#~Cases~_?OddQ)+d]-2⌊(2#)^.5+.5⌋+⌈Sqrt[8#+1]~Mod~1⌉&
व्याख्या
मुझे चुनौती में एल्गोरिथ्म को लागू करने के लिए परेशान नहीं किया जा सकता है, इसलिए मैं समाधान के लिए एक शॉर्टकट देखना चाहता था। जब मैंने एक पाया, दुर्भाग्य से यह गणितज्ञ उत्तर को हरा नहीं करता है जो एल्गोरिथ्म को लागू करता है। उस ने कहा, मुझे यकीन है कि यह अभी तक गोल्फ नहीं है, और ऐसी अन्य भाषाएं हो सकती हैं जो इस दृष्टिकोण या प्रक्रिया में प्राप्त कुछ अंतर्दृष्टि से लाभ उठा सकती हैं।
इसलिए मेरा दावा है कि हम जिस अनुक्रम की गणना करने वाले हैं वह है:
f (n) = 2 * ( A212652 (n) - A002024 (n)) + 1 + A023532 (n-1)
वैकल्पिक रूप से, यह f (n) = 1 है यदि n त्रिकोणीय संख्या है और f (n) = 2 * ( A212652 (n) - A002024 (n) + 1) अन्यथा।
पहली अभिव्यक्ति में, A023532 केवल इन दो अलग-अलग मामलों को एन्कोड करता है। अन्य दो क्रम (प्लस 1) सबसे बड़े पूर्णांक k के बीच का अंतर है जो कि पूर्णांक में n के सबसे लंबे विघटन में होता है (k-i + 1) + (k-i + 2) + ... + k = n और सबसे बड़ा पूर्णांक j तो 1 + 2 + ... + j <n ।
कुछ सरल शब्दों में, यहां बताया गया है कि हम गैर-त्रिकोणीय संख्याओं के लिए कैसे उत्तर पाते हैं: सबसे पहले, सबसे बड़ा त्रिकोणीय संख्या T j खोजें, जो n से कम है । फिर j वह पेनलाइन इंटीजर है जो चरण 1 के दौरान जुड़ जाता है (क्योंकि j + 1 को जोड़ने के बाद हमने n को पार कर लिया होगा )। फिर संभव के रूप में कई (या छोटे) लगातार पूर्णांकों में n को विघटित करें और इन नंबरों के बीच अधिकतम कॉल करें k । परिणाम केवल 2 * (kj) है । इसका सहज कारण यह है कि अपघटन में अधिकतम हर दूसरे चरण में 1 बढ़ता है और हम पहुंचते ही रुक जाते हैंके ।
हमें यह साबित करने के लिए चार चीजें दिखाने की जरूरत है कि यह काम करता है:
- f (n) = 1 त्रिकोणीय संख्याओं के लिए। यह तुच्छ रूप से मामला है, क्योंकि पहला कदम बस सभी त्रिकोणीय संख्याओं के माध्यम से पुनरावृत्त होता है। यदि हम इस प्रक्रिया के दौरान n n से टकराते हैं तो हम कर रहे हैं और गणना करने के लिए केवल एक कदम था।
- अन्य सभी नंबरों के लिए, हम हमेशा एक विलोपन चरण के बाद समाप्त होते हैं, एक सम्मिलन चरण के बाद कभी नहीं। इसका मतलब है कि अन्य सभी f (n) सम हैं।
- पहले के बाद प्रत्येक प्रविष्टि चरण में, हम केवल एक ही संख्या जोड़ते हैं। यह गारंटी देता है कि हम चरणों के kj जोड़े के बाद कश्मीर सहित एक अपघटन तक पहुंचेंगे ।
- N का अंतिम अपघटन जो हमें प्राप्त होता है वह हमेशा n का लगातार पूर्णांक में सबसे लंबे समय तक संभव अपघटन होता है, या दूसरे शब्दों में, सदैव संख्याओं के बीच सबसे कम n के साथ n का अपघटन होता है । दूसरे शब्दों में, हम जिस अंतिम संख्या को जोड़ते हैं वह हमेशा A212652 (n) है ।
हमने पहले ही दिखाया है कि (1) सत्य क्यों है। अगला, हम साबित करते हैं कि हम प्रारंभिक एक को छोड़कर एक प्रविष्टि चरण पर समाप्त नहीं हो सकते हैं (जो गैर-त्रिकोणीय संख्याओं के लिए नहीं होता है)।
मान लीजिए कि हमें एक प्रविष्टि कदम को समाप्त हो गया, तक पहुँचने n एक मूल्य जोड़ने के बाद पी योग करने के लिए। इसका मतलब है कि इस प्रविष्टि कदम से पहले, मूल्य np था ( या कम है अगर हमने एक साथ कई मान जोड़े हैं)। लेकिन यह प्रविष्टि चरण एक विलोपन चरण से पहले था (क्योंकि हम चरण 1 के दौरान n को हिट नहीं कर सकते थे )। एल्गोरिथ्म के काम करने के तरीके के कारण इस विलोपन चरण के दौरान हटाए गए अंतिम मान क्यू आवश्यक रूप से p से कम था । लेकिन इसका मतलब यह है कि इससे पहले कि हम q हटा दें, हमारे पास n-p + q ( या कम ) है जो n से कम है। लेकिन यह एक विरोधाभास है, क्योंकि जब हमने n-p + q मारा, तो एक और q हटाने के बजाय पूर्णांक हटाना बंद करना होगा । यह ऊपर बिंदु (2) साबित होता है। तो अब हम जानते हैं कि हम हमेशा एक विलोपन कदम पर समाप्त होते हैं और इसलिए सभी गैर-त्रिकोणीय संख्याओं में भी आउटपुट होते हैं।
अगला हम साबित करते हैं (3), कि प्रत्येक प्रविष्टि कदम केवल एक मूल्य सम्मिलित कर सकता है। यह अनिवार्य रूप से (2) का एक कोरोलरी है। हमने दिखाया है कि एक मान जोड़ने के बाद हम n को बिल्कुल नहीं मार सकते हैं और चूंकि यह साबित कर रहा है कि असमानता का उपयोग किया जा रहा है, इसलिए हम n को भी समाप्त नहीं कर सकते (तब से n-p + q अभी भी n से कम होगा और हमें हटाया नहीं जाना चाहिए था पहली बार में कई मूल्य)। इसलिए जब भी हम एक मान जोड़ते हैं, तो हम n से अधिक होने की गारंटी देते हैं क्योंकि हम एक छोटे मान को हटाकर n से नीचे चले गए हैं । इसलिए, हम जानते हैं कि राशि का ऊपरी सिरा 1 हर दूसरे चरण से बढ़ता है । हम इस ऊपरी छोर का प्रारंभिक मूल्य जानते हैं (यह सबसे छोटा मीटर ऐसा है)टी एम > एन )। जब हम अंतिम राशि पर पहुँच जाते हैं तो हमें केवल इस ऊपरी सिरे का पता लगाने की आवश्यकता होती है। फिर चरणों की संख्या बस अंतर से दोगुनी है (प्लस 1)।
ऐसा करने के लिए, हम साबित करते हैं (4), कि अंतिम योग हमेशा n में जितना संभव हो उतना पूर्णांक का अपघटन होता है, या अपघटन जहां उस अपघटन में अधिकतम न्यूनतम होता है (यानी यह जल्द से जल्द संभव अपघटन है)। हम फिर से विरोधाभास द्वारा ऐसा करेंगे (इस भाग में शब्दांकन थोड़ा अधिक कठोर हो सकता है, लेकिन मैंने पहले ही इस पर बहुत समय लगा दिया है ...)।
कहें कि एन का जल्द से जल्द / सबसे लंबा संभव अपघटन कुछ a + (a + 1) + ... (b-1) + b , long b है , और एल्गोरिथ्म इसे छोड़ देता है। समय है कि कम से इसका मतलब है कि ख जुड़ जाता है, एक जरूरी नहीं रह गया है योग का हिस्सा हो। तो एक योग का हिस्सा था रों है, तो हम चाहते हैं n ≤ है उस पल में। तो या तो योग केवल से मान हैं एक करने के लिए ख है, जो बराबर होती है n और हम रोक (इसलिए हम इस विघटन को छोड़ नहीं किया था), या वहाँ कम से कम एक मूल्य से कम है एक राशि में, जीतने के जो मामले n <रोंऔर उस मूल्य को हटा दिया जाएगा जब तक कि हम सटीक राशि (फिर से, अपघटन को छोड़ नहीं दिया गया था) को मारा। तो हम से छुटकारा पाने के होगा एक जोड़ने से पहले ख । लेकिन उस साधन हम होगा एक स्थिति है जिसमें तक पहुंचने के लिए एक राशि में सबसे छोटी घटक है, और सबसे बड़ा नहीं है ख अभी तक। हालाँकि, उस बिंदु पर हम ए नहीं हटा सकते हैं , क्योंकि योग स्पष्ट रूप से n से कम है (क्योंकि बी गायब है), इसलिए हमें मूल्यों को जोड़ने की आवश्यकता है जब तक कि हम बी नहीं जोड़ते हैं और वास्तव में एन को हिट करते हैं। यह साबित करता है (4)।
इसलिए इन चीजों को एक साथ लेना: हम जानते हैं कि चरणों की पहली जोड़ी हमें A002024 (n) का अधिकतम मूल्य देती है । हम जानते हैं कि अंतिम अपघटन का अधिकतम मूल्य A212652 (n) है । और हम जानते हैं कि प्रत्येक जोड़ी में एक बार यह अधिकतम वृद्धि होती है। इसलिए, अंतिम अभिव्यक्ति 2 * ( A212652 (n) - A002024 (n) + 1) है । यह सूत्र लगभग त्रिकोणीय संख्याओं के लिए काम करता है, सिवाय इसके कि हमें केवल 2 के बजाय 1 चरण की आवश्यकता होती है, यही कारण है कि हम त्रिकोणीय संख्याओं (या इसके विपरीत, जो भी अधिक सुविधाजनक है) के सूचक फ़ंक्शन के साथ परिणाम को सही करते हैं।
अंत में, कार्यान्वयन के लिए के रूप में। पूर्व अनुक्रम के लिए, मैं OEIS से सूत्र MIN (विषम d। N; n / d + (d-1) / 2) का उपयोग कर रहा हूं । यह कुछ बाइट्स को बचाने के लिए निकलता है यदि हम MIN (विषम d। = 2n / d + d-1) प्राप्त करने के लिए इस अभिव्यक्ति में 2 का कारक लेते हैं , क्योंकि -1 मेरे पहले संस्करण में +1 के साथ रद्द करता है के च (एन) जो सीधे त्रिकोणीय और गैर त्रिकोणीय संख्या के लिए दो मामलों encodes। कोड में, यह है:
Min[2#/(d=Divisors@#~Cases~_?OddQ)+d]
बाद के अनुक्रम के लिए ( 1, 2, 2, 3, 3, 3, ...
), हम एक सरल बंद फॉर्म का उपयोग कर सकते हैं:
⌊(2#)^.5+.5⌋
और अंत में, त्रिकोणीय संख्याओं का व्युत्क्रम सूचक फ़ंक्शन 0 है जब भी 8n + 1 एक पूर्ण वर्ग होता है। इसे गणितज्ञ के रूप में व्यक्त किया जा सकता है
⌈Sqrt[8#+1]~Mod~1⌉
इन अंतिम दो अनुक्रमों को व्यक्त करने और उनके बीच कुछ निरंतर ऑफसेट को स्थानांतरित करने के बहुत सारे तरीके हैं, इसलिए मुझे यकीन है कि यह अभी तक एक इष्टतम कार्यान्वयन नहीं है, लेकिन मुझे आशा है कि इससे दूसरों को नए दृष्टिकोणों को देखने के लिए एक प्रारंभिक बिंदु मिल सकता है। उनकी अपनी भाषाएं।
जब से मैं इस सारी परेशानी में गया, यहाँ n = 1000 तक के अनुक्रम की एक साजिश है (मैं कुछ सेकंड में 100k की गणना भी कर सकता हूं, लेकिन यह वास्तव में कोई अतिरिक्त अंतर्दृष्टि नहीं दिखाता है):
यह उन बहुत सीधी रेखाओं के बारे में विविधताओं को देखना दिलचस्प हो सकता है, लेकिन मैं इसे किसी और को छोड़ दूँगा ...