简单的引入一下欧拉函数

素数筛选知道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;
}
证明:
