Python 检查哥德巴赫&x27;s猜想成立到N

Python 检查哥德巴赫&x27;s猜想成立到N,python,primes,goldbach-conjecture,Python,Primes,Goldbach Conjecture,我被要求写一段代码,检查哥德巴赫的猜想是否适用于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

我被要求写一段代码,检查哥德巴赫的猜想是否适用于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))
def gb(n):
#使用Eratosthenes筛列出所有小于n的素数(不考虑1是像Goldbach一样的素数):
素数=列表(范围(2,n+1))
对于素数中的i:
j=2
而i*j这应该可以做到:

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)
导入itertools
输入数学
def检查(n,素数):
“”“在给定素数列表的情况下,检查哥德巴赫的猜想是否适用于n”“”
对于itertools.product中的a,b((如果p math.ceil(n**0.5),则p表示素数中的p):返回True
如果不是n%p:返回False
返回真值
def getPrimes(N):

“”“获取所有素数而不是遍历所有偶数,对于每次检查是否有两个素数的组合与该数求和,您可以做相反的操作:收集集合中两个素数的所有和(在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
当然,
素数
可以使用筛子更有效地实现,但这在这里并不重要。给定
素数
,检查数字的复杂性为O(p^2+N),p是小于N的素数

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

>>> primes = set(primes)
>>> all(any(n - p in primes for p in primes) for n in evens)

当您使用它时,根本不需要将
evens
作为一个列表或以这种方式构建它,一个简单的
list(range(…)
是一个排序器(或者py2中的range),如果您使用python 3(py2中的xrange),作为一个range对象就足够了,并且对内存更友好range对象不是生成器,我们通常使用它,但它不是…你可以在同一个范围内任意多次迭代,它实现了序列ABC,因此你可以进行成员资格测试,并通过索引、大小等获取其元素。@Copperfield你是对的,我忘了。因此,是的,你也可以使用
range
di直截了当地说,没有列表理解,甚至没有将其转换为列表。