Misinterpreted that questin multiple times, finally just did an exhaustive search
This commit is contained in:
117
50/main.py
Normal file
117
50/main.py
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
'''
|
||||||
|
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?
|
||||||
|
'''
|
||||||
|
|
||||||
|
import math
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
def sieve(n):
|
||||||
|
assert n > 1
|
||||||
|
|
||||||
|
ns = [True] * n
|
||||||
|
|
||||||
|
for i in range(2, math.ceil(np.sqrt(n))):
|
||||||
|
if ns[i]:
|
||||||
|
j = pow(i, 2)
|
||||||
|
|
||||||
|
while j < n:
|
||||||
|
ns[j] = False
|
||||||
|
j = j + i
|
||||||
|
|
||||||
|
return [i for i,val in enumerate(ns) if val][2:]
|
||||||
|
|
||||||
|
# Note: this subset sum implementation only backtracks the sum with the smallest values as possible
|
||||||
|
def subsetSum(elements, target):
|
||||||
|
dyn = []
|
||||||
|
|
||||||
|
for _ in range(len(elements) + 1):
|
||||||
|
dyn.append([True])
|
||||||
|
|
||||||
|
for _ in range(target):
|
||||||
|
dyn[0].append(False)
|
||||||
|
|
||||||
|
for i in range(1, len(elements) + 1):
|
||||||
|
for j in range(1, target + 1):
|
||||||
|
if elements[i-1] > j:
|
||||||
|
dyn[i].append(dyn[i-1][j])
|
||||||
|
else:
|
||||||
|
dyn[i].append(dyn[i-1][j] or dyn[i-1][j - elements[i-1]])
|
||||||
|
|
||||||
|
if not dyn[-1][-1]:
|
||||||
|
return []
|
||||||
|
|
||||||
|
j = target
|
||||||
|
i = len(elements)
|
||||||
|
res = []
|
||||||
|
|
||||||
|
while j > 0:
|
||||||
|
while dyn[i - 1][j]:
|
||||||
|
i -= 1
|
||||||
|
curEl = elements[i - 1]
|
||||||
|
j -= curEl
|
||||||
|
res.append(curEl)
|
||||||
|
|
||||||
|
return res
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print("Hello this is Patrick")
|
||||||
|
|
||||||
|
target = 1000000
|
||||||
|
|
||||||
|
primeList = sieve(target)
|
||||||
|
primeSet = set(primeList)
|
||||||
|
numberofprimes = len(primeList)
|
||||||
|
|
||||||
|
# s = 0
|
||||||
|
# n = 0
|
||||||
|
# while s < target:
|
||||||
|
# s += primeList[n]
|
||||||
|
# n += 1
|
||||||
|
|
||||||
|
# print(numberofprimes)
|
||||||
|
# print(n - 1, s - primeList[n-1])
|
||||||
|
|
||||||
|
# So the number of options is very, very, very very large, we can't brute force this
|
||||||
|
# print(math.factorial(numberofprimes) // (math.factorial(n-1) * math.factorial(numberofprimes - (n-1))))
|
||||||
|
|
||||||
|
# Additionally, this is exactly subset sum for all primes from big to small, since we probably want an as high as possible prime
|
||||||
|
|
||||||
|
# longest = 0
|
||||||
|
# prime = 0
|
||||||
|
# for p in reversed(primeList):
|
||||||
|
# l = subsetSum(primeList, p)
|
||||||
|
# if len(l) > longest:
|
||||||
|
# longest = len(l)
|
||||||
|
# prime = p
|
||||||
|
|
||||||
|
# print(prime)
|
||||||
|
|
||||||
|
# Well it seems I completely misinterpreted the question and did something way more difficult than was intended
|
||||||
|
|
||||||
|
prime = 0
|
||||||
|
longest = 0
|
||||||
|
|
||||||
|
for i in range(len(primeList)):
|
||||||
|
s = 0
|
||||||
|
primes = []
|
||||||
|
for p in primeList[i:]:
|
||||||
|
s += p
|
||||||
|
primes.append(p)
|
||||||
|
|
||||||
|
if s >= target:
|
||||||
|
break
|
||||||
|
if s in primeSet and len(primes) > longest:
|
||||||
|
prime = s
|
||||||
|
longest = len(primes)
|
||||||
|
|
||||||
|
print(prime)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user