哥德巴赫猜想算法每次返回一个不正确的元组

Goldbach Conjecture algorithm returning one incorrect tuple each time

我创建了一个函数来查找可以加起来等于给定数字的所有素数组合。它工作得非常好,除了第二个元组 I return 总是关闭。代码的结构方式总是 return 给定元组的两个变体,例如 (5, 13) 和 (13, 5),但这个不正确的元组始终是单独的。

def goldbach_conj(number):
    prime_tup_list = []
    x, y = 0, 0
    result = 0
    if not number % 2:
        prime_list = list_of_primes(number)
        # while result != number:
        for i in range(len(prime_list)):
            x = prime_list[i]
            if result == number:
                prime_tup_list.append((x, y))
            for j in range(len(prime_list)):
                y = prime_list[j]
                result = x + y
                print("Adding {} and {}.".format(x, y))
                print("Result is {}".format(result))
                if result == number:
                    prime_tup_list.append((x, y))
    return prime_tup_list

如果我输入 56 作为我的号码,我会得到这个输出:

[(3, 53), (5, 53), (13, 43), (19, 37), (37, 19), (43, 13), (53, 3)]

对于 36 我得到:

[(5, 31), (7, 31), (7, 29), (13, 23), (17, 19), (19, 17), (23, 13), (29, 7), (31, 5)]

第一个 for 循环中的这种情况似乎是导致问题的原因 -

if result == number:
    prime_tup_list.append((x, y))

当你找到一个 result 等于第二个 for 循环中的数字时,你将它添加到 prime_tup_list ,但如果那是列表中的最后一个素数,结果没有改变,我们退出第二个 for 循环(仍然是相同的 result),在第一个 for 循环的下一次迭代中,你将进行下一个 x 值,但在你再次计算 result 之前,你检查 result 是否等于 number ,如果是你追加 x (新 x ,不是用来计算 result) 和 y 的那个。

您可以完全删除 if 条件,但不确定它为什么存在。

编辑:

代码-

def goldbach_conj(number):
    prime_tup_list = []
    x, y = 0, 0
    result = 0
    if not number % 2:
        prime_list = list_of_primes(number)
        # while result != number:
        for i in range(len(prime_list)):
            x = prime_list[i] #if below here is removed.
            for j in range(len(prime_list)):
                y = prime_list[j]
                result = x + y
                print("Adding {} and {}.".format(x, y))
                print("Result is {}".format(result))
                if result == number:
                    prime_tup_list.append((x, y))
    return prime_tup_list

您还可以在第二个 for 循环中编辑范围,以避免重复!

def g(number):
    prime_tup_list = []
    x, y = 0, 0
    result = 0
    if not number % 2:
        prime_list = list_of_primes(number)
        for i in range(len(prime_list)):
            x = prime_list[i]
            for j in range(i, len(prime_list)):
                y = prime_list[j]
                result = x + y
                print("Adding {} and {}.".format(x, y))
                print("Result is {}".format(result))
                if result == number:
                    prime_tup_list.append((x, y))
    return prime_tup_list

输出:

分别为56和36

[(3, 53), (13, 43), (19, 37)]

[(5, 31), (7, 29), (13, 23), (17, 19)]