分享

java程序验证哥德巴赫猜想

 一本正经地胡闹 2017-06-27

在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以外的数整除。

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

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



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多