सबसे अच्छा (पोर्टेबल) क्रॉस-प्लेटफॉर्म मनमाना-सटीक गणित पुस्तकालय क्या हैं? [बन्द है]


81

मैं C या C ++ में एक अच्छी मनमानी सटीक गणित पुस्तकालय की तलाश में हूं। क्या आप मुझे कुछ सलाह या सुझाव दे सकते हैं?

प्राथमिक आवश्यकताएँ:

  1. यह मनमाने ढंग से बड़े पूर्णांकों को संभालना चाहिए - मेरी प्राथमिक रुचि पूर्णांकों पर है। यदि आपको पता नहीं है कि मनमाने ढंग से बड़े शब्द का क्या अर्थ है, तो 100000 जैसी किसी चीज़ की कल्पना करें! (१००००० का तथ्य)।

  2. लाइब्रेरी इनिशियलाइज़ेशन या ऑब्जेक्ट निर्माण के दौरान सटीक को निर्दिष्ट करने की आवश्यकता नहीं है । सटीक को केवल सिस्टम के उपलब्ध संसाधनों से विवश होना चाहिए ।

  3. इसे मंच की पूरी शक्ति का उपयोग करना चाहिए , और मूल रूप से "छोटी" संख्या को संभालना चाहिए। इसका मतलब है कि 64-बिट प्लेटफ़ॉर्म पर, गणना करना (2 ^ 33 + 2 ^ 32) उपलब्ध 64-बिट सीपीयू निर्देशों का उपयोग करना चाहिए। पुस्तकालय को उसी तरह से इसकी गणना नहीं करनी चाहिए, जैसा कि एक ही मंच पर (2 ^ 66 + 2 ^ 65) के साथ करता है।

  4. यह चाहिए कुशलतापूर्वक अलावा संभाल ( +), घटाव ( -), गुणा ( *), पूर्णांक प्रभाग ( /), शेष ( %), बिजली ( **), वेतन वृद्धि ( ++), घटती ( --), GCD, अंकगणितीय गणना पूर्णांक भाज्य, और अन्य सामान्य। वर्गाकार परिणाम उत्पन्न न करने वाले वर्गमूल और लघुगणक जैसे कार्यों को संभालने की क्षमता एक से अधिक है। प्रतीकात्मक संगणना को संभालने की क्षमता और भी बेहतर है।

यहाँ मैं अब तक क्या पाया है:

  1. Java का BigInteger और BigDecimal वर्ग: मैं अब तक इनका उपयोग कर रहा हूं। मैंने सोर्स कोड पढ़ा है, लेकिन मुझे गणित समझ में नहीं आया है। यह उन सिद्धांतों और एल्गोरिदम पर आधारित हो सकता है जो मैंने कभी नहीं सीखा।

  2. अंतर्निहित पूर्णांक प्रकार या bc , Python , Ruby , Haskell , Lisp , Erlang , OCaml , PHP , कुछ अन्य भाषाओं के मुख्य पुस्तकालयों में : मैंने इनमें से कुछ का उपयोग किया है, लेकिन मुझे पता नहीं है कि वे जिस पुस्तकालय का उपयोग कर रहे हैं, या वे किस तरह के कार्यान्वयन का उपयोग कर रहे हैं।

जो मैंने पहले ही जाना है:

  1. charदशमलव अंकों के लिए और char*दशमलव तार के लिए उपयोग कर रहे हैं, और एक forलूप का उपयोग करके अंकों पर गणना करते हैं ।

  2. का उपयोग करते हुए int(या long int, या long long) एक बुनियादी "इकाई" और एक मनमाना लंबे पूर्णांक के रूप में उस प्रकार की एक सरणी के रूप में, और एक का उपयोग कर तत्वों पर गणना करने for-loop।

  3. BCD (बाइनरी-कोडित दशमलव) के रूप में एक दशमलव अंक (या कुछ अंक) को संग्रहीत करने के लिए पूर्णांक प्रकार का उपयोग करना ।

  4. बूथ का गुणा एल्गोरिथ्म

मैं क्या नहीं जानता:

  1. भोले तरीकों का उपयोग किए बिना दशमलव में ऊपर वर्णित बाइनरी सरणी को प्रिंट करना। एक भोली विधि का एक उदाहरण: (1) बिट्स को निम्नतम से सबसे अधिक जोड़ते हैं: 1, 2, 4, 8, 16, 32,… (2) char*मध्यवर्ती दशमलव परिणामों को संग्रहीत करने के लिए ऊपर वर्णित एक स्ट्रिंग का उपयोग करें )।

मैं क्या सराहना करता हूं:

  1. जीएमपी , एमपीएफआर , डिकंनम्बर (या अन्य पुस्तकालय जो आपकी राय में अच्छे हैं) पर अच्छी तुलना ।

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

  3. सामान्य तौर पर कोई मदद।

कृपया इस प्रश्न का उत्तर न दें यदि आपको लगता है कि उपयोग double(या long double, long long double) इस समस्या को आसानी से हल कर सकता है। यदि आप ऐसा सोचते हैं, तो आप प्रश्न में समस्या को नहीं समझते हैं।


3
जहाँ तक मैं देख सकता हूँ, GMP एक अच्छा पुस्तकालय है। मुझे आश्चर्य है कि पहिए का फिर से आविष्कार करने के लिए पायथन / हास्केल / एर्लांग / आदि के योगदानकर्ताओं की आवश्यकता क्यों है। अगर GMP इतना अच्छा है, तो इस पर भरोसा क्यों न करें? जीपीएल / एलजीपीएल लाइसेंस मुद्दों में से एक हो सकता है, लेकिन इसके बावजूद (और राउंडिंग मोड इश्यू भी), क्या जीएमपी के कोई अन्य नुकसान हैं? बिल्ट-इन पूर्णांक पायथन / हास्केल / एर्लांग / किसी भी क्रिप्टोग्राफी पुस्तकालय जीएमपी से तेज है? यदि ऐसा है, तो मैं लाइसेंस परमिट की अनुमति देता हूं और इसका उपयोग करना चाहूंगा।
सियु चिंग पोंग -आसुका केंजी-

मुझे डगलस डब्ल्यू जोन्स द्वारा cs.uiowa.edu/~jones/bcd/decimal.html पर एक अच्छा लेख मिला । आलेख केवल 8-बिट पूर्णांक अंकगणितीय का उपयोग करके 16-बिट पूर्णांक को दशमलव प्रतिनिधित्व में बदलने की विधि का वर्णन करता है। यह विचार 16-बिट संख्या को 4 निबल्स में तोड़ने का है, प्रत्येक बेस -16 "अंक" का प्रतिनिधित्व करता है। तो, अंक -0 (n0) X1, n1 => x16, n2 => x256, n3 => x4096 का प्रतिनिधित्व करता है। फिर, यह स्पष्ट है कि दशमलव संख्या का अंक -० (d0) n0 * 1 + n1 * 6 + n2 * 6 + n3 * के परिणाम का अंक -0 है। ठीक से ले जाने के द्वारा, d1 से d4 कर सकते हैं गणना भी की जाए।
सियु चिंग पोंग -आसुका केंजी-

हालाँकि, जहाँ तक मैं कल्पना कर सकता हूँ, ऊपर डगलस के विचार को मनमाने ढंग से लंबे द्विआधारी पूर्णांक को संभालने के लिए नहीं बढ़ाया जा सकता है। इसका कारण यह है कि संख्या 1 (16 ^ 0), 16 (16 ^ 1), 256 (16 ^ 2) और 4096 (16 ^ 3) पूर्व-गणना की जाती हैं। तब समस्या यह हो जाती है कि मनमाने ढंग से बड़े n के लिए दशमलव में 16 ^ n का प्रतिनिधित्व कैसे करें।
सियु चिंग पोंग -आसुका केंजी-

जवाबों:


24

GMP लोकप्रिय विकल्प है। स्क्वीक स्मॉलटाक में बहुत अच्छी लाइब्रेरी है, लेकिन यह स्मॉलटॉक में लिखा गया है।

आपने प्रासंगिक पुस्तकों या लेखों के लिए कहा। बग्नामा का मुश्किल हिस्सा लंबा विभाजन है। मैं प्रति ब्रिंच हेन्सन के पेपर को मल्टीपल-लेंथ डिवीजन रीविजिटेड: ए टूर ऑफ द माइनफील्ड की सलाह देता हूं ।


कागज के लिए अपने लिंक के लिए धन्यवाद! हां, मैं मानता हूं कि विभाजन सबसे मुश्किल हिस्सा है। मुझे पता था कि लंबे समय पहले "पेपर-एंड-पेंसिल विधियों" का उपयोग करके हाथ से विभाजन कैसे किया जाता है, और इस प्रकार एक ही विधि को दशमलव स्ट्रिंग char *(प्रत्येक charएक दशमलव अंक का प्रतिनिधित्व करते हुए) या int *बीसीडी स्ट्रिंग में लागू किया जा सकता है ( प्रत्येक int4/8/16 बीसीडी अंकों का प्रतिनिधित्व करता है)। हालांकि, मुझे आश्चर्य है कि यदि वास्तविक-विश्व उत्पादन स्तर के पुस्तकालय "पेपर-एंड-पेंसिल विधि" की नकल करते हैं, क्योंकि यह बहुत धीमा है।
सियु चिंग पोंग -आसुका केंजी-

यह देखने के लिए, आइए कल्पना करें कि यह कैसे चलता है 100,000,000,000,000,000 / 333,333,333,333: पहला कदम इसकी तुलना 100,000,000,000करना है 333,333,333,333। क्योंकि पूर्व उत्तरार्द्ध से कम है, गणना केवल अगले अंक तक जाती है। दूसरा चरण भागफल का पता लगाना है 1,000,000,000,000 / 333,333,333,333, इसमें या तो 333,333,333,333 * 1(और * 2, * 3और * 4) का एक परीक्षण-और-त्रुटि गुणन शामिल है , या एक लूप में क्रमिक घटाव कर रहा है। क्या आप देखते हैं कि यह कितना धीमा है? मेरा मानना ​​है कि अधिक कुशल एल्गोरिदम मौजूद हैं।
सियु चिंग पोंग -आसुका केंजी-

3
@ सूई: ब्रिंच हैनसन से पता चलता है कि आप अधिकांश दो परीक्षणों में परीक्षण और त्रुटि विधि को कैसे कम कर सकते हैं। यह वास्तव में बहुत प्रभावशाली है।
नॉर्मन रैमसे 19

ठीक है, मुझे कागज पर और अधिक विस्तृत रूप दें। धन्यवाद!
सियु चिंग पोंग -आसुका केंजी-

1
मुझे यकीन नहीं है कि आपने अपना समाधान ढूंढ लिया है, और न ही आप अंकों को संग्रहीत करने के लिए किस प्रारूप का उपयोग करते हैं, लेकिन COBOL का COMP-3 nybble प्रारूप से निपटने के लिए बहुत अच्छा है, क्योंकि यह अधिक कॉम्पैक्ट है, प्रत्येक 4 बिट्स 0-9 का भंडारण करते हैं। मूल्य, और, आपको उपयोग करने योग्य अंक प्राप्त करने के लिए ASCII चार मूल्य से हेक्स 30 को घटाना आवश्यक नहीं है।

13

कुल मिलाकर, वह सबसे तेजी से सामान्य उद्देश्य है मनमाना सटीक पुस्तकालय जीएमपी है । यदि आप फ्लोटिंग पॉइंट वैल्यू के साथ काम करना चाहते हैं, तो MPFR लाइब्रेरी देखें। MPFR GMP पर आधारित है।

अन्य भाषाओं में देशी मनमाने ढंग से सटीक समर्थन के बारे में, पायथन लाइसेंस, कोड आकार और कोड पोर्टेबिलिटी कारणों के कारण अपने स्वयं के कार्यान्वयन का उपयोग करता है। GMPY मॉड्यूल अजगर पहुँच जीएमपी पुस्तकालय की सुविधा देता है।


आपकी प्रतिक्रिया के लिए धन्यवाद! आपने "कोड पोर्टेबिलिटी" का उल्लेख किया है। क्या आप बता सकते हैं कि समस्या क्या है? मुझे लगा कि GMP पोर्टेबल है और प्रमुख प्लेटफार्मों पर समर्थित है ...
Siu Ching Pong -Asuka Kenji-

2
"कोड पोर्टेबिलिटी" "प्रमुख प्लेटफार्मों पर समर्थित" के समान नहीं है। पायथन एक सरल कार्यान्वयन का उपयोग करता है जो सी कंपाइलर के व्यवहार के बारे में बहुत कम धारणा बनाता है इसलिए समान कोड लगभग किसी भी सी कंपाइलर पर संकलित कर सकता है। GMP अधिक कोड (C और उच्च-ट्यून किए गए असेंबली) का उपयोग करता है जो GMP को तेज़ बनाते हैं, लेकिन C कंपाइलर और कोडांतरक के व्यवहार के बारे में अधिक धारणाएँ भी बनाते हैं। उदाहरण के लिए, GMP Microsoft Visual Studio संकलक द्वारा अच्छी तरह से समर्थित नहीं है। MPIR (www.mpir.org) नामक एक GMP कांटा है जो Microsoft के संकलक का समर्थन करता है।
casevh 16

समझा। इसका मतलब है कि पायथन कार्यान्वयन ANSI C की तरह अधिक है जबकि GMP कार्यान्वयन __asm ​​ट्रिक्स का उपयोग करता है ... आपके स्पष्टीकरण के लिए धन्यवाद।
सियु चिंग पोंग -आसुका केंजी-

8

TTMath , व्यक्तिगत और व्यावसायिक उपयोग के लिए एक छोटा टेम्पर्ड हेडर-ओनली लाइब्रेरी देखें ।


अरे! यह एक आसानी से उपयोग होने वाली लाइब्रेरी है, और ऐसा लगता है कि यह सीपीयू की शक्ति का उपयोग करता है और यह काम पूरा करने के लिए कुछ सी ++ टेम्पलेट जादू का उपयोग करता है। महान पुस्तकालय! आपके लिए +1!
सियु चिंग पोंग -आसुका केंजी-

हाँ, और इसके पास एक गैर-कैपेलेफ़्ट बीएसडी लाइसेंस है।
plasmacel

उपरोक्त पृष्ठ से: "संकलित समय में मूल्यों को कितना बड़ा किया जा सकता है।" - इसलिए यह आवश्यकताओं के अनुरूप नहीं है।
ऑक्सड्रिक

7

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


धन्यवाद! ^ ___ ^ अच्छी जानकारी!
सियु चिंग पोंग -आसुका केंजी-

4

परी के बारे में क्या ? यह शीर्ष GMP पर बनाया गया है और आपको कभी भी (और कई प्रतीकात्मक संगणना सामग्री की आवश्यकता होगी) संख्या सिद्धांत संचालन के बारे में अन्य सभी उपहार प्रदान करता है।


हाय फोरट्रान (!), यह अच्छा लग रहा है! आपकी जानकारी के लिए धन्यवाद!
सियु चिंग पोंग -आसुका केंजी-

आपका स्वागत है :-) इसके अलावा, परी के साथ आप जीपी का उपयोग करके तेजी से प्रोटोटाइप रोल कर सकते हैं और जब आप खुश होते हैं तो अनुकूलित सी संस्करण लिखते हैं (और मुझे लगता है कि यह जीपी-> सी कंपाइलर के साथ भी मदद करता है)
फोरट्रान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.