Consecutive prime sum
Solved on
Uploaded on
The prime 41, can be written as the sum of six consecutive primes:
41 = 2 + 3 + 5 + 7 + 11 + 13
This is the longest sum of consecutive primes that adds to a prime below one-hundred.
The longest sum of consecutive primes below one-thousand that adds to a prime, contains 21 terms, and is equal to 953.
Which prime, below one-million, can be written as the sum of the most consecutive primes?
Brute-force solution
def brute():
primes = [2]
max_reps = 1
max_prime = 0
for i in range(3, 1000000, 2):
if is_prime(i, primes):
primes.append(i)
sequence = []
for k in range(len(primes)):
sequence.append(primes[k])
can_break = False
while sum(sequence) > i:
sequence.remove(sequence[0])
if len(sequence) < max_reps:
can_break = True
break
if can_break: break
if sum(sequence) == i:
if len(sequence) > max_reps:
max_reps = len(sequence)
max_prime = i
print(max_prime, max_reps)
def is_prime(num, primes):
root = num**(1 / 2) + 1
for prime in primes:
if prime > root: return True
if num % prime == 0: return False
return True
Strategic solution
def strategic():
primes = [2]
max_reps = 1
max_prime = 0
for i in range(3, 1000000, 2):
if is_prime(i, primes):
primes.append(i)
sequence = [primes[j] for j in range(max_reps)]
j = max_reps
while sum(sequence) != i:
while sum(sequence) < i:
sequence.append(primes[j])
j = j + 1
can_break = False
while sum(sequence) > i:
sequence.remove(sequence[0])
if len(sequence) < max_reps:
can_break = True
break
if can_break: break
if sum(sequence) == i:
if len(sequence) > max_reps:
max_reps = len(sequence)
max_prime = i
print(max_prime, max_reps)
Execution
#brute()
strategic()
# 61758th
# 53659th level 2
Output
brute: 997651