在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)已经和之前的组合重复了,所以分解的一个数只要从1到n/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);

|