Alternative solutions to problem 10

This commit is contained in:
Linus Miller 2018-03-28 13:07:45 +02:00
parent d3167ead99
commit 6379f01abc
3 changed files with 91 additions and 0 deletions

50
0010-1.py Normal file
View File

@ -0,0 +1,50 @@
from functools import reduce
# from collections import deque
n = 2000000
# n = 100
array = list(range(3, n))
# array[0] = None
# array[1] = None
primes = []
p = 2
def next():
# num = array.popleft()
# while (num == None and len(array) > 0):
# num = array.popleft()
# return num
global array
for idx, num in enumerate(array):
idx
if (num != None):
array = array[idx + 1:]
print(num)
print(idx)
return num
while (p != None):
print(p)
primes.append(p)
count = 1
i = count * p - 1
length = len(array)
print(length)
for i in range(p - 1, length, p):
array[i] = None
p = next()
print(primes)

39
0010-2.py Normal file
View File

@ -0,0 +1,39 @@
# https://www.geeksforgeeks.org/sieve-sundaram-print-primes-smaller-n/
from functools import reduce
def sieve_of_sundaram(n):
# In general Sieve of Sundaram, produces primes smaller
# than (2*x + 2) for a number given number x.
# Since we want primes smaller than n, we reduce n to half
n_new = int((n-2) / 2);
# This array is used to separate numbers of the form i+j+2ij
# from others where 1 <= i <= j
marked = [ False ] * (n_new + 1)
# Main logic of Sundaram. Mark all numbers of the
# form i + j + 2ij as true where 1 <= i <= j
for i in range(1, n_new + 1):
j = i
while (i + j + 2 * i * j < n_new):
marked[i + j + 2*i*j] = True
j += 1
primes = []
if (n > 2):
primes.append(2)
for i in range(1, n_new):
if (marked[i] == False):
primes.append(2 * i + 1)
return primes
primes = sieve_of_sundaram(2000000)
print(reduce(lambda x, y: x + y, primes))
# answer 142913828922

View File

@ -12,3 +12,5 @@ for i in range(2, 2000000):
result = reduce(lambda x, y: x + y, primes)
print(primes)
print(result)
# answer 142913828922