Goldbach猜想在Python中验证最多N

时间:2018-12-17 20:50:35

标签: python

我似乎在python代码中创建了一个无限循环。我的目的是创建一个函数“ check”,该函数使用我之前的“ goldbach”函数来确认每个大于4且直到输入N的偶数都符合Goldbach猜想(我知道这是一个毫无意义的过程,但这是为了我的任务)。我知道我的“哥德巴赫”函数运行良好,并且产生了一对素数,对于“好”输入,它们合计为N,对于“坏”输入,其合计为(0,0)。我希望我的检查函数为大于4的所有偶数输入返回True(因为它们符合猜想),为所有奇数输入返回False。但是,当我在控制台中尝试检查功能时,我的代码将无法运行,因此出现了问题-知道它是什么吗?

def goldbach(N):
    x, y = 0, 0
    result = 0
    if N % 2 == 0:
        prime = odd_primes(N)
        while result != N:
            for i in range(len(prime)):
                if result == N: break
                x = prime[i]
                for j in range(len(prime)):
                    y = prime[j]
                    result = x + y
                    if result == N: break 
    return x, y 

def check(N):
    for n in range(4, N+1):
        if n % 2 ==0:
            g = goldbach(n)
            if g == (0,0):
                return False
            else:
                return True

2 个答案:

答案 0 :(得分:1)

检查范围中的第一项后,您将立即返回。遇到与期望不符的项目时,您需要立即退回False,如果所有匹配项都与期望不符,则最后返回True

如果只想看偶数,请在2函数中使用range()的步幅,而不要测试每个数字是偶数还是奇数。

def check(N):
    for n in range(4, N+1, 2):
        if goldbach(n) == (0, 0):
            return False
    return True

您不需要while中的goldbach()循环。两个for循环测试素数的所有组合。如果他们找不到匹配的对,则没有理由重新启动它们。

您还可以简化和优化循环。内部循环只需要测试从x开始的素数,因为y < x的较早迭代中已经测试过x的素数对。

def goldbach(N):
    if N % 2 == 0:
        prime = odd_primes(N)
        for i, x in enumerate(prime):
            for y in prime[i:]:
                if x + y == N:
                    return x, y 
    return 0, 0

但是,我认为您的代码仍然可以工作,这表明问题实际上是odd_primes()并没有返回所有素数到N

答案 1 :(得分:0)

我刚刚为您的函数odd_primes(N)创建了一个替换项,以返回所有小于或等于N的质数的列表(其中的2似乎没有什么区别)。您的check()函数似乎正在检查4到N之间的所有整数,如果发现没有找到戈德巴赫总和的对象,则返回False。但是,正如其他人指出的那样,一旦找到一对,它也会立即返回True。因此,当您运行check()时,会以数字4开头,发现其Goldbach对为(2,2),然后通过返回True并忽略4之间的任何其他值,立即退出函数。和N。

当我将return True替换为print语句并在整个循环后添加`return True:

def check(N):
    for n in range(4, N+1):
        if n % 2 ==0:
            g = goldbach(n)
            if g == (0,0):
                print("No sum found for %d !" % n)
                return False
            else:
                print("%d is equal to %d + %d" % (n, g[0], g[1]))
    return True

然后运行check(20)例如,我得到:

4 is equal to 2 + 2
6 is equal to 3 + 3
8 is equal to 3 + 5
10 is equal to 3 + 7
12 is equal to 5 + 7
14 is equal to 3 + 11
16 is equal to 3 + 13
18 is equal to 5 + 13
20 is equal to 3 + 17

顺便说一句,如果您只是想知道是否可以将给定的偶数写成两个素数之和,但是您不关心实际的素数对是什么,则可以执行以下操作:

def goldbach(N):
    if N % 2 == 0:
        primes = odd_primes(N)
        # Generate a list of all the i+j sums where j >= i (skipping
        # most duplicates this way), and see if N is among the sums.
        sums = [i + j for i in primes for j in primes[primes.index(i):]]
        return(N in sums)
    else:
        print("N must be even.")
        return(False)