patternpythonMinor
Project Euler 10: find the sum of all the primes below two million
Viewed 0 times
millionfindtheprimesallprojecttwoeulerbelowsum
Problem
This is question #10 from Project Euler:
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million.
I just started programming and read that a Sieve of Eratosthenes is the fastest way to find primes however this code is taking forever to run. How can I make this go faster?
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million.
I just started programming and read that a Sieve of Eratosthenes is the fastest way to find primes however this code is taking forever to run. How can I make this go faster?
end = False
all = list(range(2, 2000000))
delnum = 2
while all.index(delnum)+1 <= len(all) and end == False:
for x in all:
if x % delnum == 0 and delnum != x:
all.remove(x)
if all.index(delnum)+1 == len(all):
end = True
if all.index(delnum)+1 <= len(all) and end == False:
delnum = all[all.index(delnum) + 1]
print(sum(all))Solution
Most of the time the line
Moreover, your remove items by value, which means that each time you remove it, a searching by value is performed on the list, making it even slower.
You can avoid this if, instead of removing the non-primes, you
But I would suggest a completely different approach:
Instead of starting with list of all numbers
if you want to check if the number \$n\$ is prime, you don't need to check division for all the numbers. Check only from 2 to \$\sqrt{n}\$.
all.remove(x) is running, and it is executed for all non-prime numbers, which is most of the numbers.Moreover, your remove items by value, which means that each time you remove it, a searching by value is performed on the list, making it even slower.
You can avoid this if, instead of removing the non-primes, you
- set zero in their place and access the list by index
- build a list for collecting the identified primes
But I would suggest a completely different approach:
Instead of starting with list of all numbers
all = list(range(2, 2000000)), and then removing the non-primes, it is better just start with empty list and adding the number if it is prime. Or if you need only the sum, don't save the primes at all; just sum them.if you want to check if the number \$n\$ is prime, you don't need to check division for all the numbers. Check only from 2 to \$\sqrt{n}\$.
Context
StackExchange Code Review Q#132343, answer score: 6
Revisions (0)
No revisions yet.