实验1: 验证歌德巴赫猜想 (统计其关键语句的执行次数(Java代码实现) & 绘制规模-执行次数散点图)
Posted Z && Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验1: 验证歌德巴赫猜想 (统计其关键语句的执行次数(Java代码实现) & 绘制规模-执行次数散点图)相关的知识,希望对你有一定的参考价值。
1. 验证歌德巴赫猜想
1.1 什么是哥德巴赫猜想
- (Goldbach Conjecture)猜想:即任一大于2的偶数都可写成两个质数之和。
- 算法: goldbach(n)
- 描述:算法验证对于小于等于n的偶数,歌德巴赫猜想都是成立的。注意,goldbach(200)并非验证200可以拆分成两个质数的和,而是验证对于所有≤n并且>3的偶数,都可以拆分成两个质数的和。
1.2 源码实现:
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
/**
* ClassName: Goldbach
* Description: 验证哥德巴赫猜想
*/
public class Goldbach {
// 关键代码执行次数
public static int count;
// 哥德巴赫猜想是否成立
public static boolean flag;
public static void main(String[] args) throws IOException {
Writer file = new FileWriter("E:\\\\IDEACode\\\\workspace\\\\java-algorithm\\\\src\\\\main\\\\resources\\\\diagram.csv");
file.write("n,times\\n");
String line;
GoldbachNode goldbachNode;
for (int n = 200; n <= 5000; n += 50) {
goldbachNode = passGoldConj(n);
flag = goldbachNode.getFlag();
count = goldbachNode.getCount();
if (flag) {
line = n + "," + count + "\\n";
file.write(line);
} else {
System.out.println("Goldbach Conjecture doesn't hold in our test");
break;
}
}
file.close();
}
/**
* MethodName: isPrime
* Description: 判断某个数字是否为质数
*
* @return boolean 如果是质数返回true,否则返回false
* @params: [number 用于指定要判断的数字]
*/
public static boolean isPrime(int number) {
for (int i = 2; i < number; i++) {
//如果有某个数字能将number整除
if (number % i == 0) {
// 如果可以被除了0和本身的数字整除 则下结论否定这个数是质数
return false;
}
}
//如果循环能走完,才能确定是质数
return true;
}
/**
* MethodName: passGoldConj
* Description: 验证哥德巴赫猜想算法成立
*
* @return boolean 如果成立返回true 否则返回false
* @params: [number 用于指定要判断的数字]
*/
public static GoldbachNode passGoldConj(int number) {
boolean flag = false;
int count = 0;
//哥德巴赫猜想前提是任意一个不小于3的偶数,所以计数从n=4开始,且以n+=2增加保证全是偶数
for (int n = 4; n <= number; n += 2) {
for (int i = 2; i < n; i++) {
// 关键语句的执行次数+1
count++;
if (isPrime(i) && isPrime(n - i)) {
flag = true;
break;
}
}
}
return new GoldbachNode(count, flag);
}
}
/**
* ClassName: GoldbachNode
* Description: 哥德巴赫猜想的结点类, 里面封装了2个属性(关键代码执行次数 & 哥德巴赫猜想是否成立)
*/
class GoldbachNode {
// 关键代码执行次数
private int count;
// 哥德巴赫猜想是否成立
private boolean flag;
public GoldbachNode(int count, boolean flag) {
this.count = count;
this.flag = flag;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public boolean getFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
1.3 执行结果:
n为验证的次数,times为关键语句的执行次数
1.4 绘制规模-执行次数散点图
R^2为决定系数,当它越接近于1,说明他的拟合程度越高
以上是关于实验1: 验证歌德巴赫猜想 (统计其关键语句的执行次数(Java代码实现) & 绘制规模-执行次数散点图)的主要内容,如果未能解决你的问题,请参考以下文章