यह सभी नकारात्मक संख्याओं के लिए सही है।
f (n) = abs (n)
चूँकि वहाँ एक से अधिक ऋणात्मक संख्याएँ हैं, क्योंकि टॉक्सो पूरक पूर्णांकों के लिए धनात्मक संख्याएँ हैं, समाधान की f(n) = abs(n)
तुलना में एक और मामले के लिए मान्य f(n) = n > 0 ? -n : n
है जो उसी के समान है f(n) = -abs(n)
। आपको एक मिला ...: डी
अपडेट करें
नहीं, यह एक मामले के लिए मान्य नहीं है, क्योंकि मुझे सिर्फ लिटबॅट की टिप्पणी से मान्यता प्राप्त है ... abs(Int.Min)
बस अतिप्रवाह होगा ...
मैंने मॉड 2 की जानकारी का उपयोग करने के बारे में सोचा, भी, लेकिन निष्कर्ष निकाला, यह काम नहीं करता ... जल्दी। यदि सही किया जाता है, तो यह सभी नंबरों के लिए काम करेगा सिवाय इसके Int.Min
क्योंकि यह अतिप्रवाह करेगा।
अपडेट करें
मैं इसके साथ थोड़ी देर के लिए खेला, एक अच्छा सा हेरफेर चाल की तलाश में, लेकिन मुझे एक अच्छा एक-लाइनर नहीं मिला, जबकि मॉड 2 समाधान एक में फिट बैठता है।
f (n) = 2n (abs (n)% 2) - n + sgn (n)
C # में, यह निम्नलिखित बन जाता है:
public static Int32 f(Int32 n)
{
return 2 * n * (Math.Abs(n) % 2) - n + Math.Sign(n);
}
सभी मूल्यों के लिए इसे काम करने के लिए, आपको एक ब्लॉक में गणना को शामिल Math.Abs()
करना होगा (n > 0) ? +n : -n
और शामिल करना होगा unchecked
। तब आप Int.Min
खुद भी मैप हो जाते हैं जैसे कि अनियंत्रित नकार करता है।
अपडेट करें
एक अन्य उत्तर से प्रेरित होकर मैं यह बताने जा रहा हूं कि फ़ंक्शन कैसे कार्य करता है और इस तरह के फ़ंक्शन का निर्माण कैसे किया जाता है।
शुरू में ही शुरू कर देता है। फ़ंक्शन f
को बार-बार दिए गए मान पर लागू किया जाता है, जो n
मानों के अनुक्रम को दर्शाते हैं।
n => f (n) => f (f (n)) => f (f (f (n))) => f (f (f (n)))) => ...
प्रश्न मांग करता है f(f(n)) = -n
, कि f
तर्क को नकारने के दो क्रमिक अनुप्रयोग हैं । आगे के दो f
- चार के कुल आवेदन - तर्क को फिर से उपज n
फिर से नकारना ।
n => f (n) => -n => f (f (f (n))) => n => f (n) => ...
अब लंबाई चार का एक स्पष्ट चक्र है। स्थानापन्न x = f(n)
और यह देखते हुए कि प्राप्त समीकरण f(f(f(n))) = f(f(x)) = -x
रखती है, निम्नलिखित अर्जित करता है।
n => x => -n => -x => n => ...
तो हम दो संख्याओं के साथ लंबाई चार का एक चक्र प्राप्त करते हैं और दो संख्याओं को नकार दिया जाता है। यदि आप चक्र को एक आयत के रूप में कल्पना करते हैं, तो नकारात्मक मूल्य विपरीत कोनों पर स्थित हैं।
इस तरह के एक चक्र के निर्माण के कई समाधानों में से एक n से शुरू होने वाला है।
n => एक को नकारा और घटाया
-n - 1 = - (n + 1) => एक जोड़ें
-n => नकारात्मक और एक जोड़ें
n + 1 => एक घटाओ
n
एक ठोस उदाहरण ऐसे चक्र का है +1 => -2 => -1 => +2 => +1
। हम लगभग कर चुके हैं। यह देखते हुए कि निर्मित चक्र में एक विषम धनात्मक संख्या होती है, इसका उत्तराधिकारी भी और दोनों संख्याएँ नकारात्मक होती हैं, हम पूर्णांकों को आसानी से कई ऐसे चक्रों में विभाजित कर सकते हैं ( 2^32
जो कि चार में से एक है) और एक ऐसा फ़ंक्शन मिला है जो स्थितियों को संतुष्ट करता है।
लेकिन हमें शून्य की समस्या है। चक्र में सम्मिलित होना चाहिए 0 => x => 0
क्योंकि शून्य अपने आप में नकारात्मक है। और क्योंकि चक्र पहले से ही 0 => x
यह बताता है 0 => x => 0 => x
। यह केवल लंबाई दो का एक चक्र है और x
दो अनुप्रयोगों के बाद खुद में बदल जाता है, में नहीं -x
। सौभाग्य से एक मामला है जो समस्या को हल करता है। यदि X
शून्य शून्य के बराबर होता है, तो हम केवल शून्य वाले लंबाई का एक चक्र प्राप्त करते हैं और हमने उस समस्या को हल कर दिया है कि शून्य एक निश्चित बिंदु है f
।
किया हुआ? लगभग। हमारे पास 2^32
संख्याएँ हैं, शून्य एक निश्चित बिंदु है जो 2^32 - 1
संख्याओं को छोड़ता है , और हमें उस संख्या को चार संख्याओं के चक्रों में विभाजित करना चाहिए। बुरा जो 2^32 - 1
चार में से एक नहीं है - लंबाई चार के किसी भी चक्र में नहीं तीन संख्याएँ रहेंगी।
मैं समाधान 3 बिट पर हस्ताक्षर किए से लेकर itegers के छोटे सेट का उपयोग के शेष भाग की व्याख्या करेगा -4
करने के लिए +3
। हम शून्य के साथ किया जाता है। हमारा एक पूरा चक्र है +1 => -2 => -1 => +2 => +1
। अब हम शुरू होने वाले चक्र का निर्माण करते हैं +3
।
+3 => -4 => -3 => +4 => +3
समस्या यह है कि +4
3 बिट पूर्णांक के रूप में प्रतिनिधित्व योग्य नहीं है। हम इसे +4
नकार -3
कर प्राप्त करेंगे +3
- जो अभी भी एक वैध 3 बिट पूर्णांक है - लेकिन फिर एक +3
(बाइनरी 011
) को जोड़ने से बाइनरी 100
मिलती है। अहस्ताक्षरित पूर्णांक के रूप में व्याख्या की गई है, +4
लेकिन हमें इसे हस्ताक्षरित पूर्णांक के रूप में व्याख्या करना होगा -4
। तो वास्तव -4
में इस उदाहरण के लिए या Int.MinValue
सामान्य मामले में पूर्णांक अंकगणितीय निषेध का दूसरा निश्चित बिंदु है - 0
और Int.MinValue
उन्हें मैप किया जाता है। तो चक्र वास्तव में इस प्रकार है।
+3 => -4 => -3 => -4 => -3
यह लंबाई दो का एक चक्र है और इसके अलावा +3
चक्र के माध्यम से प्रवेश करता है -4
। परिणाम -4
में सही ढंग से दो फ़ंक्शन अनुप्रयोगों के बाद खुद को मैप किया जाता है, दो फ़ंक्शन अनुप्रयोगों के बाद +3
सही ढंग से मैप किया जाता है -3
, लेकिन -3
दो फ़ंक्शन अनुप्रयोगों के बाद गलती से खुद को मैप किया जाता है।
इसलिए हमने एक फ़ंक्शन का निर्माण किया जो सभी पूर्णांकों के लिए काम करता है लेकिन एक। क्या हम बेहतर कर सकते हैं? हम नहीं कर सकते। क्यों? हमें लंबाई चार के चक्रों का निर्माण करना होगा और चार पूर्णांक तक पूरे पूर्णांक रेंज को कवर करने में सक्षम हैं। शेष मान दो निश्चित बिंदु हैं 0
और Int.MinValue
उन्हें स्वयं और दो मनमाने ढंग से पूर्णांक में मैप किया जाना चाहिए x
और -x
दो फ़ंक्शन अनुप्रयोगों द्वारा एक दूसरे के लिए मैप किया जाना चाहिए।
इसके विपरीत नक्शा बनाने के x
लिए -x
उन्हें चार चक्र बनाने होंगे और उन्हें उस चक्र के विपरीत कोनों पर स्थित होना चाहिए। परिणाम में 0
और Int.MinValue
विपरीत कोनों पर भी होना चाहिए। यह सही ढंग से नक्शा करेगा x
और -x
दो निश्चित बिंदुओं 0
और Int.MinValue
दो फ़ंक्शन अनुप्रयोगों के बाद स्वैप करेगा और दो असफल इनपुट के साथ हमें छोड़ देगा। इसलिए ऐसा फ़ंक्शन बनाना संभव नहीं है जो सभी मूल्यों के लिए काम करता है, लेकिन हमारे पास एक है जो एक को छोड़कर सभी मूल्यों के लिए काम करता है और यह सबसे अच्छा है जिसे हम प्राप्त कर सकते हैं।