2009-05-21 17 views

उत्तर

3
/** 
* A class used to represent multiprecision integers that makes efficient 
* use of allocated space by allowing a number to occupy only part of 
* an array so that the arrays do not have to be reallocated as often. 
* When performing an operation with many iterations the array used to 
* hold a number is only reallocated when necessary and does not have to 
* be the same size as the number it represents. A mutable number allows 
* calculations to occur on the same number without having to create 
* a new number for every step of the calculation as occurs with 
* BigIntegers. 
* 
* @see BigInteger 
* @version 1.12, 12/19/03 
* @author Michael McCloskey 
* @since 1.3 
*/ 

Source

मुझे लगता है कि MutableBigInteger का उपयोग बिगइंटर भारी गणनाओं के लिए आंतरिक रूप से किया जाता है जो लगातार पुनर्वितरण से धीमा हो जाता है। मुझे यकीन नहीं है कि इसे जावा.माथ के हिस्से के रूप में क्यों निर्यात नहीं किया गया है। शायद परिवर्तनीय मूल्य वर्गों के लिए कुछ distaste?

स्पष्ट करने के लिए "अस्थायी":
स्टैंडर्ड BigInteger अपने पूरे जीवन भर के लिए एक मूल्य, दो BigInteger संदर्भ "एक" & "बी" दिया है, "ए + बी" हमेशा एक ही मूल्य के साथ एक नया BigInteger निकलेगा। आइए मान लें कि मान 4 है।

MutableBigInteger के साथ, "ए + बी" शुरुआती रूप से 4 उत्पन्न कर सकता है, फिर भी भविष्य में किसी बिंदु पर 8, 16, 32, या किसी अन्य नंबर को उपज कर सकता है क्योंकि अन्य कोड मूल्यों को बदलते हैं (उर्फ। उत्परिवर्तन) "ए" & "बी" द्वारा संदर्भित वस्तुओं का। तदनुसार, जावा में मूल्य प्रकार (कैरेक्टर, शॉर्ट, लॉन्ग, इंटेगर, बिगइंटर, बिगडिसीमल, फ्लोट, डबल, स्ट्रिंग) के अधिकांश (शायद सभी) अपरिवर्तनीय हैं।

+0

उत्तर देने के लिए धन्यवाद। शायद सवाल होना चाहिए: "यह कोई सार्वजनिक वर्ग क्यों नहीं है?"। मुझे लगता है कि इस तरह की कक्षा बहुत उपयोगी हो सकती है, खासकर लूप चर के लिए। –

+0

मैंने अपना जवाब थोड़ी देर के अनुसार बढ़ाया है। असल में, यह शायद उत्परिवर्तनीय नहीं है क्योंकि अन्य मूल्य प्रकार भी उत्परिवर्तनीय नहीं हैं। यह वास्तव में एक सम्मेलन है। –

4

बिगइंटर के साथ समस्या यह है कि यह अपरिवर्तनीय है: दूसरे शब्दों में, एक बार जब आप बिगइंटर ऑब्जेक्ट रखते हैं, तो आप ऑब्जेक्ट के मान को स्वयं नहीं बदल सकते हैं, आप इसे केवल एक नई ऑब्जेक्ट से बदल सकते हैं।

अब यह सामान्य रूप से एक ठीक बात है, क्योंकि यह अलियासिंग से बचाता है और इतने पर (यदि आप अपने "2 + 3" कहीं अचानक "2 + 5" में बदलने के लिए नहीं करना चाहती, क्योंकि वह "3" के एक उपयोगकर्ता कहीं अन्यथा आपके कार्यक्रम में इसे "5" में बदल दिया गया है)। हालांकि, आंतरिक रूप से BigInteger इस मान के घटकों को पकड़ने के लिए एक सरणी का उपयोग करता है। बड़ी संख्या के लिए, यह सरणी काफी बड़ी हो सकती है; एक बिगइन्टर का प्रतिनिधित्व करने वाले बिगइंटर को ओह, हजारों तत्वों की एक सरणी की आवश्यकता हो सकती है।

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

यह स्पष्ट रूप से बहुत अक्षम है यदि आप पुराने मूल्यों से छुटकारा पा रहे हैं। इसलिए यदि आपके पास इस तरह के संचालन हैं, तो आप इसके बजाय एक MutableBigInteger का उपयोग कर सकते हैं, जिसे मौजूदा MutableBigInteger की आंतरिक सरणी में केवल अंतिम तत्व को बदलकर बढ़ाया जा सकता है। यह बहुत तेज़ है! हालांकि, यह पुराने मूल्य को नष्ट कर देता है, जो समस्याग्रस्त हो सकता है, जैसा कि मैंने उपरोक्त बताया है। अगर कोई आपको int "3" देता है, तो आप उम्मीद कर सकते हैं कि वह वही रहे। अगर कोई आपको एक MutableBigInteger देता है, तो उम्मीद है कि यह बाद में उसी नंबर पर न हो!

+0

उत्तर देने के लिए धन्यवाद। आपने जिस तरह से कक्षा बहुत अच्छी तरह से काम किया है, उसका वर्णन किया है। लेकिन आप एक बात याद करते हैं: कक्षा सार्वजनिक नहीं है (डिफ़ॉल्ट संशोधक के बिना या बिना घोषित)। तो यह पैकेज java.math के बाहर से उपलब्ध नहीं है। –

+0

@ c0d3x और कर्ट, निश्चित रूप से किसी अन्य अपरिवर्तनीय वर्ग में एक अपरिवर्तनीय कन्स्ट्रक्टर ध्वज बनाने के साथ कुछ भी गलत नहीं है, या इसके विपरीत। यह निश्चित रूप से आपके "3" की रक्षा करेगा। मैं स्पष्ट रूप से थोड़ा नाराज हूं कि कोई उत्परिवर्तनीय LongLong नहीं है और BigInteger संस्करणों के लिए समान है। मुझे लगता है कि यह अपरिवर्तनीय व्यवसाय पेडेंट्री का एक गड़बड़ है और इसका उपयोग करते समय और इसे पढ़ने के कोड दोनों को कम से कम आश्चर्य के कानून का उल्लंघन करता है। गंभीरता से, क्या आप में से किसी ने इसका एक पृष्ठ देखा है? यह सिर्फ सकल है। –

+0

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

1

MutableBigInteger जावा.माथ लाइब्रेरी में संदर्भित है। यदि आपके पास जेडीके स्थापित है तो अपनी जेडीके निर्देशिका में src.zip की सामग्री देखें।

आप BigInteger देखेंगे इसे इस्तेमाल करता है:

public BigInteger divide(BigInteger val) { 
    MutableBigInteger q = new MutableBigInteger(), 
         r = new MutableBigInteger(), 
         a = new MutableBigInteger(this.mag), 
         b = new MutableBigInteger(val.mag); 

    a.divide(b, q, r); 
    return new BigInteger(q, this.signum * val.signum); 
} 

MutableBigInteger गणितीय एल्गोरिदम BigInteger द्वारा प्रयोग किया जाता का एक कैप्सूलीकरण है।

संबंधित मुद्दे