I'm working on problem 46 from project euler:
It was proposed by Christian Goldbach that every odd composite number can be written as the sum of a prime and twice a square.
9 = 7 + 2×122×1^2 15 = 7 + 2×222×2^2 21 = 3 + 2×322×3^2 25 = 7 + 2×322×3^2 27 = 19 + 2×222×2^2 33 = 31 + 2×122×1^2
It turns out that the conjecture was false. What is the smallest odd composite that cannot be written as the sum of a prime and twice a square?
My code is so ridiculously inefficient and it takes minutes before an answer pops up. (Boundary numbers are just rough estimates)
numbers = [(2*x**2) for x in list(range(1, 1000))]
normal = list(range(1, 10000000))
#produces primes under n
def primes(n):
sieve = [True] * n
for i in range(3, int(n**0.5) + 1, 2):
if sieve[i]:
sieve[i * i:: 2 * i] = [False] * int((n - i * i - 1)/(2 * i) + 1)
return [2] + [i for i in range(3, n, 2) if sieve[i]]
primes = primes(1000)
final = []
#add the two lists in every way possible
added = [x + y for x in numbers for y in primes]
#if it does not appear in a normal number line send it to final
for x in added:
if x not in normal:
final.append(x)
print(min(final))
I also lack the knowledge to use any mathematical tricks or algorithms. Where can I start learning code efficiency/performance and simple algorithms to use in my code?