python 中的弱哥德巴赫猜想

Weak Goldbach Conjecture in python

我曾尝试为弱哥德巴赫猜想编写代码,该猜想指出每个大于 5 的奇数都可以表示为三个素数之和。但是,代码只有returns(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

错误

你的代码有一些问题,但第一个,也是它失败的原因,是 not N % 2 对于奇数总是计算为 false,跳过你的循环并return输入您设置的 x、y 和 z 的初始值。

逻辑上也有问题;当 x+y+z == N 时,您的代码在最内层循环中中断,然后在 result 正确设置时外层循环中断,但仅在更改 x 或 y 之后!这意味着即使您解决了第一个问题,您的代码也总是 return 错误的结果。

效率低下

首先,你根本不需要复杂的break逻辑!当您第一次发现它的总和为 N.

时,您可以 return x, y, z

其次,您不需要中间循环中的 result=x+y 代码,因为它与弱哥德巴赫猜想无关,而且永远不会为真。

第三,外层的while循环完全没用。它什么都不做,除了如果内部循环由于某种原因没有找到结果会创建一个无限循环。

其他问题

最好减少嵌套;因此,确保它是大于 5 的奇数的条件应该是负数,如果不成立,应该 return 是一个例外。这样函数体就不会嵌套在条件语句中,这使得它更具可读性。

修正后的有效代码

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)