二次素数

时间:2016-12-27 22:26:55

标签: python loops primes sequences quadratic

我在问欧拉项目问题27(https://projecteuler.net/problem=27)。我编写了一段代码,要么无法正常工作,要么工作得不够快 - 我是编程新手,并不完全理解我收到的错误的含义。

无论如何,问题是要求我找到哪个整数$ a,b $与$ | a |,| b |< 1000 $导致$ n ^ 2 + an + b $产生最大的连续素数集合以$ n = 0 $开头。首先,我们注意到$ b $本身必须是素数才能使$ n = 0 $项成为素数并启动链。因此,我编写了一段代码,在所有可能的素数值上循环b,然后检查每个整数$ -1000< a< 1000 $并测量连续素数链的长度。我把它包含在下面:

n=int(input("Set a bound for range of a and b: "))


def is_prime(n):
if n==1:
    return False
elif n==2 or n==3:
    return True
elif (n % 2 == 0) or (n % 3 == 0):
    return False
elif all(n % i != 0 for i in range(2, ceil(n**0.5+1))):
    return True
else:
    return False

def seive(n):
primes=[]
for i in range(n):
    if is_prime(i)==True:
        primes.append(i)
for j in primes: #j can't be allowed to be negative since when m=0 (the first term), we must have m**2+k*m+j prime. Therefore j must be chosen from primes
    for k in range(-n,n,1):
        chain=[]
        for m in range(0,n):
            while is_prime(m**2+k*m+j) == True and m**2+k*m+j>0:
                chain.append(m**2 + k*m + j)
                details = [j,k,len(chain)]
return details

print(seive(n))

有人可以解释一下我做错了什么,并给我一个如何让它工作的提示?谢谢!

1 个答案:

答案 0 :(得分:1)

分析问题会产生一些限制因素,例如: b必须是素数或者a必须大于1 - b。然而,a和b的可能范围是如此之小,以至于找不到这些限制并将它们纳入解决方案是不值得的 - 它只会产生额外的机会来犯错并射击自己。

值得考虑的唯一约束是,当n是b的倍数时,n^2 + a*n + b必须可被n整除。因此,素数链必须最迟在n = b处停止,这给出了可能必须检查素数的最大可能数的上限。也就是说,素性测试的最大可能候选者必须少于2,000,000。当使用集合成员资格而不是试验除法作为素性测试时,这给出了有用的限制。

正如rossum在评论中暗示的那样,任务不是找到最后一组经过测试的系数和得到的链长。要求您找到给出最长质数链的系数a和b,并打印该对的乘积。因此,您需要改变处理链测试的方式。及其结果。

如果您稍微清理一下并删除冗余(例如is_prime(x)隐含x >= 2,因此x > 0,您可能会更好地理解您的代码;它只是没有'在测试素数之后进行正面测试是有意义的。重构代码也应该有所帮助,以便单个部分只有一个单一的责任,并且可以在被整合到整个shebang之前单独测试/调整。

一旦你的代码变成了工作状态,你可能想把它发布在Code Review上,这是一个更适合你寻找的反馈的场所。

P.S。:当我试图推动这个问题时,我在开始时提到的那些限制变得非常有趣,但是为了解决所述的问题,最好采用最简单的解决方案。即使在Python中它也不应该花费超过几分之一秒。