二次“素数生成”多项式
欧拉发现了这个著名的二次多项式:
n2 + n + 41
对于连续的整数n从0到39,这个二次多项式生成了40个素数。然而,当n = 40时,402 + 40 + 41 = 40(40 + 1) + 41能够被41整除,同时显然当n = 41时,412 + 41 + 41也能被41整除。
随后,另一个神奇的多项式n2 − 79n + 1601被发现了,对于连续的整数n从0到79,它生成了80个素数。这个多项式的系数-79和1601的乘积为-126479。
考虑以下形式的二次多项式:
-
n2 + an + b, 满足|a| < 1000且|b| < 1000
-
其中|n|指n的模或绝对值
例如|11| = 11以及|−4| = 4
这其中存在某个二次多项式能够对从0开始尽可能多的连续整数n都为素数(n值尽可能大),求其系数a和b的乘积。
由于当n为0时n*n + a*n + b = b为素数,线性筛筛一下1000内的素数作为循环变量可减少大量时间;
n = 1时公式 1 + a + b 为素数 b为素数,既为奇数,则b+1为偶数,若要公式为素数,a亦为奇数,满足n>0时公式值恒大与0,则
扫描二维码关注公众号,回复:
6506471 查看本文章
a >= -63;
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
#define MAX_N 10000000
int prime[MAX_N+5];
int is_prime[MAX_N+5];
bool isprm(int x) {
for (int i = 2; i < x; i++) {
if (x % i == 0) return false;
}
return true;
}
int main() {
for(int i = 2; i <= MAX_N; i++) {
if (is_prime[i] == 0) {
prime[++prime[0]] = i;
}
for (int j = 1; j <= prime[0]; i++) {
if (i * prime[j] > MAX_N) {
break;
}
is_prime[i*prime[j]] = 1;
if (i % prime[j] == 0) {
break;
}
}
}
int ans = 0, tmp;
int maxa,maxb;
for (int b = 1; b <= prime[0]; b++) {
if (prime[b] > 1000) break;
for (int a = -63; a < 1000; a+=2) {
int n;
for( n = 0; ; n++) {
if (isprm(n*n + a*n + prime[b]) == false) {
break;
}
}
if (n > ans) {
ans = n;
tmp = a * prime[b];
}
}
}
cout<<tmp<<endl;
return 0;
}
答案:-59231