检查Goldbach的猜想可以达到N.

时间:2016-12-07 21:26:44

标签: python primes goldbach-conjecture

我被要求编写一段代码,检查Goldbach的猜想是否适用于N的每个偶数,到目前为止,我有以下内容:

def gb(n):
    #give a list of all primes less than n using the sieve of Eratosthenes (not considering 1 to be prime like Goldbach):
    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

    #give a list of even numbers less than n but starting from 4
    evens=list(range(4,n+1,2))

然后我需要检查evens中的所有数字是否可以作为素数中两个数字的总和。我在这一点上很困惑,我知道我需要使用循环,但我不确定如何检查它们是否符合猜想?

2 个答案:

答案 0 :(得分:1)

不是循环遍历所有偶数,而是每次检查是否存在两个与这个数相加的素数的组合,你可以做反求:收集一组中两个素数的所有和(快速查找) O(1))和每个偶数检查它是否在该集合中。

>>> N = 1000
>>> primes = [p for p in range(N+1) if not any(p % q == 0 for q in range(2, p//2))]
>>> evens = [n for n in range(4, N+1, 2)]
>>> sums = set(p + q for p in primes for q in primes)
>>> all(n in sums for n in evens)
True

当然,使用筛子可以更有效地实施primes,但这并不是真正相关的。给定primes,检查数字将具有O(P ^ 2 + N)的复杂度,P是小于N的素数。

或者,如果您不想计算和存储两个素数的所有P ^ 2组合的总和,您可以将素数转换为集合,并且对于每个偶数n,找到素数{ {1}} p也在n - p。这将具有复杂度O(N * P),但需要更少的空间

primes

答案 1 :(得分:0)

这应该这样做:

import itertools
import math

def check(n, primes):
    """Check if Goldbach's conjecture holds for n, given a list of primes"""

    for a,b in itertools.product((p for p in primes if p<n), repeat=2):
        if a+b == n: return True
    return False


def checkAll(N):
    """Check whether Goldbach's conjecture holds for all even numbers >2, <=N"""

    primes = getPrimes(N)
    for n in range(4, N+1):
        if not check(n, primes): return False
    return True


def checkPrime(n, primes):
    """Check whether n is prime, given a list of prime numbers smaller than it"""
    for p in primes:
        if p > math.ceil(n**0.5): return True
        if not n%p: return False
    return True


def getPrimes(N):
    """Get all prime numbers <=N"""
    answer = [2,3]
    for n in range(5, N+1):
        if check(n): answer.append(n)