Goldbach猜想算法每次返回一个不正确的元组

时间:2015-08-06 04:07:13

标签: python math python-3.4

我创建了一个函数来查找将加起来给定数字的所有素数组合。它的工作非常精彩,除了第二个元组,我总是关闭。代码构造的方式总是返回给定元组的两个变体,例如(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)]

2 个答案:

答案 0 :(得分:1)

直接在第一个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

答案 1 :(得分:1)

您还可以在第二个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)]