2017-03-15 57 views
5

मैं प्राइम नंबर जेनरेट करने के लिए एल्गोरिदम खोज रहा था। मुझे रॉबर्ट विलियम हैंक्स द्वारा निम्नलिखित किया गया। यह अन्य एल्गोरिदम की तुलना में बहुत ही कुशल और बेहतर है लेकिन मैं इसके पीछे गणित को समझ नहीं पा रहा हूं।प्राइम नंबर जनरेटर स्पष्टीकरण?

def primes(n): 
    """ Returns a list of primes < n """ 
    lis = [True] * n 
    for i in range(3,int(n**0.5)+1,2): 
     if lis[i]: 
      lis[i*i::2*i]=[False]*int((n-i*i-1)/(2*i)+1) 
    return [2] + [i for i in range(3,n,2) if lis[i]] 

True रों मूल्यों की सरणी और अंतिम रूढ़ अंक सरणी के बीच संबंध क्या है?

+2

ऐसा लगता है कि यह एराटोस्टेनेस की चलनी का उपयोग कर रहा है। – ForceBru

+0

[इस उत्तर] से यह कोड (http://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n-in-python/3035188#3035188) मूल रूप से थोड़ा अनुकूलित है Eratosthenes की चाकू। ध्यान दें कि यह पायथन 2 कोड है, इसे पायथन 3 पर उपयोग के लिए कुछ बदलावों की आवश्यकता है। FWIW, मेरे पास [इस उत्तर] में RWH के कोड का एक पायथन 3 संस्करण है (http://stackoverflow.com/a/38743446/4014959) । –

+3

'n = 6' के साथ इसके माध्यम से चलें,' lis' 'के मान को लिखें (' पेपर पर) और 'i' जैसा कि आप लूप के माध्यम से जाते हैं। –

उत्तर

3

,, i^2 से सभी प्रविष्टियों कदम से सरणी के अंत तक nTrue मूल्यों के साथ शुरू i के कदम से sqrt(n) करने से प्रगणित साथ अगर मैं वीं प्रविष्टि अभी भी True है, मार्क 2*iFalse के रूप में (ये i के गुणक होंगे)।

सभी अजीब True अंत में सरणी में छोड़े गए प्रविष्टियां प्राइम हैं।

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