首页 > 编程语言 >有关素数的基础算法 素性测试 埃氏筛法

有关素数的基础算法 素性测试 埃氏筛法

时间:2023-05-26 15:01:22浏览次数:33  
标签:约数 prime 埃氏 素性 筛法 int 枚举 整数 素数


所谓素数,是指恰好有两个约数的正整数。因为n的约数都小于n,所以只需要检查2 ~  n-1之间所有的整数是否整除n就能判定n是不是素数。如果d是n的约数,那么n/d也是n的约数。由n = d * n / d可知min(d,n / d) 

有关素数的基础算法   素性测试   埃氏筛法_数组

 

有关素数的基础算法   素性测试   埃氏筛法_素数_02

,所以只需要检查2 ~ 

有关素数的基础算法   素性测试   埃氏筛法_素数_02

之间的所有整数就足够了。同理可知,整数分解和约数枚举都可以在

有关素数的基础算法   素性测试   埃氏筛法_素性测试_04

时间完成。

判定单一的一个数是不是素数,素性测试:
 

bool is_prime(int n)/**< 判定一个数是不是素数 ,假设输入的数都是正整数*/
{
    for(int i = 2;i * i <= n; i++)
    {
        if(!(n % i))
            return false;
    }
    return n != 1;/**< 1是例外 */
}

如果只对一个数进行素数测试,通常

有关素数的基础算法   素性测试   埃氏筛法_素性测试_04

的算法就足够了。但如果要对许多整数进行素性测试,则有更高效的算法。要枚举n以内的素数,可以用埃氏筛法:这是一种古老的算法,首先,将2到n范围内的所有整数写下来。其中最小的数字2是素数。将表中所有2的倍数都划去,然后表中剩余最小的素数是3,将表中所有3的倍数也都划去。以此类推,如果表中剩余最小的素数是m的话,就将表中所有m的倍数都划去,像这样反复操作,就能依次枚举n以内的素数,埃氏筛法的时间复杂度仅有

有关素数的基础算法   素性测试   埃氏筛法_数组_06

,接近线性:

bool is_prime[MAX];
int prime[MAX];
int sieve(int n)/**< 枚举n以内的素数 */
{
    /**< 返回n以内素数的个数,素数存在prime数组里*/
    int p = 0;
    for(int i = 0;i <= n; i++)
        is_prime[i] = true;
    is_prime[0] = is_prime[1] = false;
    for(int i = 2;i <= n; i++)
    {
        if(is_prime[i])
        {
            prime[p++] = i;
            for(int j = i * 2;j <= n; j += i)
                is_prime[j] = false;
        }
    }
    return p;
}

 

标签:约数,prime,埃氏,素性,筛法,int,枚举,整数,素数
From: https://blog.51cto.com/u_16131191/6356133

相关文章

  • 埃氏筛 & 欧拉筛
    Part1埃氏筛埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。---百度词条思想从一数列中最小质数开始,寻找其倍数,即合数,筛去直至最......
  • 质数 埃氏
    #include<bits/stdc++.h>usingnamespacestd;defineN1000000intb[1000005],n,cnt;intmain(){ scanf("%d",&n); for(inti=2;i*i<=N;i++){ for(intj=i*i;j<=N;j+=i) b[j]=1; } for(inti=2;i<=N;i++)......
  • 质数及其筛法
    筛法质数质数,又称素数。如果一个数\(a\in\N^+(a\neq1)\)的因子有且仅有\(1\)和它本身,则称数\(a\)为质数。普通筛法过程枚举\([2,n-1]\),如果\(n\)在这个范围内有因子,则\(n\)不是因数。因为\(n\)的因子成对出现,所以我们可以枚举\([2,\sqrt{n}]\)。Codeboolisprime(in......
  • 初等数学瞎扯Ⅲ:数论函数与筛法
    0.前置知识与基本定义\([op]\):值为\(1\)当且仅当方括号内条件为真。记为艾弗森括号唯一分解定理:一个正整数\(x\)可以被唯一分解为\(\prod\limits_{i=1}^mp_i^{c_i}\),其中\(\foralli\in[1,m],p_i\in\mathbb{P}\)。(关于\(\mathbb{P}\),详见初等数学瞎扯Ⅰ:同余相关)。......
  • python习题-筛法求素数
    【题目描述】用户输入整数n和m(1<n<m<1000),应用筛法求[n,m]范围内的所有素数。【基本思想】用筛法求素数的基本思想是:把从2到N的一组正整数从小到大按顺序排列。从中依次删除2的倍数、3的倍数、5的倍数,直到根号N的倍数为止,剩余的即为2~N之间的所有素数。【源代码程序】defsie......
  • 【ACM算法竞赛日常训练】DAY10题解与分析【月月给华华出题】【华华给月月出题】| 筛法
    DAY10共2题:月月给华华出题华华给月月出题难度较大。......
  • 记录欧式筛法筛选素数
    点击查看代码voidgetPrime(longlongn,vector<int>&prime,vector<bool>&isPrime){isPrime[1]=false;for(inti=2;i<n;++i){if(isPrime[i]){prime.emplace_back(i);}for(constint&a......
  • 欧拉筛法求素数
    在开筛之前,我们要理解一个很好理解的概念,任何一个合数可以拆成一个最小素数和另一个数(可能质数可能合数)的乘积这个最小素数即为这个合数的最小质因子//比如12=2*6,此时2就是12的最小质因子,当然亦有12=3*4,可以看到3也是12的质因子,但不是最小的质因子//而且,对于一合数a=b*q,b为a的最......
  • LeetCode 周赛 338,贪心 / 埃氏筛 / 欧氏线性筛 / 前缀和 / 二分查找 / 拓扑排序
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。上周末是LeetCode第338场周赛,你参加了吗?这场周赛覆盖的知识点很多,第四题......
  • 浅析数论--埃氏筛/欧拉筛/杜教筛
    \(\mathcal{0x01绪论}\)\(\mathcal{质数的判定试除法or六倍原理}\)一个合数的约数总是成对出现的,如果\(d|n\)(\(d\)能被\(n\)整除),那么\((n/d)|n\),因此我们判断一个......