Гипотеза Гольдбаха в Python - PullRequest
       14

Гипотеза Гольдбаха в Python

0 голосов
/ 17 декабря 2018

Я попытался написать код, который возвращает одну пару, которая удовлетворяет гипотезе Гольдбаха для данного N. Предположение утверждает, что каждое четное число, большее 4, может быть выражено как сумма двух простых чисел.Функция возвращает пару, которая слегка отклонена, например, goldbach (34) возвращает (5, 31), а не правильный ответ (3, 31).Аналогично, goldbach (38) возвращает (11, 31).Есть идеи, где я иду не так?Я понимаю, что этот код не очень эффективен, однако именно так меня просили написать код для моего назначения.

def eratosthenes(n):
    primes = list (range(2, n+1))
    for i in primes:
        j=2
        while i*j<= primes[-1]:
            if i*j in primes:
                primes.remove(i*j)
            j=j+1
    return primes

def odd_primes(N):
    oddprimes = eratosthenes(N)
    oddprimes.remove(2)
    return(oddprimes)

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)):
                x = prime[i]
                if result == N: break
                for j in range(len(prime)):
                    y = prime[j]
                    result = x + y
                    if result == N: break 
    return x, y 

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018
def eratosthenes(n):
    primes = list (range(2, n+1))
    for i in primes:
        j=2
        while i*j<= primes[-1]:
            if i*j in primes:
                primes.remove(i*j)
            j=j+1
    return primes

def odd_primes(N):
    oddprimes = eratosthenes(N)
    oddprimes.remove(2)
    return(oddprimes)

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 

- правильная версия.Когда вы нашли пару, вы устанавливаете x для следующего простого числа.

0 голосов
/ 17 декабря 2018

Вы присваиваете x до разрыва цикла, как только ваше условие выполнено.Просто инвертируйте свои break строки в первом цикле for:

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  # this line first
                x = prime[i]   # this line after
                for j in range(len(prime)):
                    y = prime[j]
                    result = x + y
                    if result == N: break 
    return x, y 
...