2010-05-15 24 views
8

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

मेरा बिगइंटर एक्सपोनेंट int के रूप में प्रतिनिधित्व करने के लिए बहुत बड़ा है, क्या कोई इस सीमा के आसपास काम करने का तरीका सुझा सकता है?

उत्तर

14

आपको एक बहुत बड़ी संख्या के साथ एक बहुत बड़ी संख्या की शक्ति की गणना करने की कोशिश नहीं करनी चाहिए। परिणामस्वरूप संख्या बड़ी मात्रा में स्मृति का उपयोग करेगी। यदि आप a.pow(b) की गणना करते हैं तो इसमें लगभग log(a)*b अंक होंगे। यदि b एक पूर्णांक में फ़िट होने के लिए बहुत बड़ा है तो a के बहुत छोटे मानों के परिणामस्वरूप कई अरब अंक होंगे।

इस ऑपरेशन के बिना आप जो हासिल करने की कोशिश कर रहे हैं उसे पुनः प्राप्त करने का प्रयास करें और इसे कैसे प्राप्त करें।

+4

यह कोई जवाब नहीं है। यह एक प्रस्ताव है कि उस बात को न करने और उस प्रस्ताव के लिए औचित्य न करने का प्रस्ताव है। –

6

व्यावहारिक समाधान एक्सपोनेंट को बिगइंटर से एक int में परिवर्तित करना है।

यदि आप ऐसा नहीं कर सकते हैं क्योंकि एक्सपोनेंट बहुत बड़ा है, तो आपका एल्गोरिदम लागू नहीं है। परिणामी संख्या लगभग बिगइंटर के रूप में प्रतिनिधित्व करने के लिए निश्चित रूप से बहुत बड़ी होगी। (ए बिगइन्टर संख्या का प्रतिनिधित्व करने के लिए बाइट्स की एक सरणी का उपयोग करता है, और जावा सरणी का अधिकतम आकार 2**31 - 1 तत्वों से कोई फर्क नहीं पड़ता कि ढेर कितना बड़ा है।) और यहां तक ​​कि यदि आपने "BiggerInteger" वर्ग लागू किया है जो संख्या का प्रतिनिधित्व करेगा, तो आप जल्द ही आपकी मशीन के भौतिक स्मृति आकार की सीमा को दबाएगा। (और गणना करने के लिए लिया गया समय N.pow(M) होगा ... एनपी-मुश्किल ... O((MlogN)^M) मुझे लगता है)।

बेशक

, अगर आप संख्या की शक्ति ले जा रहे हैं 0, 1 या -1 है, तो परिणाम आसानी से एक BigInteger में फिट होगा। लेकिन उन मामलों में, शक्ति की गणना करने के बेहतर तरीके हैं :-)।

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