【问题标题】:Checking Goldbach's conjecture holds up to N验证哥德巴赫猜想最多支持 N
【发布时间】:2023-03-27 08:26:01
【问题描述】:

我被要求编写一段代码来检查哥德巴赫猜想是否适用于直到 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))

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

【问题讨论】:

    标签: python primes goldbach-conjecture


    【解决方案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 找到一个素数 p这样n - p 也在primes 中。这将具有 O(N * P) 的复杂度,但需要更少的空间

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

    【讨论】:

    • 当你使用它时,evens 根本不需要成为一个列表或以这种方式构建它,一个简单的list(range(...)) 是排序器(或只是在 py2 中的范围),是如果您在 python 3 中(py2 中的 xrange),范围对象就足够了,并且对内存更友好
    • 范围对象不是生成器,我们通常这样使用,但不是……您可以随意迭代同一范围,它实现了序列 ABC,所以您可以进行成员资格测试并通过索引、大小等获取其元素...
    • @Copperfield 你说得对,我忘了。所以,是的,您也可以直接使用range,无需列表理解,甚至无需将其转换为列表。
    • @tobias_k,对不起,因为这是一个旧答案,但是如果结果是偶数,是否有一种优雅的方法可以只将 p+q 添加到“sums”集中?我在想这可能是一种节省内存空间的方法?
    • @TophNoms 除了 2 之外的所有素数都是奇数,所以 p + q总是是偶数,除非 pq(但不是两者)是 2 ,因此您可以从primes 中弹出2,然后手动将4 添加到sums 设置中。
    【解决方案2】:

    应该这样做:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多