用Python编码Lemoine的猜想

时间:2018-12-09 16:50:19

标签: python

我正在尝试编写一个函数,当给定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 

1 个答案:

答案 0 :(得分:2)

如果必须使用sieve方法,则首先:

将筛子更改为使用n而不是n + 1

primes = list (range(2, n))

接下来,将您的lemoine函数更改为:

if result == N:                             
    return x, y 

您在break的{​​{1}}位置而不是当前位置。现在的方式是,在result == N再增加一次之后退出函数,导致错误的结果。 (例如下面的x示例中的2而不是3

这是一个可以比较的工作实现:

n = 47

这给出了输出:

def isPrime (n):
  if n < 2:
    return False

  for i in range(2, (int(n ** (1/2)) + 1)):
    if n % i == 0:
      return False
  return True

def lemoine(n):
  pairs = {}

  # n = p + (2 * q)
  for q in range(1, int(n / 2)):
    p = n - 2 * q

    # Are p and q prime?
    if isPrime(p) and isPrime(q):
      pairs[p] = q

  return pairs

n = 47
pairs = lemoine(n)
for key in pairs:
  print('{} is {} + 2 * {}'.format(n, key, pairs[key]))

此示例来自the Wikipedia page