2017-03-15 96 views
5

Szukałem algorytmu do generowania liczb pierwszych. Znalazłem następujący wykonał Robert William Hanks. Jest bardzo wydajny i lepszy niż inne algorytmy, ale nie mogę zrozumieć matematyki za nim.Wyjaśnienie generatora liczb pierwszych?

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]] 

Jaka jest relacja między tablicy True s wartościami oraz ostatecznej liczby pierwsze tablicy?

+2

Wygląda na to, że używa się Sito Eratostenesa. – ForceBru

+0

Ten kod z [tej odpowiedzi] (http://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n-in-python/3035188#3035188) jest w zasadzie nieco zoptymalizowany Sito Eratostenesa. Zauważ, że jest to kod Pythona 2, potrzebuje kilku poprawek do użycia w Pythonie 3. FWIW, Mam wersję RWH Pythona 3 w [ta odpowiedź] (http://stackoverflow.com/a/38743446/4014959) . –

+3

Przejdź przez to za pomocą 'n = 6', zanotuj (na papierze) wartość' lis' i 'i' podczas przechodzenia przez pętlę. –

Odpowiedz

3

Począwszy nTrue wartości z i numerowane od do sqrt(n) w etapie jeśli i pozycja p nadal True, znak wszystkie wpisy z i^2 do końca tablicy kroku z 2*i jako False (będą to wielokrotności i).

Wszystkie nieparzyste wpisy True, które pozostały w tablicy na końcu, są liczbami pierwszych.