用 Python 编写 Lemoine 猜想

我正在尝试编写一个函数,当给定 N 时,它将返回一对符合 Lemoine 猜想的数字(每个大于 5 的奇数都可以表示为素数和素数的双倍之和)。我根据与哥德巴赫猜想相关的先前函数(此函数工作正常)创建了此代码,并使用了不同的函数来生成最多 N 的素数列表,但是我的新代码没有给我正确的结果,我不明白为什么 - 任何想法?谢谢


def eratosthenes2(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 lemoine(N):

    x, y = 0, 0

    result = 0

    if N % 2:

        prime = eratosthenes2(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 = 2*x + y

                    if result == N: 

                        break 

    return x, y 


四季花海
浏览 139回答 1
1回答

哔哔one

如果必须使用筛法,那么首先:更改您的筛子以使用n而不是n + 1:primes = list (range(2, n))接下来,将您的lemoine功能更改为:if result == N:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; return x, y&nbsp;而不是当前的方式,你break在哪里result == N。按照您现在的方式,您在再x增加一次后退出该函数,从而导致不正确的结果。(例如,2而不是3在下面的n = 47示例中。这是一个可以与之比较的工作实现:def isPrime (n):&nbsp; if n < 2:&nbsp; &nbsp; return False&nbsp; for i in range(2, (int(n ** (1/2)) + 1)):&nbsp; &nbsp; if n % i == 0:&nbsp; &nbsp; &nbsp; return False&nbsp; return Truedef lemoine(n):&nbsp; pairs = {}&nbsp; # n = p + (2 * q)&nbsp; for q in range(1, int(n / 2)):&nbsp; &nbsp; p = n - 2 * q&nbsp; &nbsp; # Are p and q prime?&nbsp; &nbsp; if isPrime(p) and isPrime(q):&nbsp; &nbsp; &nbsp; pairs[p] = q&nbsp; return pairsn = 47pairs = lemoine(n)for key in pairs:&nbsp; print('{} is {} + 2 * {}'.format(n, key, pairs[key]))这给出了输出:47 is 43 + 2 * 247 is 41 + 2 * 347 is 37 + 2 * 547 is 13 + 2 * 17
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python