这是来自维基百科的:
在数学中,韦林素数猜想是数论中的一个猜想,与Vinogradov定理密切相关。这个猜想是以英国数学家爱德华·瓦林的名字命名的,它指出,每一个奇数超过3,要么是素数,要么是三个素数之和。这个猜想是从广义Riemann假设出发的。
我的代码:
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)必须创建的才能工作)我知道这需要时间。欢迎任何和所有的反馈。
发布于 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函数中,您可以这样做:
for e in number_list:
if is_prime(e):
#etc.这不仅能让你更清楚你在做什么。您还可以这样做,以便当您想要加速检查一个数字是否是素数时,您不必担心这个逻辑会对其他任何事情产生什么影响。在一个地方没问题。
说起..。
避免暴力。如果你发现自己在重复每一种可能性,那通常都值得看看是否有一种聪明的方法来加快速度。检查一个数字是否是素数已经进行了大量的研究,所以我只想去维基百科或StackOverflow,并使用一种我不够聪明的算法来想出自己的想法。为了检查一个数字是否是三个素数之和,让我们考虑一下。
现在,比如说,你的13张支票看起来是这样的:
2 + 2 + 2 = 6
2 + 2 + 3 = 7
2 + 2 + 5 = 9
2 + 2 + 7 = 11
2 + 2 + 11 = 15
etc.让我们手动完成它,并应用一些思考。
for i in list_of_primes:
for j in list_of_primes:此时,有一个唯一的数字x,例如i + j + x = e。所以让我们检查一下,然后继续
if is_prime(e - (i + j)):更多关于prime_numbers**:**我真的不喜欢它返回每个素数的4个值。这并不是一件显而易见的事情,而且我更希望调用代码操作返回值,因此看起来它需要这样做。在任何情况下,您已经有一个函数的用途,您不想重复每一个素数。此外,这是一个相当昂贵的功能,您可以两次调用它。相反,你可以这样做:
prime_number_list = prime_number(maximum)
combination_of_prime_number = combinations(prime_number_list, 3)风格评论:请在操作符周围留出空格。if e % divisor == 0比if e%divisor==0要容易得多。
而不是
if boolean:
return False
else:
return True你可以这样做:
return not boolean实际上,我相信这是div_by_two中的一个bug。它应该是
def div_by_two(n):
if n % 2 == 0:
return True
else:
return False这将简化为
def div_by_two(n):
return n % 2 == 0https://codereview.stackexchange.com/questions/153845
复制相似问题