欧拉筛法求素数模版

Posted zhihaospace

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉筛法求素数模版相关的知识,希望对你有一定的参考价值。

欧拉筛求素数模版

public class Prime {

    //欧拉筛的时间复杂度O(n),每个数只筛一次,使用最小的质因子去筛 [埃氏筛法有重复筛同一个数,时间复杂度为O(n*log(log(n)))]
    public static boolean[] visit; //true代表不是素数,false代表是素数
    public static int[] prime; //记录着每一个质数值
    public static int cnt = 0; //记录质数的个数

    public static void ol_shai(int n) {
        visit = new boolean[n + 1];
        prime = new int[n + 1];
        visit[1] = true; //true不是质数
        for (int i = 2; i <= n; ++i) {
            if (visit[i] == false) //判定是否为素数
                prime[++cnt] = i; //i是一个素数,存入prime数组中
            for (int j = 1; j <= cnt && i * prime[j] <= n; ++j) { //用已得到的素数去筛,并且不越界
                visit[i * prime[j]] = true; //将最小质因子是prime[j]的数筛掉
                if (i % prime[j] == 0) break; //如果prime[j]是i的最小质因数,则直接结束循环(如果不结束就会重复筛)
            }
        }
    }

    public static void main(String[] args) {
        ol_shai(100);
        for (int i = 1; i < cnt; i++) {
            System.out.print(prime[i] + ",");

        }
    }
}

 

以上是关于欧拉筛法求素数模版的主要内容,如果未能解决你的问题,请参考以下文章

初等数论-Base-1(筛法求素数,欧拉函数,欧几里得算法)

实验八 列表

第四章 数学知识

筛法求素数

一般筛法求素数+快速线性筛法求素数

欧拉线性筛 和 欧拉函数的求值