首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >韦林素数猜想

韦林素数猜想
EN

Code Review用户
提问于 2017-01-28 17:11:48
回答 1查看 280关注 0票数 4

这是来自维基百科的:

在数学中,韦林素数猜想是数论中的一个猜想,与Vinogradov定理密切相关。这个猜想是以英国数学家爱德华·瓦林的名字命名的,它指出,每一个奇数超过3,要么是素数,要么是三个素数之和。这个猜想是从广义Riemann假设出发的。

我的代码:

代码语言:javascript
复制
 def combinations(iterable, r):
    # combinations('ABCD', 2) --> AB AC AD BC BD CD
    # combinations(range(4), 3) --> 012 013 023 123
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = list(range(r))
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)

def prime_number(maximum):
  number_list=(i for i in range(1,maximum+1))
  divisor=1
  divisor_list=[]
  prime_number_list=[]
  for e in number_list:
    while divisor<=e:
      if e%divisor==0:
        divisor_list.append(divisor_list)
        divisor+=1
      else:
        divisor+=1
    if len(divisor_list)==2:
      prime_number_list.append(e)
      prime_number_list.append(e)
      prime_number_list.append(e)
      prime_number_list.append(e)
      divisor=1
      divisor_list=[]
    else:
      divisor=1
      divisor_list=[]
  return prime_number_list


def div_by_two(num):
  if num%2==0:
    return False
  else:
    return True

def Waring_Number(maximum):
  input_list=range(5,maximum+1)
  combination_of_prime_number=combinations(prime_number(maximum),3)
  prime_number_list=prime_number(maximum)
  odd_number=[i for i in input_list if div_by_two(i)]
  for e in odd_number:
    if e in prime_number_list:
      print ("{} is a prime number.".format(e))
    else:
        for combination in combination_of_prime_number:
          if sum(combination)==e:
            print ("{}+{}+{}={}".format(combination[0],combination[1],combination[2],e))
            break

注意事项少:

  • 我只是从itertools文档中复制和粘贴了组合函数,我不知道这个函数实际上是如何工作的,只知道它是如何工作的。
  • prime_number_list.append(e)被重复了四次,因为组合必须包括素数,重复三次。(例如,(3,3,3)必须创建的才能工作)我知道这需要时间。
  • 我是个初学者。我做Python只做了几个月的业余爱好,只知道基本知识。

欢迎任何和所有的反馈。

EN

回答 1

Code Review用户

回答已采纳

发布于 2017-01-28 18:13:15

点名。大部分都很好。你在努力用它来描述,这太棒了。我会将odd_number改为odd_numbers,因为它是一个列表。而且,prime_number真的没有告诉我这个函数实际上在做什么。不打算提出一个替代的名称,因为我将有更多的关于这个函数稍后。Warring_Number违反了PEP8.P (warring_number )。

更多的是描述功能。这可以让你更容易地理解当你阅读的时候发生了什么。例如,在warring_number的开头,您可以执行odd_numbers = get_odd_numbers_in_interval(5, maximum)。不过,更重要的是,在您的prime_number函数中,您可以这样做:

代码语言:javascript
复制
for e in number_list:
    if is_prime(e):
        #etc.

这不仅能让你更清楚你在做什么。您还可以这样做,以便当您想要加速检查一个数字是否是素数时,您不必担心这个逻辑会对其他任何事情产生什么影响。在一个地方没问题。

说起..。

避免暴力。如果你发现自己在重复每一种可能性,那通常都值得看看是否有一种聪明的方法来加快速度。检查一个数字是否是素数已经进行了大量的研究,所以我只想去维基百科或StackOverflow,并使用一种我不够聪明的算法来想出自己的想法。为了检查一个数字是否是三个素数之和,让我们考虑一下。

现在,比如说,你的13张支票看起来是这样的:

代码语言:javascript
复制
2 + 2 + 2 = 6
2 + 2 + 3 = 7
2 + 2 + 5 = 9
2 + 2 + 7 = 11
2 + 2 + 11 = 15
etc.

让我们手动完成它,并应用一些思考。

代码语言:javascript
复制
for i in list_of_primes:
    for j in list_of_primes:

此时,有一个唯一的数字x,例如i + j + x = e。所以让我们检查一下,然后继续

代码语言:javascript
复制
        if is_prime(e - (i + j)):

更多关于prime_numbers**:**我真的不喜欢它返回每个素数的4个值。这并不是一件显而易见的事情,而且我更希望调用代码操作返回值,因此看起来它需要这样做。在任何情况下,您已经有一个函数的用途,您不想重复每一个素数。此外,这是一个相当昂贵的功能,您可以两次调用它。相反,你可以这样做:

代码语言:javascript
复制
prime_number_list = prime_number(maximum)
combination_of_prime_number = combinations(prime_number_list, 3)

风格评论:请在操作符周围留出空格。if e % divisor == 0if e%divisor==0要容易得多。

而不是

代码语言:javascript
复制
if boolean:
    return False
else:
    return True

你可以这样做:

代码语言:javascript
复制
return not boolean

实际上,我相信这是div_by_two中的一个bug。它应该是

代码语言:javascript
复制
def div_by_two(n):
    if n % 2 == 0:
        return True
    else:
        return False

这将简化为

代码语言:javascript
复制
def div_by_two(n):
    return n % 2 == 0
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/153845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档