ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

质数判断与质数筛法

2021-07-11 10:31:37  阅读:143  来源: 互联网

标签:prime 24 判断 筛法 int 质数 st 筛去 primes


1、质数判断

bool isPrime(int n) {
    if (n < 2) return false;
    for (int i = 2; i <= n / i; i++)
        if (n % i == 0) return false;
    return true;
}

2、埃拉筛

const int N = 1e5 + 10;
int primes[N], cnt;     // primes[]存储所有素数
bool st[N];             // st[x]存储x是否被筛掉

void get_primes(int n) {
    for (int i = 2; i <= n; i++)
        if (!st[i]) {
            primes[cnt++] = i;   //记录素数
            for (int j = 2 * i; j <= n; j += i) //成倍数的标识
                st[j] = true;
        }
}

3、欧拉筛

int primes[N], cnt;     // primes[]存储所有素数
bool st[N];             // st[x]存储x是否被筛掉
void get_primes(int n) {
    for (int i = 2; i <= n; i++) {
        if (!st[i]) primes[cnt++] = i;
        for (int j = 0; primes[j] <= n / i; j++) {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;
        }
    }
}

1、对于\(st[i*prime[j]] = true\) 的理解:

对每个从小到大遍历到的\(i\),让他乘上之前已经找到的素数,将每个得到的积筛掉。

2、对于关键一步的理解

if(i % prime[j] == 0) break;

我们以当\(i=8,j=0\)时的情况为例(自己动手在草稿纸上跟着写一遍):

此时\(prime[j]=2,prime[j+1]=3\);
此时将 \(i * prime[j]= 8 * 2 =16\) 筛去(16被他最小的质因子\(2\)筛去)

然后发现 \(i % prime[j]==0\),因为\(8%2==0\),如果此时不跳出循环,下一步应筛去\(8*prime[j+1] = 8 * 3 = 24\)
而\(24\)的最小质因子是\(2\),再考察上一步,发现\(8 * prime[j+1] = 8 * 3=2 * 4 * 3 = 4 * 3 * 2=12 * prime[j]\),也就是说如果此时将\(24\)筛去,当\(i\)增加至\(12\)时,\(24\)将被\(2\)再次筛选,
我们可以总结如下:当\(i%prime[j]==0\)时,有 \(i = prime[j] * k\) ,即 \(prime[j] * k *prime[j+1]\) 应当在在 \(i = k *prime[j+1]\) 时由\(prime[j]\)筛去,所以当发现当\(i%prime[j]==0\)时\(break\),保证了每个合数只被它的最小的质因子筛选一次。

4、分解质因数

void divide(int x) {
    for (int i = 2; i <= x / i; i++) //到sqrt就够了
        if (x % i == 0) {
            int s = 0;
            while (x % i == 0) x /= i, s++;
            cout << i << ' ' << s << endl;
        }
    //如果还没有除开,就是还需要写一个
    if (x > 1) cout << x << ' ' << 1 << endl;
    cout << endl;
}

标签:prime,24,判断,筛法,int,质数,st,筛去,primes
来源: https://www.cnblogs.com/littlehb/p/14998053.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有