我正在尝试编写一个函数,当给定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 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
答案 0 :(得分:2)
如果必须使用sieve方法,则首先:
将筛子更改为使用n
而不是n + 1
:
primes = list (range(2, n))
接下来,将您的lemoine
函数更改为:
if result == N:
return x, y
您在break
的{{1}}位置而不是当前位置。现在的方式是,在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]))
此示例来自the Wikipedia page。