Слабая гипотеза Гольдбаха в питоне - PullRequest
0 голосов
/ 17 декабря 2018

Я попытался написать код для слабой гипотезы Гольдбаха, в котором говорится, что каждое нечетное число больше 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 Ответ

0 голосов
/ 17 декабря 2018

Ошибки

Есть несколько проблем с вашим кодом, но первая и причина его сбоя заключается в том, что не N% 2 всегда оценивается как ложное для нечетных чисел, пропускаяваш цикл и возвращая начальные значения, которые вы установили x, y и z.

Есть также логические проблемы с ним;ваш код разрывается в самом внутреннем цикле, когда x + y + z == N, тогда внешние циклы прерываются, когда result установлен правильно, но только после изменения x или y!Это означает, что даже если вы исправите первую проблему, ваш код всегда будет возвращать неверный результат.

Неэффективность

Во-первых, вам вообще не нужна сложная логика прерывания!Вы можете просто вернуть x, y, z , когда впервые обнаружите, что сумма равна N .

Во-вторых, вам не нужен результат = x + y codeв среднем цикле, поскольку он не имеет никакого отношения к слабой гипотезе Гольдбаха и никогда не является истинным.

В-третьих, внешний цикл 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)
...