实验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代码实现) & 绘制规模-执行次数散点图)的主要内容,如果未能解决你的问题,请参考以下文章

[PTA]实验4-2-3 验证“哥德巴赫猜想”

验证“哥德巴赫猜想”

验证对Random的两个猜想

1005. 继续(3n+1)猜想

概率论与数理统计python实验

如何直接执行SQL语句