为了账号安全,请及时绑定邮箱和手机立即绑定

用 Python 编写 Lemoine 猜想

用 Python 编写 Lemoine 猜想

四季花海 2021-09-11 17:52:42
我正在尝试编写一个函数,当给定 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 primesdef 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 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

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


更改您的筛子以使用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


查看完整回答
反对 回复 2021-09-11
  • 1 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信