2010-07-07 13 views
7

मैं bignums के लिए लंबे विभाजन को लागू करने की कोशिश कर रहा हूं। मैं एम्बेडेड प्रोग्रामिंग की सीमाओं के कारण दुर्भाग्यवश जीएमपी जैसी लाइब्रेरी का उपयोग नहीं कर सकता। इसके अलावा, मैं सीखने का बौद्धिक अभ्यास चाहता हूं कि इसे कैसे कार्यान्वित किया जाए। अब तक मुझे बाइट्स के किसी भी लंबाई के सरणी का उपयोग करके अतिरिक्त और गुणा किया गया है (इसलिए प्रत्येक बाइट बेस -256 अंक की तरह है)।भारी संख्याओं के लिए लंबे विभाजन को कार्यान्वित करने के लिए कैसे करें (bignums)

मैं बस विभाजन/मॉड्यूलस को लागू करने के लिए शुरू करने की कोशिश कर रहा हूं और मैं जानना चाहता हूं कि कहां से शुरू करना है? मुझे नेट पर बहुत अधिक अनुकूलित (उर्फ अपठनीय) कोड मिला है, जो मेरी मदद नहीं करता है, और मुझे बहुत सारे तकनीकी-गणितीय श्वेतपत्र मिले हैं जिनसे मैं सिद्धांत और कार्यान्वयन के बीच के अंतर को पुल नहीं कर सकता ।

अगर कोई लोकप्रिय एल्गोरिदम की सिफारिश कर सकता है, और मुझे स्पष्टीकरण को समझने के लिए एक सरल को इंगित करता है जो इम्प्लेमेनेंटेशन की ओर झुकता है, तो यह शानदार होगा।

-संपादित: लाभांश है जब मैं एल्गोरिदम, जो काम की जरूरत है ~ 4000bits, और भाजक ~ है 2000bits

-संपादित: आधार-256 के साथ क्या यह एल्गोरिथ्म काम करता है? http://courses.cs.vt.edu/~cs1104/BuildingBlocks/divide.030.html

-edit: क्या यह वास्तव में उपयोग करने वाला एल्गोरिदम (न्यूटन डिवीजन) है? http://en.wikipedia.org/wiki/Division_(digital)#Newton.E2.80.93Raphson_division

+0

मुझे मिला यह, लेकिन मुझे यकीन नहीं है कि यह संख्याओं के लिए एक अच्छा एल्गोरिदम होगा> 2048 बिट्स? http://stackoverflow.com/questions/2525172/custom-very-long-int-division-issue – Chris

+1

मुझे यह पेपर भी मिला, क्या यह मेरे लिए शुरू करने के लिए एक अच्छा एल्गोरिदम होगा? http://www.brinch-hansen.net/papers/1994b.pdf – Chris

उत्तर

4

यदि आप सीखना चाहते हैं, तो प्राथमिक विद्यालय में उपयोग की जाने वाली पेंसिल और पेपर विधि से शुरू करें। मान लीजिए या नहीं, यह अनिवार्य रूप से वही ओ (एन^2) एल्गोरिदम है जिसका उपयोग अधिकांश बिग्नम पुस्तकालयों में उन संख्याओं के लिए किया जाता है जो आप देख रहे हैं। मुश्किल पहले चरण को "उद्धरण अनुमान" कहा जाता है, और यह शायद समझने में सबसे कठिन होगा। एक बार जब आप इसे समझ लेंगे, बाकी आराम करना चाहिए।

एक अच्छा संदर्भ Knuth के "सेमिन्यूमेरिकल एल्गोरिदम" है। टेक्स्ट और अभ्यास दोनों में उद्धरण अनुमान लगाने के विभिन्न तरीकों के बारे में उनकी कई चर्चाएं हैं। उस पुस्तक में बिग्नम कार्यान्वयन के लिए समर्पित अध्याय हैं।

+0

+1 Knuth संदर्भ के लिए +1। –

+0

पेंसिल और पेपर विधि केवल काम करने लगती है यदि विभाजक एक या दो अंक लंबा है, जो मुझे नेट – Chris

+0

पर मिल सकता है, क्या यह यहां शिफ्ट/घटाव विधि जैसा ही है? http://courses.cs.vt.edu/~cs1104/BuildingBlocks/divide.030.html – Chris

0

यह प्रश्न 2 साल से अधिक पुराना है, लेकिन इस आकार संख्या के लिए आप ओपनएसएसएल स्रोत कोड देख सकते हैं। यह इस आकार संख्या के साथ आरएसए करता है, इसलिए 1000 से 4000 बिट संख्याओं के लिए अनुकूलित गणित दिनचर्या बहुत सारे हैं।

1

क्या आप अपने कोड में शून्य चार (लंबी डबल [], int, int) का उपयोग कर रहे हैं और फिर घूमते हुए और फिर एक उलटा परिवर्तन कर रहे हैं, मुझे काम करने के लिए गुणा मिला है, लेकिन जब मैंने विभाजन करने की कोशिश की तो यह उसी तरह से एक परिणाम के बाद बाहर निकलें, इसलिए मैं मदद नहीं कर सकता, लेकिन अगर आपके पास "सी ++ में न्यूमेरिक व्यंजनों" नामक टोम है, तो आप अंत में जाएं और आप जो खोज रहे हैं वह आपको मिलेगा, वास्तव में यह पृष्ठ 916 से 926 तक शुरू होता है।