बड़ी संख्या में चुनौतियों के कारण मैंने सोचा कि यह दिलचस्प हो सकता है।
इस चुनौती में, हम बड़े पूर्णांकों पर जोड़, घटाव और गुणा करने के लिए अवशेष संख्या प्रणाली (RNS) का उपयोग करेंगे।
आरएनएस क्या है
आरएनएस कई तरीकों में से एक है जो लोगों ने पूर्णांक की पहचान करने के लिए विकसित किया है। इस प्रणाली में, संख्याओं को अवशेषों के अनुक्रम द्वारा दर्शाया जाता है (जो एक मापांक ऑपरेशन के बाद परिणाम होते हैं (यानी पूर्णांक विभाजन के बाद शेष)। इस प्रणाली में, प्रत्येक पूर्णांक में कई अभ्यावेदन होते हैं। चीजों को सरल रखने के लिए, हम चीजों को सीमित करने जा रहे हैं ताकि प्रत्येक पूर्णांक को विशिष्ट रूप से दर्शाया जाए। मुझे लगता है कि यह बताना आसान है कि ठोस उदाहरण के साथ क्या हो रहा है।
आइए हम पहले तीन अभाज्य संख्याओं को देखें: 2, 3, 5. RNS प्रणाली में, हम इन तीन संख्याओं का उपयोग विशिष्ट रूप से किसी भी संख्या का प्रतिनिधित्व करने के लिए कर सकते हैं जो अवशेषों का उपयोग करते हुए 2 * 3 * 5 = 30 से कम है। 21 लें:
21 30 से कम है, इसलिए हम इसे 2, 3 और 5 के माध्यम से परिणाम के बाद इसका प्रतिनिधित्व कर सकते हैं, और (अर्थात 2, 3 और 5 द्वारा पूर्णांक विभाजन के बाद शेष)
हम पूर्णांक के निम्नलिखित अनुक्रम के साथ 21 की पहचान करेंगे:
21 ~ {21 मॉड 2, 21 मॉड 3, 21 मॉड 5} = {1, 0, 1}
और इसलिए हमारे आरएनएस सिस्टम में, "21" के बजाय, हम {1,0,1} का उपयोग करेंगे।
सामान्य रूप से पूर्णांक n को देखते हुए , हम n को { n mod 2, ..., n mod p_k } के रूप में दर्शाते हैं , जहाँ p_k सबसे छोटा अभाज्य है, जैसे n , p_k से कम या बराबर सभी primes के उत्पाद से कम है ।
एक अन्य उदाहरण है, हम 3412. है का कहना है कि हम यहाँ क्योंकि 2,3,5,7,11,13 उपयोग करने की आवश्यकता 2*3*5*7*11*13=30030
है, जबकि, 2*3*5*7*11=2310
जो बहुत छोटा है।
3412 ~ {3412 mod 2, 3412 mod 3, 3412, mod 5, ..., 3412 mod 13} = {0, 1, 2, 3, 2, 6}
आप ध्यान दें कि इस प्रणाली का उपयोग करके हम बहुत बड़ी संख्या में अपेक्षाकृत दर्द रहित रूप से प्रतिनिधित्व कर सकते हैं। {1, 2, 3, 4, 5, 6, 7, 8, ...} अवशेषों का उपयोग करते हुए, हम {2, 6, 30, 210, 2310, 30030, 510510, 9699690 ...} तक की संख्याओं का प्रतिनिधित्व कर सकते हैं। क्रमशः। ( यहाँ श्रृंखला है )
हमारा काम
हम इन अवशेषों का उपयोग बड़ी संख्या में +, - और * करने के लिए करेंगे। मैं नीचे इन प्रक्रियाओं का वर्णन करूंगा। अभी के लिए यहाँ इनपुट और आउटपुट स्पेक्स हैं।
इनपुट
आपको एक स्टडिन या फ़ंक्शन तर्क के माध्यम से दो (संभावित रूप से बहुत बड़ी) संख्या दी जाएगी। उन्हें आधार 10 अंकों के तार के रूप में दिया जाएगा।
समस्या को आगे बढ़ाने के उद्देश्यों के लिए, हम पहला इनपुट n
और दूसरा कॉल करते हैं m
। N> m> = 0 मान लें ।
तुम भी दिया जाएगा +
या -
या *
आपरेशन इंगित करने के लिए प्रदर्शन करने के लिए।
उत्पादन
आज्ञा देना x एक पूर्णांक है। हम [का उपयोग करेगा x ] RNS प्रतिनिधित्व के ऊपर वर्णित का उल्लेख करने के एक्स ।
आप आउटपुट के लिए हैं [n] <operator> [m] = [result]
आरएनएस में संचालन कैसे करें
ये ऑपरेशन अपेक्षाकृत सरल हैं। RNS संकेतन में दो संख्याओं को देखते हुए, उन्हें जोड़ना, घटाना या गुणा करना, बस दिए गए संचालन घटक-वार को निष्पादित करें और फिर मापांक लें।
अर्थात
{{2, 2, 3} + {1, 1, 4} = {(1 + 1) mod 2, (2 + 1) mod 3, (3 + 4) mod 5} = {0, 0, 2}
ध्यान दें कि यदि दो अलग-अलग संख्याओं का प्रतिनिधित्व करने के लिए उपयोग किए जाने वाले अवशेषों की संख्या समान नहीं है, तो संचालन करते समय, आपको "छोटी" संख्या का विस्तार करने की आवश्यकता होगी, ताकि उसके अवशेषों की संख्या समान हो। यह उसी प्रक्रिया का अनुसरण करता है। उदाहरण के लिए परीक्षण मामलों को देखें।
यदि परिणाम में इनपुट की तुलना में अधिक अवशेषों की आवश्यकता होती है तो वही होता है। फिर दोनों इनपुट को "विस्तारित" करने की आवश्यकता है।
महत्वपूर्ण विवरण
हम यहां बड़ी संख्या में काम करेंगे, लेकिन बड़े पैमाने पर नहीं। हम पहले 100 प्रिम्स के उत्पाद तक संख्याओं के लिए जिम्मेदार होंगे (नीचे देखें)। यह अंत करने के लिए, आपको पहले 100 प्राइम मुफ्त में दिए जाते हैं (कोई बाइट लागत नहीं) । आप उन्हें
p
अपनी भाषा में मुहावरेदार या कुछ मुहावरे में बाँध सकते हैं और फिर इस सरणी को अपने अंतिम कुल से आरंभ करने के लिए उपयोग किए जाने वाले बाइट्स की संख्या घटा सकते हैं। यह निश्चित रूप से इसका मतलब है कि वे हार्ड-कोडित हो सकते हैं या आप उन्हें बनाने के लिए बिल्ट-इन का उपयोग कर सकते हैं।यदि किसी कारण से यह आपकी भाषा में प्रयुक्त डिफ़ॉल्ट पूर्णांक प्रतिनिधित्व है। यह ठीक है।
जब तक यह आपकी भाषा का डिफ़ॉल्ट न हो आप किसी भी आर्बिट्रिश प्रिसिजन इंटेगर टाइप का उपयोग नहीं कर सकते हैं। यदि यह डिफ़ॉल्ट है, तो आप इसका उपयोग पूर्णांकों को संग्रहीत करने के लिए नहीं कर सकते हैं जो आमतौर पर 64 बिट्स में फिट नहीं होंगे।
स्पष्ट होने के लिए, प्रत्येक पूर्णांक को हमेशा संभव सबसे कम अवशेषों के साथ दर्शाया जाएगा। यह इनपुट और आउटपुट दोनों के लिए जाता है।
मुझे लगता है कि अन्य चश्मा को इसे रोकना चाहिए, लेकिन यह निरर्थक होना चाहिए: आप इनपुट पर दिए गए ऑपरेशन को निष्पादित नहीं कर सकते हैं और फिर आरएनएस और फिर आउटपुट में सब कुछ बदल सकते हैं। आपको इनपुट को RNS में बदलना होगा और फिर आउटपुट का उत्पादन करने के लिए ऑपरेशन करना होगा।
परीक्षण के मामलों
इनपुट:
n = 10
m = 4
+
आउटपुट:
{ 0, 1, 0 } + { 0, 1 } = { 0, 2, 4 }
स्पष्टीकरण:
सबसे पहले, अपने आरएनएस प्रतिनिधित्व के लिए प्रत्येक संख्या को बदल दें जैसा कि ऊपर वर्णित है:
10 ~ {0,1,0}
और 4 ~ {0,1}
। ध्यान दें कि जब हम घटक-वार करना चाहते हैं, तो 10
इससे अधिक घटक होते हैं 4
। इसलिए हमें छोटी संख्या को "विस्तारित" करना होगा। इसलिए हम संक्षेप में लिखेंगे 4 ~ {0,1} --> {0,1, 4 mod 5} = {0,1,4}
। अब हम इसके अलावा आगे बढ़ते हैं और फिर मापांक लेते हैं।
- इनपुट
n=28
m=18
+
आउटपुट:
[ 0, 1, 3 ] + [0, 0, 3 ] = [ 0, 1, 1, 4 ]
- इनपुट (कीबोर्ड पर मेरा चेहरा मैशिंग करना)
n=1231725471982371298419823012819231982571923
m=1288488183
*
आउटपुट (पठनीयता के लिए अलग लाइनों पर टूटा हुआ):
[1, 2, 3, 6, 2, 10, 2, 1, 12, 16, 7, 15, 34, 29, 31, 5, 55, 32, 66, 61, 3, 76, 52, 14, 65, 44, 99, 57 ]
*
[1, 0, 3, 3, 4, 8, 9, 10, 8, 0 ]
=
[1, 0, 4, 4, 8, 2, 1, 10, 4, 0, 17, 7, 27, 21, 44, 51, 56, 9, 6, 9, 12, 0, 52, 36, 43, 68, 99, 24, 96, 39, 96, 66, 125]
n
28 अपराधों की आवश्यकता है। m
आवश्यकता १०. n*m
३३ की आवश्यकता है।
- इनपुट
n=8709668761379269784034173446876636639594408083936553641753483991897255703964943107588335040121154680170867105541177741204814011615930342030904704147856733048115934632145172739949220591246493529224396454328521288726490
m=1699412683745170450115957274739962577420086093042490863793456500767137147999161679589295549397604032154933975242548831536518655879433595016
-
आउटपुट:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 509]
-
[0, 2, 1, 6, 1, 12, 11, 18, 14, 28, 21, 36, 37, 42, 16, 52, 41, 60, 16, 70, 49, 78, 80, 88, 49, 100, 13, 106, 4, 112, 68, 130, 36, 138, 37, 150, 0, 162, 8, 172, 163, 180, 18, 192, 129, 198, 135, 222, 78, 228, 90, 238, 57, 250, 36, 262, 87, 270, 206, 280, 193, 292, 253, 310, 224, 316, 57, 336, 48, 348]
=
[0, 1, 4, 1, 10, 1, 6, 1, 9, 1, 10, 1, 4, 1, 31, 1, 18, 1, 51, 1, 24, 1, 3, 1, 48, 1, 90, 1, 105, 1, 59, 1, 101, 1, 112, 1, 0, 1, 159, 1, 16, 1, 173, 1, 68, 1, 76, 1, 149, 1, 143, 1, 184, 1, 221, 1, 182, 1, 71, 1, 90, 1, 54, 1, 89, 1, 274, 1, 299, 1, 266, 1, 228, 1, 340, 1, 170, 1, 107, 1, 340, 1, 88, 1, 157, 1, 143, 1, 22, 1, 22, 1, 58, 1, 296, 1, 371, 1, 140]
n
100 primes का उपयोग करता है। m
70 primes का उपयोग करता है। n-m
99 primes का उपयोग करता है।
मैंने ChineseRem
GAP पर चीनी रेमिनेडर प्रमेय के अंतर्निहित कार्यान्वयन का उपयोग करके इनकी जाँच की (जो मूल रूप से RNS संख्या लेता है और उन्हें आधार 10 पूर्णांक में बदल देता है)। मेरा मानना है कि वे सही हैं। अगर कुछ गड़बड़ लगता है, तो कृपया मुझे बताएं।
देखभाल करने वालों के लिए, पहले 100 primes का उत्पाद है:
471193079990618495316248783476026042202057477340967552018863483961641533584503
422120528925670554468197243910409777715799180438028421831503871944494399049257
9030720635990538452312528339864352999310398481791730017201031090
यह संख्या उस अधिकतम संख्या से 1 बड़ी है जिसे हम दिए गए सिस्टम (और 100 मुख्य सीमा) का उपयोग करके दर्शा सकते हैं।
(a,b,o)=>a.map((v,i)=>eval(v+o+b[i]))
उदाहरण के लिए , प्रदर्शन केवल ES6 में है। मुझे लगता है कि सबसे कठिन हिस्सा शायद मनमानी परिशुद्धता अंकगणित का उपयोग किए बिना परिणाम का प्रतिनिधित्व करने के लिए आवश्यक अपराधों की संख्या पा रहा है, हालांकि आरएनएस के लिए बाद में रूपांतरण बिल्कुल तुच्छ नहीं है।
1234,1234,+
)?