2012-01-16 21 views
17

मैं वर्तमान में 7 अंकों से विभाजित करके अपनी खुद की BigInt कक्षा बना रहा हूं। (यानी आधार 10,000,000 में)कैसे बड़े (बड़े) विभाजन को कार्यान्वित करने के लिए?

मैंने अतिरिक्त, घटाव और गुणा लागू किया, और अब मैं विभाजन और मोड लागू कर रहा हूं। मैंने एक कोड लिखा जो लंबे विभाजन से विभाजन करता है (सबसे महत्वपूर्ण अंकों को विभाजित करके संख्याओं का अनुमान लगाता है), और यह काम करता है।

हालांकि, यह बहुत धीमी है। जब मैं 108 अंकों की संख्या और 67 अंकों की संख्या पर संचालन का परीक्षण करता हूं, तो विभाजन की गणना करने के लिए 1.9 एमएमएस लगता है, अन्य परिचालनों की तुलना में बहुत धीमी है (अतिरिक्त/घटाव की गणना करने के लिए 0.007 ~ 0.008ms, गुणा की गणना करने के लिए 0.1 मिमी)।

तेज गुणा के लिए करात्सुबा और एफएफटी एल्गोरिदम की तरह, विभाजन की गणना के लिए क्या एल्गोरिदम मौजूद है? Wikipedia कुछ डिवीजन एल्गोरिदम प्रदर्शित करता है (जो विभाजक के गुणात्मक उलटा गणना करता है और इसे लाभांश के साथ गुणा करता है), लेकिन मुझे लगता है कि यह मुझे अधिक कार्यान्वयन विभाजन में मदद नहीं करता है। मैंने 'बड़े पूर्णांक विधियों' खंडों को भी पढ़ा है, लेकिन यह मेरी भी मदद नहीं करता है ... :(

+3

अच्छा सवाल है, लेकिन आप stackoverflow के बजाय http://programmers.stackexchange.com पर विचार कर सकते हैं। –

+0

सरल Google खोज इस बारे में लेख के स्वर दिखाती है, मुझे नहीं लगता कि यह आसान काम है, लेकिन मुख्य आइडिया तेजी से गुणा का उपयोग करता है, और सभी एल्गोरिदम इस के आसपास हैं। उदाहरण के लिए आप [बड़े पूर्णांक में तेज़ विभाजन] देख सकते हैं (http://www.treskal.com/kalle/exjobb/original-report.pdf) –

+0

कोई भी मौका आप इसे खोल सकते हैं? वर्तमान में जेएस के लिए एक अच्छी बड़ी पुस्तकालय नहीं है। –

उत्तर

1

मुझे सुझाव है कि आप GMP library के स्रोत कोड पर नज़र डालें और जावास्क्रिप्ट को आवश्यक कार्यक्षमता पोर्ट करें, या यदि वहाँ एक अच्छा एल्गोरिथ्म वहाँ बाहर है कि यह कैसे हुआ की एक विचार प्राप्त

, इस पुस्तकालय सबसे अधिक संभावना यह होगा;। और यह LGPL के अंतर्गत वितरित किया जाता है

+0

आप पूरी लाइब्रेरी – Raynos

+0

@Raynos को स्वचालित रूप से पोर्ट करने के लिए एलएलवीएम -> जावास्क्रिप्ट (ईएमएसस्क्रिप्ट) कंपाइलर का भी उपयोग कर सकते हैं, मैं बिना किसी दर्द के जेएस से कॉल करने योग्य ईएमएसस्क्रिप्ट के आउटपुट पर शर्त नहीं लगाऊंगा, और विशेष रूप से ईएमएसक्रिप्शन संस्करणों में नहीं। – delnan

+0

मैंने कुछ कोड ('divexact.c' और' divegcd.c') पढ़े हैं, और ऐसा लगता है कि बिटवाई ऑपरेशंस शामिल हैं, जिन्हें मैं कार्यान्वित नहीं कर सकता (क्योंकि मैं आधार 10^7 में संख्याओं का प्रतिनिधित्व कर रहा हूं) ... – JiminP

3

बड़े पूर्णांक गणित के लिए मानक संदर्भ। डोनाल्ड Knuth की किताब कला प्रोग्रामिंग की कला, वॉल्यूम 2, धारा 4.3। उनके विभाजन एल्गोरिदम मूल रूप से ग्रेड-स्कूल एल्गोरिदम है, कुछ छोटे सुधारों के साथ।

वैसे, most people जो बड़े-पूर्णांक अंकगणितीय को लागू करता है, उनकी संख्या प्रणाली के रेडिक्स के रूप में दस की शक्ति के बजाय दो की शक्ति का उपयोग करता है।

1

एक यथोचित तेजी से विभाजन एल्गोरिथ्म के लिए, मध्यम लंबाई के लिए http://myweb.lmu.edu/dmsmith/MComp1996.pdf

यह अभी भी हे है (एन^2) लेकिन कुशल को देखो। जब आप शब्द आकार से छोटे होते हैं तो यह विशेष रूप से उपयुक्त होता है। सालों पहले, मैंने इसे पायथन में लागू किया था। कोड को http://home.comcast.net/~casevh/decint_041.tar.gz में दफनाया गया है। कार्यों smithdiv() और rest_norm() के लिए देखो।

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

  • कोई संबंधित समस्या नहीं^_^