Как распечатать два элемента массива и последующую сумму этих элементов? (Вопрос простых чисел Гольдбаха)

Я пытаюсь решить эту проблему: гипотеза Гольдбаха

Покажите с помощью программы "goldbach.py", что все четные числа до 1000 действительно могут быть записаны как сумма двух простых чисел. В частности: для каждого четного числа также четко укажите (на экране), что оно может быть записано как сумма двух простых чисел, как в примере ниже

Еще важнее, конечно, если вы найдете число, которое не соответствует подозрению Гольдбаха. Убедитесь, что ваша программа четко отображает такое открытие на экране. Бинго!

python goldbach.py

16 =...

18 = 5 + 13

20 = 3 + 17

22 = 5 + 17

24 =...

Прогресс

До сих пор я создал список, в котором хранятся все простые числа до 1000, а затем я создал список, в котором все комбинации простых чисел, сумма которых является четным числом до 1000. Я знал формат для его печати 3 + 17, но я застрял в попытке сказать, что сумма (пары) = премьер1 "+" премьер2. Например, должно быть 3 + 17 = 20. Кроме того, я не знаю, как получить только один пример пары простых чисел, чья сумма равна четному числу до 1000. Мне нужно как-то разорвать цикл.

Так как функция суммы не работала, я обнаружил, что могу преобразовать ее в "массив numpy", а затем использовать "накопить". Я просто не могу заставить его работать и знаю, что получаю сообщение об ошибке 'DeprecationWarning: elementwise == сравнение не удалось; это вызовет ошибку в будущем.

Может ли кто-нибудь помочь мне с кодом?

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))                        

1 ответ

Решение

Перво-наперво, есть много оптимизаций, которые вы можете сделать, чтобы улучшить логику кода. способ нахождения простых чисел может быть улучшен, вам нужно только проверить числа до квадратного корня n, чтобы убедиться, что n - простое число. Кроме того, фактическая проверка гипотезы Гольдбаха также может быть улучшена.
Однако, просто сосредотачиваясь на текущем коде, вы должны придерживаться списков, если вы хотите добавить значения, и чтобы остановить код, вам нужно использовать своего рода хак, чтобы остановить вложенный цикл с использованием синтаксиса for-else. Кроме того, вы можете использовать f-строки для удобного форматирования строк начиная с версии Python 3.6.

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!!")
Другие вопросы по тегам