プロジェクトオイラーで10問題:Project Euler 10 - 最初のPythonコードが2番目のPythonコードよりもはるかに高速に動作するのはなぜですか?
10以下の素数の和である2 + 3 + 5 + 7 = 17
が200万下に全ての素数の和を探します。
私はこのスニペットを見つけました:
sieve = [True] * 2000000 # Sieve is faster for 2M primes
def mark(sieve, x):
for i in xrange(x+x, len(sieve), x):
sieve[i] = False
for x in xrange(2, int(len(sieve) ** 0.5) + 1):
if sieve[x]: mark(sieve, x)
print sum(i for i in xrange(2, len(sieve)) if sieve[i])
は3秒間に実行here を発表しました。
私はこのコードを書いた:私のコード(1秒)がはるかに遅い理由
def isprime(n):
for x in xrange(3, int(n**0.5)+1):
if n % x == 0:
return False
return True
sum=0;
for i in xrange(1,int(2e6),2):
if isprime(i):
sum += i
を私は理解していませんか?
なぜそれがO(n log logn)であるかは、n = log(2e6)またはn = 2e6ですか? – 0x90
私は 'n = 2e6' –
を意味します。試行分割は平方根で停止します。その複雑さは私の頭の上からO(n^2)よりも優れています。5/log n)、しかし、私は大きな最小の素因数を持つコンポジットを数えていないので、少し上手くいくかもしれません(上限O(n^1.5))。 –