素数筛选
Posted shallow-dream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了素数筛选相关的知识,希望对你有一定的参考价值。
简单的引入一下欧拉函数
素数筛选知道4种,暴力筛(逐个判断),埃拉特斯特尼筛 ,欧拉线性筛 ,一个大于5的素数一定在6的倍数周围(PS:不知道官方名是什么)
埃拉特斯特尼筛法。时间复杂度为O(n loglog n)
//倍数筛除 时间复杂度(o(nloglogn) //一个素数的倍数一定不是素数 int vis[1000] , prime[1000]; void judge() memset(vis,1,sizeof(vis)); int cnt=0; prime[0] = prime[1] = 0; for(int i=2;i<1000;i++) if(vis[i]) prime[cnt++] = i; //cout<<prime[cnt-1]<<endl; for(int j=i*i;j<1000;j+=i) vis[j] = 0;
欧拉线性筛法 时间复杂度(o(n) )
//欧拉线性筛法 时间复杂度(o(n)) const int MAXN=3000001; int prime[MAXN];//保存素数 bool vis[MAXN];//初始化 void Prime(int n) int cnt=0; memset(vis,1,sizeof(vis)); for(int i=2;i<=n;i++) if(vis[i]) prime[cnt++] = i; /* cout<<prime[cnt-1]<<endl; */ for(int j=0 ; j<cnt && i*prime[j]<n;j++) // i*prime[j]<=n 容易将最后一个筛出 vis[ i*prime[j] ] = 0; if(i%prime[j]==0) break;//避免重复筛 cout<<cnt<<endl;
一个大于5的素数一定在6的倍数周围
//一个大于5的素数一定在6的倍数周围(时间复杂度小于sqrt(n)) // 判断素数 typedef long long ll; ll n,m; ll prime(ll n) if(n < 2)return 0; if(n ==2 || n == 3)return 1; if(n % 6 != 1 && n % 6 != 5)return 0; for(ll i = 5; i * i <= n; i += 6) if(n % i == 0 || n % (i + 2) == 0) return 0; return 1;
证明:
以上是关于素数筛选的主要内容,如果未能解决你的问题,请参考以下文章