python中的弱Goldbach猜想

python中的弱Goldbach猜想,python,goldbach-conjecture,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&l

我试着为弱哥德巴赫猜想写一个代码,它指出每一个大于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
def-eratothenes(n):
素数=列表(范围(2,n+1))
对于素数中的i:
j=2
而我,我是
您的代码存在一些问题,但第一个问题以及失败的原因是,对于奇数,并非N%2的计算结果总是为false,它跳过了循环并返回您设置的x、y和z的初始值

它也有逻辑上的问题;当x+y+z==N时,您的代码在最内部的循环中中断,然后在正确设置结果时,外部循环中断,但只有在更改x或y之后!这意味着,即使修复了第一个问题,代码也总是会返回错误的结果

低效 首先,你根本不需要复杂的中断逻辑!当你第一次发现它和N之和时,你可以返回x,y,z

第二,在中间循环中不需要结果= x+y代码,因为它在弱哥德巴赫猜想中没有相关性,而且无论如何都不是真的。 第三,外部while循环是完全无用的。它什么也不做,只是在内部循环由于某种原因没有找到结果时创建一个无限循环

其他问题 最好减少筑巢;因此,确保它是大于5的奇数的条件应该是负数,如果它不成立,则应该返回异常。这样,函数体就不会嵌套在条件中,这使它更具可读性

修正了有效的代码
def弱_戈德巴赫(N):
x、 y,z=0,0,0
结果=0
如果不是N%2或N<7:
raise异常(“输入错误-必须是大于5的奇数。”)
prime=eratosthenes(N)
对于范围内的i(len(prime)):
x=素数[i]
对于范围(i,len(prime))内的j:
y=素数[j]
对于范围(j,len(prime))中的k:
z=素数[k]
如果x+y+z==N:
返回x,y,z
引发异常(“看起来%d是弱哥德巴赫猜想的异常!”%N)

返回
停止执行。您的代码返回满足约束的第一个三元组。我很困惑,应该怎么做?对不起,我是新来的这是只打算返回一个三元组;那个对你很重要的人!有一件事我不太明白,那就是“提升”位,我以前从未用过这个,你能解释一下吗?理论上,是否有可能用for/if语句替换这些语句?当然,“raise”位“throw”异常;基本上是错误。除非您使用try..catch块来处理,否则它们将停止执行任何进一步的代码。这是最佳做法,但您可能更喜欢返回None这样的值,而不是raise语句。@jemima将它们视为美化的
print()
语句。每当您捕捉到需要用户注意的内容时,您都可以在屏幕上打印错误和/或警告消息。使用
raiseexception()。它不应该跑@杰米玛:我解释错了“结果”当然是总数,因此您无法返回它。
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)