2011-01-20 6 views
13

मैं ऑनलाइन पाया गया एल्गोरिदम का उपयोग करके दो वास्तव में बड़ी प्राइम संख्याएं उत्पन्न करना चाहता हूं और थोड़ा बदल गया हूं।पायथन ओवरफ्लो त्रुटि: इंडेक्स = आकार पूर्णांक में 'लंबा' फिट नहीं हो सकता

मैं लाइन 5 पर इस त्रुटि मिलती है:

Python OverflowError: cannot fit 'long' into an index=sized integer 

मेरे कोड:

import math 
def atkin(end): 
    if end < 2: return [] 
    lng = ((end/2)-1+end%2) 
    **sieve = [True]*(lng+1)** 
    for i in range(int(math.sqrt(end)) >> 1): 
     if not sieve[i]: continue 
     for j in range((i*(i + 3) << 1) + 3, lng, (i << 1) + 3): 
      sieve[j] = False 
    primes = [2] 
    primes.extend([(i << 1) + 3 for i in range(lng) if sieve[i]]) 
    return primes 

मैं अपने त्रुटि को ठीक कर सकते हैं?

यदि आप बड़े प्राइम उत्पन्न करने के लिए एक बेहतर तरीका जानते हैं, तो यह सहायक भी होगा।

+1

क्या आपने इस कोड को छोटी संख्या के लिए आजमाया है? यदि आप बड़ी संख्याओं का उपयोग करना चाहते हैं तो आपको http://gmplib.org/ लाइब्रेरी का प्रयास करना चाहिए। इस पुस्तकालय के लिए एक पायथन रैपर हैं और यह मेरे लिए ठीक काम करता है। – Elalfer

+0

हाँ कोड छोटे नंबरों के लिए ठीक काम करता है। मैंने इसके साथ 1 और 100 के बीच की कीमतों की जांच की और यह सही था। हालांकि लिंक के लिए धन्यवाद, मैं इसे देख लूंगा। – Rell3oT

+0

यहां चर्चा की गई इस एल्गोरिदम का उपयोग करके बड़े प्राइम प्राप्त करने के कई तरीके हैं: http://stackoverflow.com/questions/2897297/speed-up-bitstring-bit-operations-in-python –

उत्तर

11

निम्नलिखित कोड समस्या यह है कि आप चल रहे हैं दर्शाता है। आप के बजाय करते हैं:

x = [True]*(sys.maxint) 

तो आप एक MemoryError मिलना चाहिए।

यहां क्या हो रहा है। पायथन अपने स्वयं के विस्तारित डेटा प्रकार के साथ मनमाने ढंग से बड़े पूर्णांक को संभाल सकता है। हालांकि, जब आप ऊपर की तरह एक सूची बनाने का प्रयास करते हैं, तो पाइथन छोटी सूची को दो बार बदलने की कोशिश करता है, जो एक पायथन पूर्णांक है, जो कि c_ inteize प्रकार के सी पूर्णांक के लिए है। Py_ssize_t को आपके निर्माण के आधार पर अलग-अलग परिभाषित किया गया है लेकिन एक ssize_t, लंबा, या int हो सकता है। अनिवार्य रूप से, पाइथन जांच करता है कि रूपांतरण करने से पहले पाइथन पूर्णांक सी पूर्णांक प्रकार में फिट हो सकता है और यदि यह काम नहीं करेगा तो ओवरफ़्लो एरर उठाता है।

1

लाइन 5 ट्रूज़ True मानों से भरी एक बहुत लंबी सूची आवंटित करने के लिए 5 ट्रूज़। शायद आपकी lng स्मृति में उस सूची को फिट करने के लिए बहुत बड़ी है?

मैं आपकी त्रुटि को बिल्कुल पुन: उत्पन्न करने में सक्षम नहीं था; सबसे बुरे मामले में मैं इसके बजाय केवल MemoryError के साथ समाप्त हुआ।

शायद एल्गोरिदम ठीक है (हालांकि मैं शर्त नहीं लगा सकता), बस एक छोटी संख्या आज़माएं।

import sys 
x = [True]*(sys.maxint+1) 

जो एक OverflowError पैदावार:

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