c# - हरण - सबसे छोटा पूर्णांक




सी#में बड़े पूर्णांक (8)

वर्तमान में मैं यहां वर्णित जे # पुस्तकालयों से java.math.BigInteger उधार ले रहा हूं। पहले बड़े पूर्णांक के साथ काम करने के लिए लाइब्रेरी का उपयोग कभी नहीं किया, यह धीमा लगता है, 10 गुना धीमी गति के क्रम में, यहां तक ​​कि लम्बाई संख्या के लिए भी। क्या किसी के पास कोई बेहतर (अधिमानतः मुफ्त) पुस्तकालय है, या प्रदर्शन का यह स्तर सामान्य है?


.NET 4.0 के रूप में आप System.Numerics.BigInteger क्लास का उपयोग कर सकते हैं। यहां दस्तावेज़ देखें: http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx

एक और विकल्प IntX वर्ग है।

इंटेल एक मनमानी सटीक पूर्णांक लाइब्रेरी है जो शुद्ध सी # 2.0 में तेजी से ओ (एन * लॉग एन) - गुणा / विभाजन एल्गोरिदम कार्यान्वयन के साथ लिखा गया है। यह पूर्णांक पर सभी बुनियादी संचालन प्रदान करता है जैसे अतिरिक्त, गुणा, तुलना, बिटवाईट स्थानांतरण आदि।


.NET 4.0 में System.Numerics.BigInteger क्लास Microsoft Research से Microsoft.SolverFoundation.Common.BigInteger पर आधारित है।

सोलवर फाउंडेशन की BigInteger श्रेणी बहुत ही BigInteger दिखती है। मुझे यकीन नहीं है कि यह किस लाइसेंस के तहत जारी किया गया है, लेकिन आप इसे here प्राप्त कर सकते here (सॉल्वर फाउंडेशन को डाउनलोड और इंस्टॉल करें और Microsoft.Solver.Foundation.dll को ढूंढें)।


मुझे प्रदर्शन के बारे में निश्चित नहीं है, लेकिन आयरनपीथन में बिगइंटर वर्ग भी है। यह माइक्रोसॉफ्ट में है। स्क्रिप्टिंग। मैथ नेमस्पेस।


मुझे लगता है कि आप कार्यान्वयन को अनुकूलित कर सकते हैं यदि आप बिगइंट्स पर सभी परिचालनों को निष्पादित करते हैं जो मूल प्रकारों पर देशी प्रकार (जैसे इंट 64) से छोटे परिणाम लौटने जा रहे हैं और यदि आप अतिप्रवाह पर जा रहे हैं तो केवल बड़े सरणी से निपटें।

कोडप्रोजेक्ट पर यह कार्यान्वयन संपादित करें , केवल 7 गुना धीमा लगता है ... लेकिन उपर्युक्त अनुकूलन के साथ आप इसे छोटे संख्याओं के लिए देशी प्रकारों के लगभग समान रूप से निष्पादित करने के लिए प्राप्त कर सकते हैं।


यह आपकी मदद नहीं करेगा, लेकिन नेट 3.5 में बिगइंटर वर्ग होना चाहिए था; यह कट गया, लेकिन पीडीसी में किए गए बयान से, यह नेट 4.0 में होगा। उन्होंने स्पष्ट रूप से इसे अनुकूलित करने में काफी समय बिताया है, इसलिए प्रदर्शन अब आप जो प्राप्त कर रहे हैं उससे कहीं बेहतर होना चाहिए।

इसके अलावा, यह सवाल अनिवार्य रूप से एक डुप्लिकेट है कि मैं .NET में एक बहुत बड़े पूर्णांक का प्रतिनिधित्व कैसे कर सकता हूं?


यह एक अजीब सुझाव की तरह लग सकता है, लेकिन क्या आपने decimal प्रकार का परीक्षण किया है यह देखने के लिए कि यह कितनी तेज़ी से काम करता है?

दशमलव सीमा ± 1.0 × 10 ^ -28 से ± 7.9 × 10 ^ 28 है, इसलिए यह अभी भी काफी बड़ी नहीं हो सकती है, लेकिन यह उलझन से बड़ी है।

.NET 3.5 में बिगइंटर वर्ग होना चाहिए था, लेकिन यह कट गया


सी # में BigInteger के कई कार्यान्वयन यहां दिए गए हैं। मैंने मोनो बिगइंटर कार्यान्वयन का उपयोग किया है, बहुत तेजी से काम करता है (मैंने इसे कॉम्पैक्टफ्रेमवर्क में उपयोग किया है)

उछालदार झूला

Mono


हां, यह धीमा हो जाएगा, और 10x अंतर मैं जो अपेक्षा करता हूं उसके बारे में है। BigInt एक मनमानी लंबाई का प्रतिनिधित्व करने के लिए एक सरणी का उपयोग करता है, और सभी परिचालनों को मैन्युअल रूप से किया जाना चाहिए (अधिकांश गणित के विपरीत जो सीपीयू के साथ सीधे किया जा सकता है)

मुझे यह भी नहीं पता कि क्या असेंबली में हाथ-कोडिंग आपको 10x से अधिक प्रदर्शन लाभ प्रदान करेगी, यह बहुत करीब है। मैं इसे अनुकूलित करने के अन्य तरीकों की तलाश करता हूं - कभी-कभी आपके गणित की समस्या के आधार पर आप इसे तेज बनाने के लिए कुछ छोटी सी चीजें कर सकते हैं।





j#