java程序验证哥德巴赫猜想
2016-02-27 17:36
627 查看
在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;
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);
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树