如何打印数组的两个元素以及这些元素的后续总和? (哥德巴赫素数问题)

How do I print the two elements of an array and the subsequent sum of these elements? (Goldbachs Primes Question)

我正在尝试解决这个问题:哥德巴赫猜想

用程序“goldbach.py”证明1000以内的所有偶数确实可以写成两个质数之和。具体来说:对于每个偶数,还明确(在屏幕上)显示它可以写成两个素数的和,如下例所示

当然更重要的是如果你找到一个不符合哥德巴赫怀疑的数字。确保您的程序在屏幕上清楚地显示这样的发现。宾果!

python goldbach.py

16 = ...

18 = 5 + 13

20 = 3 + 17

22 = 5 + 17

24 = ...

进度

到目前为止,我创建了一个列表,其中存储了直到 1000 的所有素数,然后我创建了一个列表,其中所有和为偶数的素数的组合,直到 1000。我知道格式让它打印 3 + 17,但我一直试图让它说 sum(pairs) = prime1 "+" prime2。例如应该是 3 + 17 = 20。另外,我不知道如何只有一对质数的 1 个示例,其总和在 1000 之前是偶数。我需要以某种方式打破循环。

因为求和函数不起作用,我发现我可以将它转换为“numpy 数组”,然后使用“累加”。我只是无法让它工作,我知道我收到了错误消息 'DeprecationWarning: elementwise == comparison failed; this will raise an error in the future.'

有人可以帮我写代码吗?

from itertools import accumulate, islice
from numpy import array
import numpy as np

primes = []
pairs = []
numpy_pairs = np.asarray(pairs)

for num in range (4, 1000):
    for j in range (2, num):
        if (num % j) == 0:
            break
    else:        
        primes.append(num)

#for x in range(2,1000):
#   if x in primes:
#        print ("Ja, het getal {} komt voor in mijn primes".format(x))


for x in range(2,1000):
    if x % 2 == 0:
        for prime1 in primes:
            for prime2  in primes:
                if prime1 + prime2 == x and [prime1, prime2] not in numpy_pairs and [prime2, prime1] not in numpy_pairs:
                    np.append(numpy_pairs,[prime1,prime2])                           
results = ("{}+{}={}".format(i, j, k) for i, j in zip(numpy_pairs[0::2], 
numpy_pairs[1::2]) for k in accumulate(islice(numpy_pairs,numpy_pairs.stop)))

print('\n'.join(results))                        

首先,您可以做很多优化来使代码逻辑更好。查找素数的方法可以改进,您只需要检查直到平方根 n 的数字即可验证 n 是否为素数。另外,哥德巴赫猜想的实际验证也有待提高。
然而,只关注当前代码,如果你想附加值,你应该坚持使用列表,并且要停止代码,你需要使用一种 hack 来停止使用 for-else 语法的嵌套循环。此外,从 python 3.6 开始,您可以使用 f-strings 很好地格式化字符串。

primes = []
pairs = []

for num in range (2, 1000): #modified. you forgot 2 and 3!
    for j in range (2, num):
        if (num % j) == 0:
            break
    else:        
        primes.append(num)

result = []
for x in range(2,1000):
    if x % 2 == 0:
        for prime1 in primes:
            for prime2  in primes:
                if prime1 + prime2 == x:
                    print(f"{x} = {prime1} + {prime2}")
                    result.append((prime1, prime2))
                    break
            else: #this is a for-else syntax. enter this block if the for loop did not encounter a break
                continue #go to next iteration of the mid-level loop. This prevents the line afterwards from being executed in cases where the inner loop did not "break"
            break #break the mid level loop if you reach this line.
        else:
            print("You have done it! Bingo!!")