2017-03-15 4 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)は、基本的にわずかに最適化されていますエラトステネスのふるい。それはPython 2のコードだということに注意してください。Python 3で使用するには、いくつか調整が必要です。FWIW、私は[この回答](http://stackoverflow.com/a/38743446/4014959)にRWHのコードのPython 3バージョンを持っています。 。 –

+3

'n = 6'でウォークスルーし、ループを通るときに' lis'と 'i'の値を書き留めます。 –

答えて

3

ステップによってアレイの端部にi^2からすべてのエントリをマークし、NTrue値、I番目のエントリがまだTrueある場合iと、のステップによってsqrt(n)にから列挙から開始2*iFalse(これらはiの倍数になります)。

すべての奇数True最後に配列に残っているエントリは、素数です。