project euler 27

Problem 27


Quadratic primes

Euler discovered the remarkable quadratic formula:

n 2 + n + 41

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 2 + 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都生成素数,求其系数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;
			
			
		}
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值