Study notes: Euler function

Euler function definition:
Insert picture description here

How to find a single Euler function:

int euler(int x)
{
    
    
	int res=x;
	for(int i=2;i<=x/i;i++)
	{
    
    
		if(x%i==0)
		{
    
    
			res=res/i*(i-1);
			while(x%i==0)	x/=i;
		}
	}
	if(x>1)	res=res/x*(x-1);
	return res;
}

int main()
{
    
    
	int n; cin>>n;
	cout<<euler(n)<<endl;
	return 0;
}

Interval Euler function sieve method:
(Find the Euler function value of 1~n)
1. The idea of ​​Ehrlich sieve:

const int maxn=1e6+5;
int phi[maxn]; //phi[i]是i的欧拉函数值
void Euler(int n)
{
    
    
    //首先将每个数的欧拉函数值都初始化为它自己 
	for(int i=1;i<=n;i++)	phi[i]=i;
	
	for(int i=2;i<=n;i++)
	{
    
    
		//对于每一个质数p,对2p,3p,...的欧拉函数值/p*(p-1) 
		if(phi[i]==i)
		{
    
    
			for(int j=i;j<=n;j+=i)
				phi[j]=phi[j]/i*(i-1);
		}
	}
}
int main()
{
    
    
	int n; cin>>n;
	Euler(n);
	return 0;
}

2. Find Euler function in the linear sieve process:

const int N = 1e6+5;

int prime[N],cnt,phi[N];
bool vis[N];

void get_euler(int n)
{
    
    
    phi[1]=1;
    for(int i=2;i<=n;i++)
    {
    
    
        if(!vis[i])
        {
    
    
            prime[cnt++]=i;
            phi[i]=i-1;
        }
        for(int j=0;prime[j]<=n/i;j++)
        {
    
    
            vis[prime[j]*i]=1;
            if(i%prime[j]==0)
            {
    
    
                phi[prime[j]*i]=phi[i]*prime[j];
                break;
            }
            phi[prime[j]*i]=phi[i]*(prime[j]-1);
        }
    }
}

int main()
{
    
    
    int n; cin>>n;
    get_euler(n);
    return 0;
}

Guess you like

Origin blog.csdn.net/m0_50815157/article/details/113771432