0027. 素数生成式
* * * *
拉格朗日计划
* * * *
素数生成式

欧拉发现二次多项式$n^2+n+41$可以在$n=0,1,\ldots,39$时连续生成40个素数。不过当$n=40$时,$40^+40+41=40(40+1)+41$能被41整除,因而也就不再是素数。

此后人们又发现$n^2-79n+1601$能在$n=0,1,\ldots,79$时连续生成80个素数,这个多项式的系数是1、-79和1601,其乘积是-126479。

考虑如下形式的多项式: $$n^2+an+b, \quad |a|,|b|\le 1000,$$ 若它能在$n=0,1,\ldots,k$时连续生成素数,求当k最大时a与b的乘积。

本题难度:



解答

代入$n=0$可得b需为素数,鉴于数据量不大,也无需进一步优化,直接先用筛法生成素数表,再暴力搜索a和b就可得$a=-61, b=971$时$k=70$最大,此时$ab=-61\times 971=-59231$。

target=1500
d=[0]*target
n=2
while n < target:
    for i in range(n+n,target,n): d[i]+=1
    n=n+1
    while n < target and d[n]: n+=1
primeList=[n for n in range(2,target) if d[n]==0]

def isPrime(m):
    if m<=0: return False
    else:
        i=0
        while i < len(primeList) and primeList[i]*primeList[i]<=m and m%primeList[i]: i+=1
        return i>=len(primeList) or m%primeList[i]

maxCount=maxA=maxB=0
for b in primeList[:168]:
    for a in range(-1000,1001):
        n=0
        while isPrime(n*n+a*n+b): n+=1
        n-=1
        if n>maxCount:
            maxCount=n
            maxA=a
            maxB=b

print maxA*maxB, maxCount, maxA, maxB