首页 文章

用Python编写Lemoine的猜想

提问于
浏览
0

我试图编写一个函数,当给定N时,将返回一对符合Lemoine猜想的数字(每个大于5的奇数可以表示为素数和素数的两倍) . 我已经基于以前与Goldbach猜想相关的函数创建了这个代码(这个函数运行正常)并且使用了不同的函数来生成一个最多为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 回答

  • 2

    如果你必须使用筛子方法,那么首先:

    改变你的筛子使用 n 而不是 n + 1

    primes = list (range(2, n))
    

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

    if result == N:                             
        return x, y
    

    而不是当前的方式, break 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]))
    

    这给出了输出:

    47 is 43 + 2 * 2
    47 is 41 + 2 * 3
    47 is 37 + 2 * 5
    47 is 13 + 2 * 17
    

    这个例子来自the Wikipedia page .

相关问题