python中的弱Goldbach猜想
我试着为弱哥德巴赫猜想写一个代码,它指出每一个大于5的奇数都可以表示为三个素数的和。但是,代码只返回(0,0,0)。我只需要一个有效的三元组,而不是一个三元组列表。知道我哪里出错了吗?我也知道代码不是最有效的,尤其是使用eratosthenes函数来生成素数,但这是我被要求编写的形式python中的弱Goldbach猜想,python,goldbach-conjecture,Python,Goldbach Conjecture,我试着为弱哥德巴赫猜想写一个代码,它指出每一个大于5的奇数都可以表示为三个素数的和。但是,代码只返回(0,0,0)。我只需要一个有效的三元组,而不是一个三元组列表。知道我哪里出错了吗?我也知道代码不是最有效的,尤其是使用eratosthenes函数来生成素数,但这是我被要求编写的形式 def eratosthenes(n): primes = list (range(2, n+1)) for i in primes: j=2 while i*j&l
def eratosthenes(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 weak_goldbach(N):
x, y, z = 0, 0, 0
result = 0
if not N % 2:
prime = eratosthenes(N)
while result != N:
for i in range(len(prime)):
x = prime[i]
if result == N:
break
for j in range(i, len(prime)):
y = prime[j]
result = x + y
if result == N:
break
for k in range (j, len(prime)):
z = prime[k]
result = x + y + z
if result == N:break
return x, y, z
def-eratothenes(n):
素数=列表(范围(2,n+1))
对于素数中的i:
j=2
而我,我是
您的代码存在一些问题,但第一个问题以及失败的原因是,对于奇数,并非N%2的计算结果总是为false,它跳过了循环并返回您设置的x、y和z的初始值
它也有逻辑上的问题;当x+y+z==N时,您的代码在最内部的循环中中断,然后在正确设置结果时,外部循环中断,但只有在更改x或y之后!这意味着,即使修复了第一个问题,代码也总是会返回错误的结果
低效
首先,你根本不需要复杂的中断逻辑!当你第一次发现它和N之和时,你可以返回x,y,z
第二,在中间循环中不需要结果= x+y代码,因为它在弱哥德巴赫猜想中没有相关性,而且无论如何都不是真的。
第三,外部while循环是完全无用的。它什么也不做,只是在内部循环由于某种原因没有找到结果时创建一个无限循环
其他问题
最好减少筑巢;因此,确保它是大于5的奇数的条件应该是负数,如果它不成立,则应该返回异常。这样,函数体就不会嵌套在条件中,这使它更具可读性
修正了有效的代码
def弱_戈德巴赫(N):
x、 y,z=0,0,0
结果=0
如果不是N%2或N<7:
raise异常(“输入错误-必须是大于5的奇数。”)
prime=eratosthenes(N)
对于范围内的i(len(prime)):
x=素数[i]
对于范围(i,len(prime))内的j:
y=素数[j]
对于范围(j,len(prime))中的k:
z=素数[k]
如果x+y+z==N:
返回x,y,z
引发异常(“看起来%d是弱哥德巴赫猜想的异常!”%N)
返回
停止执行。您的代码返回满足约束的第一个三元组。我很困惑,应该怎么做?对不起,我是新来的这是只打算返回一个三元组;那个对你很重要的人!有一件事我不太明白,那就是“提升”位,我以前从未用过这个,你能解释一下吗?理论上,是否有可能用for/if语句替换这些语句?当然,“raise”位“throw”异常;基本上是错误。除非您使用try..catch块来处理,否则它们将停止执行任何进一步的代码。这是最佳做法,但您可能更喜欢返回None这样的值,而不是raise语句。@jemima将它们视为美化的print()
语句。每当您捕捉到需要用户注意的内容时,您都可以在屏幕上打印错误和/或警告消息。使用raiseexception()。它不应该跑@杰米玛:我解释错了“结果”当然是总数,因此您无法返回它。
def weak_goldbach(N):
x, y, z = 0, 0, 0
result = 0
if not N % 2 or N < 7:
raise Exception("Bad input - must be odd number greater than 5.")
prime = eratosthenes(N)
for i in range(len(prime)):
x = prime[i]
for j in range(i, len(prime)):
y = prime[j]
for k in range (j, len(prime)):
z = prime[k]
if x+y+z == N:
return x, y, z
raise Exception("Looks like %d is the exception to the weak Goldbach conjecture!" % N)