Python中的弱哥德巴赫猜想

时间:2018-12-17 13:45:02

标签: python goldbach-conjecture

我试图为弱哥德巴赫猜想编写一个代码,该代码指出,大于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 :(得分:2)

臭虫

您的代码有一些问题,但是第一个问题以及失败的原因是,不是N%2 总是对奇数求值为false,从而跳过循环并返回初始值设置x,y和z的值。

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

效率低下

首先,您根本不需要复杂的中断逻辑!初次发现它的总和为 N 时,只需返回 x,y,z

第二,您不需要在中间循环中使用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)