欧拉计划--27

二次“素数生成”多项式

欧拉发现了这个著名的二次多项式:

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

猜你喜欢

转载自blog.csdn.net/qq_37807889/article/details/92375019