java程序验证哥德巴赫猜想

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjluocisoftstone/article/details/50756152

在1742年给欧拉的信中哥德巴赫提出了以下猜想:任一大于2的偶数都可写成两个质数之和。但是哥德巴赫自己无法证明它,于是就写信请教赫赫有名的大数学家欧拉帮忙证明,但是一直到死,欧拉也无法证明。 因现今数学界已经不使用“1也是素数”这个约定,原初猜想的现代陈述为:任一大于5的整数都可写成三个质数之和。欧拉在回信中也提出另一等价版本,即任一大于2的偶数都可写成两个质数之和。这就是哥德巴赫猜想Goldbach Conjecture

为了验证,我们首先需要搞清楚何为质数?质数(prime number)又称素数,有无限个。除了1和它本身以外不再有其他的因数。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积,最小的质数是2。

基本思路:

对于任何一个大于2的偶数n,我们可以将其分解为对应两个数之和,如:n=1+(n-1),n=2+(n-2)……,n=(n/2-1)+(n/2+1),n=n/2+n/2,之后的组合如n=(n/2+1)+(n/2-1)已经和之前的组合重复了,所以分解的一个数只要从1n/2就可以了,之后我们需要判断组合的两个数是否为质数,如果是质数,那么该组合舍弃,进行下一对组合判断,如果没有直到结束也没有出现合适组合,那么验证就失败了。

那么如何判断是不是质数?在一般领域,对正整数n,如果用2到√n之间的所有整数去除均无法整除,则n为质数。质数大于等于2 不能被它本身和1以外的数整除。

/**
	 * 验证任一大于2的偶数都可写成两个质数之和
	 * 
	 * @param num
	 */
	public static void 哥德巴赫猜想(long num) {
		// 首先将num分解为两个奇数之和
		long num1, num2;
		for (num1 = 1; num1 <= num / 2; num1++) {
			num2 = num - num1;
<span style="white-space:pre">			</span>//分别判断组合的两个数字是否均为质数
			if (isPrime(num1) && isPrime(num2)) {
				System.out.println(num + "=" + num1 + "+" + num2);
			}
		}
	}

/**
	 * 验证是否是质数
	 * 
	 * @param n 要判断的数字
	 * @return true or false
	 */
	private static boolean isPrime(long n) {
<span style="white-space:pre">		</span>//1和2单独判断,1已经不是素数,2是最小素数
		if(n==1){
			return false;
		}else if(n==2){
			return true;
		}else{
			for (long i = 2; i <=Math.sqrt(n); i++) {
				if(n%i==0)
					return false;
			}
			return true;
		}
	}
下图是n=200时验证的结果:哥德巴赫猜想(200);



猜你喜欢

转载自blog.csdn.net/zjluocisoftstone/article/details/50756152