Problem 27
Quadratic primes
Euler discovered the remarkable quadratic formula:
It turns out that the formula will produce 40 primes for the consecutive values n = 0 to 39. However, when n = 40, 402 + 40 + 41 = 40(40 + 1) + 41 is divisible by 41, and certainly when n = 41, 412 + 41 + 41 is clearly divisible by 41.
The incredible formula n2 − 79n + 1601 was discovered, which produces 80 primes for the consecutive values n = 0 to 79. The product of the coefficients, −79 and 1601, is −126479.
Considering quadratics of the form:
-
n2 + an + b, where |a| < 1000 and |b| < 1000
-
where |n| is the modulus/absolute value of n
e.g. |11| = 11 and |−4| = 4
Find the product of the coefficients, a and b, for the quadratic expression that produces the maximum number of primes for consecutive values of n, starting with n= 0.
二次“素数生成”多项式
欧拉发现了这个著名的二次多项式:
对于连续的整数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都生成素数,求其系数a和b的乘积。
package projecteuler;
import org.junit.Test;
public class Prj27 {
/**
*
*/
@Test
public void test(){
int[] ab = Calculator.calculate();
System.out.println(ab[0] * ab[1]);
}
public static class Calculator{
public static int[] calculate(){
int maxAId = -999;
int maxBId = -999;
int maxCount = -1;
for( int i = -999 ; i <= 999 ; i ++){
for( int j = -999; j <= 999; j ++){
int k = 0;
for(; ;){
int val = calculateNum(i, j , k);
if( isPrime(val)){
k ++;
}else{
break;
}
}
if( k > maxCount){
maxCount = k;
maxAId = i;
maxBId = j;
}
}
}
System.out.println("maxCount=" + maxCount + ",a=" + maxAId + ",b=" + maxBId);
return new int[]{ maxAId, maxBId};
}
public static int calculateNum(int a, int b, int n){
return n * n + a * n + b;
}
public static boolean isPrime( int num){
if( num <= 1){
return false;
}
if( num == 2 || num == 3){
return true;
}
for( int i = 2; i <= Math.sqrt(num); i ++){
if( num % i == 0){
return false;
}
}
return true;
}
}
}