Слабая гипотеза Гольдбаха в питоне
Я пытался написать код для слабой гипотезы Гольдбаха, в котором говорится, что каждое нечетное число больше 5 может быть выражено как сумма трех простых чисел. Однако код возвращает только (0, 0, 0). Мне нужна только одна тройка, которая работает, а не список троек. Есть идеи, где я иду не так? Также я знаю, что код не самый эффективный, особенно с использованием функции eratosthenes для генерации моих простых чисел, но это та форма, в которой меня просили закодировать.
def eratosthenes(n):
primes = list (range(2, n+1))
for i in primes:
j=2
while i*j<= primes[-1]:
if i*j in primes:
primes.remove(i*j)
j=j+1
return primes
def weak_goldbach(N):
x, y, z = 0, 0, 0
result = 0
if not N % 2:
prime = eratosthenes(N)
while result != N:
for i in range(len(prime)):
x = prime[i]
if result == N:
break
for j in range(i, len(prime)):
y = prime[j]
result = x + y
if result == N:
break
for k in range (j, len(prime)):
z = prime[k]
result = x + y + z
if result == N:break
return x, y, z
1 ответ
ошибки
Есть несколько проблем с вашим кодом, но первая и причина, по которой он терпит неудачу, состоит в том, что не N % 2 всегда оценивается как ложное для нечетных чисел, пропуская ваш цикл и возвращая начальные значения, которые вы установили x,y и z.
Есть также логические проблемы с этим; ваш код разрывается в самом внутреннем цикле, когда x+y+z == N, тогда внешние циклы прерываются, когда результат установлен правильно, но только после изменения x или y! Это означает, что даже если вы исправите первую проблему, ваш код всегда будет возвращать неверный результат.
Неэффективность
Во-первых, вам вообще не нужна сложная логика разрыва! Вы можете просто вернуть x, y, z, когда вы впервые найдете сумму N.
Во-вторых, вам не нужен код result=x+y в среднем цикле, поскольку он не имеет отношения к слабой гипотезе Гольдбаха и в любом случае никогда не верен.
В-третьих, внешний цикл while абсолютно бесполезен. Он вообще ничего не делает, кроме создания бесконечного цикла, если по каким-то причинам внутренние циклы не нашли результат.
Другие вопросы
Лучше всего уменьшить вложенность; таким образом, условие, обеспечивающее, что это нечетное число больше 5, должно быть отрицательным и должно возвращать исключение, если оно не выполняется. Таким образом, тело функции не вкладывается в условное выражение, что делает его более читабельным.
Исправленный код, который работает
def weak_goldbach(N):
x, y, z = 0, 0, 0
result = 0
if not N % 2 or N < 7:
raise Exception("Bad input - must be odd number greater than 5.")
prime = eratosthenes(N)
for i in range(len(prime)):
x = prime[i]
for j in range(i, len(prime)):
y = prime[j]
for k in range (j, len(prime)):
z = prime[k]
if x+y+z == N:
return x, y, z
raise Exception("Looks like %d is the exception to the weak Goldbach conjecture!" % N)