素数筛(5种)

关于筛素数大概有以下几种方法
1.遍历2–(n-1)判断有没有除一和其本身以外的因子。
2.加一点点技巧因为n=n的1/2次方乘以n的1/2次方,所以若n在2-(根号n)存在因子,则在根号n–n也存在因子,所以我们只需要遍历2–根号n就可以判断了。
3.埃氏筛,核心思想就是打表(当前数为素数则其倍数不为素数)
判断素数个数模板题
具体代码:

#include <bits/stdc++.h>//埃氏筛
using namespace std;
#define int long long
bool A[100000000];//可能是因为洛谷数据太小的原因吧,才能过。。
signed main(){
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n; cin>>n; int e=n; e--;//将去1的可能(1不是质数)
    for(int i=2;i*i<=n;i++){//利用开根的思想排查
        if(A[i]==false){
            for(int j=i*2;j<=n;j+=i){//若当前i为素数则将他的所有倍数标记为不是素数
                if(A[j]==false){
                    A[j]=true; e--;
                }
            }
        }
    }
    cout<<e<<endl;
}

4.欧拉筛(一种复杂度为O(n)的打表方法)。
欧拉筛模板题
原理:如果判断24是否为一个素数那么用埃氏筛的话起码会重复筛24三次(212,38,46),那欧拉筛就是在此基础上只筛一次就是其最小质因数与因一个合数的乘积(212).
具体代码:

#include <bits/stdc++.h>//欧拉筛
using namespace std;
bool A[100000001];   int prime[1000001];
int main(){
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n,m; scanf("%d %d",&n,&m);
    int cnt=0;
    for(int i=2;i<=n;i++){
        if(A[i]==false){
            prime[++cnt]=i;
        }
        for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
            A[i*prime[j]]=true;
            if(i%prime[j]==0) break;//最重要的一步
        }
    }
    for(int i=0;i<m;i++){
        int c; scanf("%d",&c);
        printf("%d\n",prime[c]);
    }
    return 0;
}

特别解释一下这步:

if(i%prime[j]==0) break;//最重要的一步

若当前质因数是i的因子则为i的最小质因数,也为i*prime【j】的最小质因数就跳出循环.
5.Miller测试法(适用于千万级别以上的素数判断)

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是 Python 判断素数的五方法: 1. 蛮力法:从2开始遍历到n-1,如果n能被其中任意一个数整除,则不是素数。 ```python def is_prime(n): if n <= 1: return False for i in range(2, n): if n % i == 0: return False return True ``` 2. 优化的蛮力法:只需要遍历到n的平方根即可。 ```python import math def is_prime(n): if n <= 1: return False for i in range(2, int(math.sqrt(n))+1): if n % i == 0: return False return True ``` 3. 筛法:从2开始,将2的倍数、3的倍数、4的倍数……都标记为合数,最后没有被标记的数即为素数。 ```python def sieve(n): primes = [True] * (n+1) primes[0], primes[1] = False, False for i in range(2, int(math.sqrt(n))+1): if primes[i]: for j in range(i*i, n+1, i): primes[j] = False return primes def is_prime(n): if n <= 1: return False primes = sieve(n) return primes[n] ``` 4. 费马小定理:如果n是素数,那么对于任意a,a^(n-1) mod n = 1。该算法的缺陷是当n不是素数时,结果也可能是1,因此需要进行多次测试。 ```python import random def power(a, n, p): res = 1 while n > 0: if n & 1: res = (res * a) % p a = (a * a) % p n >>= 1 return res def is_prime(n, k=5): if n <= 1 or n == 4: return False if n <= 3: return True for _ in range(k): a = random.randint(2, n-2) if power(a, n-1, n) != 1: return False return True ``` 5. Miller-Rabin算法:该算法是费马小定理的一扩展,可以快速判断一个数是否是合数。该算法的精度可以通过调整参数k来控制,一般取10-20。 ```python import random def power(a, n, p): res = 1 while n > 0: if n & 1: res = (res * a) % p a = (a * a) % p n >>= 1 return res def is_prime(n, k=10): if n <= 1 or n == 4: return False if n <= 3: return True r, d = 0, n-1 while d % 2 == 0: r += 1 d //= 2 for _ in range(k): a = random.randint(2, n-2) x = power(a, d, n) if x == 1 or x == n-1: continue for _ in range(r-1): x = (x * x) % n if x == n-1: break else: return False return True ``` 以上就是 Python 判断素数的五方法,希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值