कोई भी दस्तावेज जो कहता है कि वास्तव में .NET BigIntegers किस संख्या में हैं?


12

मैं .NET BigInteger के साथ खेल रहा हूं और मूल रूप से सोच रहा हूं कि क्या संख्या - और अनुमानित उत्तर ठीक होगा-- के वक्र के विचलन का बिंदु है (का ग्राफ (संचालन के लिए आवश्यक समय की वृद्धि) बनाम (BigInteger का मूल्य))?

या वे ऐसे किसी भी विचलन के साथ डिज़ाइन नहीं किए गए हैं जैसे कि अगर हम 1 से अनंत तक बिगइन्टेगर के संचालन बनाम मूल्य के लिए आवश्यक समय की वृद्धि की साजिश करते हैं, तो हमारे पास सभी तरह से एक चिकनी वक्र होगा?

उदाहरण के लिए, मान लेना सरणियों को 50 वस्तुओं को संभालने की क्षमता के साथ डिज़ाइन किया गया है। इसका मतलब यह है कि अगर मेरे पास 1 आइटम है, तो संचालन एफ (1) समय है। और जब मेरे पास 2 आइटम होते हैं, तो संचालन f (2) समय होता है। अगर मेरे पास 50 आइटम हैं, तो संचालन एफ (50) समय है। लेकिन चूंकि यह केवल 50 वस्तुओं को संभालने के लिए डिज़ाइन किया गया है, इसलिए जब हमारे पास 51 आइटम होंगे, तो जी (51) जहां जी (51)> एफ (51) होगा।

यदि ठीक से लागू किया जाए तो BigInteger अंकगणित की जटिलता एक चिकनी वक्र होनी चाहिए। उदाहरण के लिए गुणा की समय जटिलता O (NM) होनी चाहिए जहां N पहले गुणक में अंकों की संख्या है, और M दूसरे गुणक में अंकों की संख्या है। बेशक इसमें व्यावहारिक सीमाएँ हैं कि आप N और M को इतना बड़ा उठा सकते हैं कि नंबर आपके मशीन में फिट नहीं होंगे।

क्या कोई ऐसा कोई दस्तावेज है जो यह दावा करता है कि इसे लागू किया गया है?


3
@ मतदाता, वोट डाउन का मतलब कुछ भी नहीं है यदि आप यह समझाते हुए टिप्पणी नहीं छोड़ सकते कि प्रश्न एक अच्छा प्रश्न क्यों नहीं है। मैंने इसे उतारा क्योंकि मुझे इसके साथ कोई समस्या नहीं दिख रही है।
मफिन मैन

मैं नीचे नहीं गया, लेकिन मुझे यकीन नहीं है कि यहाँ क्या सवाल है। क्या आप बड़े निशान (इसके अलावा, गुणन, विभाजन आदि) पर संचालन की रनटाइम / मेमोरी जटिलता जानना चाहते हैं?
nikie

उदाहरण के लिए, मान लेना सरणियों को 50 वस्तुओं को संभालने की क्षमता के साथ डिज़ाइन किया गया है। इसका मतलब है कि अगर मेरे पास 1 आइटम है और संचालन एफ (1) समय है। और जब मेरे पास 2 आइटम होते हैं, तो संचालन f (2) समय होता है। अगर मेरे पास 50 आइटम हैं तो ऑपरेशन (50) समय होगा। लेकिन चूंकि इसे केवल 50 वस्तुओं को संभालने के लिए डिज़ाइन किया गया है, इसलिए जब हमारे पास 51 आइटम होंगे तब किए गए संचालन जी (51) होंगे जहां जी (51)> एफ (51)
पेसरियर

@ घर ई। अनुदान हाँ! यह वही है जिसके बारे में बात कर रहा हूं। सवाल यह है कि क्या कोई भी है / क्या किसी को किसी भी दस्तावेज के बारे में पता है जो यह दावा करता है कि इसे इस तरह लागू किया गया है?
पेसरियर

@ पेसियर ने अपनी टिप्पणी को मेरे उत्तर में स्थानांतरित कर दिया है, और इस पर चर्चा करने वाले दस्तावेज़ के लिंक को जोड़ दिया है।
चार्ल्स ई। ग्रांट

जवाबों:


7

कोई भी संख्या जो संभवतः ULong.MaxValue से बड़ी हो सकती है, या Long.MinValue की तुलना में छोटी हो सकती है, Bigteger का उपयोग करके प्रतिनिधित्व किया जाना चाहिए।

यदि नहीं (Long.MinValue <= X <= ULong.MaxValue) तो BigInteger

BigInteger सामान्य प्राइमरी की तुलना में बहुत बड़ी संख्या के लिए संभाल सकता है।

उदाहरण के लिए यदि आपका पूर्णांक लॉन्ग की सीमा के बाहर है, तो आपको शायद BigInteger का उपयोग करना चाहिए। ये मामले हालांकि बहुत दुर्लभ हैं, और इन वर्गों का उपयोग उनके आदिम समकक्षों की तुलना में काफी अधिक है।

उदाहरण के लिए, long64 बिट्स चौड़ा है और यह रेंज पकड़ सकता है: -9,223,372,036,854,775,808 से 9,223,372,036,854,775,80। ulong 0 से 18,446,744,073,709,551,615 पकड़ सकता है। यदि आपकी संख्या इससे बड़ी या छोटी है, तो BigInteger आपका एकमात्र विकल्प है

एकमात्र बार जब मैंने उन्हें एक वास्तविक विश्व अनुप्रयोग में उपयोग करते देखा है, वह एक स्टारचैटिंग अनुप्रयोग था।

यह भी देखें: .NET में आदिम रेंज


मेरा मतलब है कि मुझे पता है कि जब भी हम कर सकते हैं तो हमें सामान्य आदिम का उपयोग करना चाहिए। मेरा मतलब है कि बिगइंटर को उलॉन्ग से अधिक 100 बार नंबर के लिए डिज़ाइन किया गया है। या बिगइन्टेगर को ULong.MVValue की तुलना में 100k गुना बड़े नंबर के लिए डिज़ाइन किया गया है? मेरा मतलब है कि मुझे पता है कि यह उलॉन्ग.मैक्सवेल की तुलना में 100k गुना बड़ा हो सकता है, लेकिन क्या यह इस रेंज को ध्यान में रखकर बनाया गया है, या क्या इसे "आउट-ऑफ-साधारण आवश्यकता" घोषित की गई सीमा के साथ डिज़ाइन किया गया है?
पचेरियर

5
आप BigInteger का उपयोग किए बिना ULong.MaxValue की तुलना में एक से अधिक संख्या का प्रतिनिधित्व नहीं कर सकते, इसलिए यह उसके लिए है। कोई भी संख्या जो संभवतः ULong.MaxValue से बड़ी हो सकती है, एक BigInteger होनी चाहिए।
Malfist

बेशक, Ulong.MaxValue और BigInteger का उपयोग किए बिना संख्या से अधिक का प्रतिनिधित्व करने के तरीके हैं। मैं बस एक कस्टम संरचना लिख ​​सकता हूं जिसमें एक उलॉन्ग और एक बूलियन शामिल है और viola मैं दो बार उलॉन्ग का प्रतिनिधित्व कर सकता हूं। MaxValue
Pacerier

हां, लेकिन यह BigInteger का उपयोग करने के लिए कम जटिल है, और यह शायद बहुत तेज़ नहीं होगा, यदि कोई तेज़ हो, और यह BigInteger जितना लचीला नहीं होगा। आप बूलियन की एक सरणी के साथ बहुत बड़ी संख्या का प्रतिनिधित्व कर सकते हैं, लेकिन यह अभी भी जटिल है।
मालफिस्ट

2
@Mavrik, उसने इसे मेरे द्वारा दिए गए उत्तर की तुलना में पूरी तरह से अलग प्रश्न में बदल दिया है।
मालफिस्ट

4

कुछ अर्थों में BigInteger का बिंदु इतना अधिक पूर्ण आकार का नहीं है क्योंकि यह असीमित परिशुद्धता है। फ्लोटिंग पॉइंट संख्या बहुत बड़ी हो सकती है, लेकिन सीमित परिशुद्धता है। BigInteger आपको गोलाकार त्रुटियों या अतिप्रवाह के बारे में कोई चिंता के साथ अंकगणित करने की सुविधा देता है। आपके द्वारा भुगतान किया जाने वाला मूल्य यह है कि यह साधारण पूर्णांकों या फ्लोटिंग पॉइंट नंबरों के साथ अंकगणित की तुलना में सैकड़ों गुना धीमा है।

जैसा कि दूसरों ने बताया है, उलॉन्ग 0 से 18,446,744,073,709,551,615 के बीच हो सकता है, और जब तक आप उस सीमा में रहते हैं आप सटीक अंकगणित कर सकते हैं। यदि आप उस सीमा से आगे 1 भी जाते हैं, तो आपको एक अतिप्रवाह मिलेगा, इसलिए आपके प्रश्न का उत्तर बिगइंटर का उपयोग करें यदि आपको सटीक अंकगणित की आवश्यकता है और कोई भी संभावना है कि कोई भी मध्यवर्ती परिणाम 18,446,744,073,70,551,615 से अधिक होगा।

विज्ञान, इंजीनियरिंग और वित्त में अधिकांश समस्याएं फ्लोटिंग पॉइंट नंबरों द्वारा मजबूर होने वाले अनुमानों के साथ रह सकती हैं, और बिगइंटर अंकगणित की समय लागत वहन नहीं कर सकती हैं। अधिकांश वाणिज्यिक गणना फ्लोटिंग पॉइंट अंकगणित के अनुमानों के साथ नहीं रह सकते हैं, लेकिन 0 से 18,446,744,073,709,551,615 के भीतर काम करते हैं, इसलिए वे साधारण अंकगणित का उपयोग कर सकते हैं। संख्या सिद्धांत से एल्गोरिदम का उपयोग करते समय बिगइंटर की आवश्यकता होती है जिसमें क्रिप्टोग्राफी (50 अंकों की प्रमुख संख्याएं) जैसी चीजें शामिल हैं। इसका उपयोग कभी-कभी वाणिज्यिक अनुप्रयोगों में भी किया जाता है जब सटीक गणना की आवश्यकता होती है, गति बहुत महत्वपूर्ण नहीं होती है, और एक उचित निश्चित दशमलव बिंदु प्रणाली स्थापित करना बहुत अधिक परेशानी है।

यदि ठीक से लागू किया जाए तो BigInteger अंकगणित की जटिलता एक चिकनी वक्र होनी चाहिए। उदाहरण के लिए गुणा की समय जटिलता O (NM) होनी चाहिए जहां N पहले गुणक में अंकों की संख्या है, और M दूसरे गुणक में अंकों की संख्या है। बेशक इसमें व्यावहारिक सीमाएँ हैं कि आप N और M को इतना बड़ा उठा सकते हैं कि नंबर आपके मशीन में फिट नहीं होंगे।

यदि आप "biginteger की कम्प्यूटेशनल जटिलता" को गूगल करते हैं, तो आपको एक स्टिक को हिला देने से अधिक संदर्भ मिलेंगे। आपके प्रश्न के लिए सीधे बोलने वाला एक यह है: दो मनमाने ढंग से सटीक अंकगणितीय पैकेजों की तुलना


4

मेमोरी सीमा

BigInteger संग्रहण के लिए अंतर सरणी पर निर्भर है। यह मानते हुए, अधिकतम संख्या के लिए सैद्धांतिक सीमा, कि BigInteger प्रतिनिधित्व करने में सक्षम है, इननेट में उपलब्ध अधिकतम सरणी आकार से प्राप्त किया जा सकता है। यहाँ सरणियों के बारे में एक SO विषय है: C # में एक सरणी के लिए मैं कितनी मेमोरी आवंटित कर सकता हूं, यह खोजना

यह मानते हुए कि हम अधिकतम सरणी आकार जानते हैं, हम अधिकतम संख्या का अनुमान लगा सकते हैं, जिसे BigInteger प्रतिनिधित्व कर सकता है: (2 ^ 32) ^ max_array_size, जहाँ:

  • 2 ^ 32 - सरणी सेल में अधिकतम संख्या (int)
  • max_array_size - int सरणी का अधिकतम अनुमत आकार जो 2GB के ऑब्जेक्ट आकार द्वारा सीमित है

यह 600 मिलियन दशमलव अंकों के साथ संख्या देता है।

प्रदर्शन की सीमा

प्रदर्शन के लिए, BigInteger जोड़ने के लिए गुणन और रैखिक एल्गोरिथ्म के लिए Karatsuba एल्गोरिथ्म का उपयोग करता है । गुणन जटिलता है 3 * n ^ 1.585, इसका मतलब है कि यह बड़ी संख्या ( कॉम्प्लेक्सिटी ग्राफ ) के लिए भी बहुत अच्छा होगा , हालांकि आप अभी भी रैम और प्रोसेसर कैश के आकार के आधार पर प्रदर्शन जुर्माना लगा सकते हैं।

जहाँ तक, अधिकतम संख्या का आकार 2GB तक सीमित है, वंश मशीन पर आपको अप्रत्याशित प्रदर्शन अंतर दिखाई नहीं देगा, लेकिन फिर भी 600 मिलियन अंकों के अंकों पर काम करना धीमा हो जाएगा।


यह अद्भुत जानकारी है, हालांकि आपका स्रोत कहां है कि BigInteger int arrays पर निर्भर है?
पचेरियर

मैंने अभी डॉट नेट का उपयोग करके .net स्रोतों में खोदा है। ऐसा लगता है कि संख्या खुद को Uint [] BigInteger संरचना के _data के अंदर संग्रहीत किया गया है।
वलेरा कोलुपाएव

* अधिक विस्तृत उत्तर के साथ अद्यतन, हालांकि, मुझे कोई भी .net स्रोत कोड नहीं मिल सकता है, जिसे मैं विघटित स्निपेट को छोड़कर संदर्भित कर सकता हूं।
वलेरा कोलुपाएव

यह मुझे लगता है कि .NET में एक गुणा गुणन एल्गोरिथ्म है क्योंकि इसे ILSpy से खोजा जा सकता है: .NET BigInteger गुणन
इवान कोचूरिन

1

सीमा आपके स्मृति आकार (और आपके पास समय) है। तो, आपके पास वास्तव में बड़ी संख्या हो सकती है। जैसा कि केविन ने कहा है, क्रिप्टोग्राफी में किसी को कुछ हजार (बाइनरी) अंकों के साथ संख्याओं को गुणा या घातांक करना होता है, और यह बिना किसी समस्या के संभव है।

बेशक, अक्सर एल्गोरिदम धीमा हो जाता है क्योंकि संख्या बड़ी हो जाती है, लेकिन इतना धीमा नहीं।

जब आप मेगा-डिजिट रेंज में संख्याओं का उपयोग कर रहे हैं, तो आप अन्य समाधानों के बारे में सोचना चाह सकते हैं, हालांकि - जैसा कि वास्तव में उनके साथ गणना करना धीमा हो जाता है, भी।


0

वैज्ञानिक समुदाय के भीतर कुछ उपयोग हैं (यानी आकाशगंगा के बीच की दूरी, घास के क्षेत्र में परमाणुओं की संख्या, आदि)।


उह रूठना नहीं है .. लेकिन यह जवाब सवाल से कैसे संबंधित है?
पेसर

2
प्रश्न, जैसा कि लिखा गया है, लगता है कि वह वास्तविक दुनिया के उदाहरण की तलाश कर रहा था कि इस तरह के डेटा प्रकार को बनाने की आवश्यकता क्यों होगी।
डेव वाइज

एक बेहतर प्रतिफल होगा "बिगइन्टेगर वास्तव में 10 ^ 30" जितनी बड़ी संख्या के लिए अनुकूल है?
पचेरियर

इसके लिए मैं बेहतर उपयोग करूँगा doubleया float- आपके पास आवश्यक परिशुद्धता वैसे भी नहीं होगी।
पाओलो एबरमैन

एक बेहतर रीफ़्रेज़ होगा "BigInteger वास्तव में संख्या के लिए अनुकूल है जितना कि 10 ^ 30 जब हमें सटीक की आवश्यकता हो"?
पचेरियर

0

जैसा कि केविन क्लाइन के उत्तर से पता चलता है, BigNumbers को .NET पुस्तकालयों में प्राथमिक रूप से जोड़ा गया था क्योंकि उन्हें कई आधुनिक क्रिप्टोग्राफ़िक एल्गोरिदम (डिजिटल हस्ताक्षर, सार्वजनिक / निजी कुंजी एन्क्रिप्शन, आदि) के लिए बिल्डिंग ब्लॉक के रूप में आवश्यक था। कई आधुनिक क्रिप्टोग्राफिक एल्गोरिदम में पूर्णांक मानों पर कई हजार बिट्स के आकार के साथ गणना शामिल है। चूंकि BigNumber वर्ग एक अच्छी तरह से परिभाषित और उपयोगी वर्ग का वर्णन करता है, इसलिए उन्होंने इसे सार्वजनिक करने का फैसला किया (बजाय इसे क्रिप्टोग्राफिक एपीआई के आंतरिक विवरण के रूप में रखा गया)।


btw सिर्फ उत्सुक है कि आपका स्रोत कहाँ है कि BigNumbers को मुख्य रूप से .NET पुस्तकालयों में जोड़ा गया था क्योंकि उन्हें कई आधुनिक क्रिप्टोग्राफ़िक एल्गोरिदम के लिए बिल्डिंग ब्लॉक के रूप में आवश्यक था (और इसलिए कई हजार बिट्स तक मूल्यों का समर्थन करने में सक्षम होना चाहिए)?
पचेरियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.