1. 程式人生 > 其它 >學習筆記:尤拉函式

學習筆記:尤拉函式

尤拉函式定義:
在這裡插入圖片描述

單個尤拉函式求法:

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;
}

區間尤拉函式篩法:
(求1~n的尤拉函式值)
1、埃氏篩思想:

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、線性篩過程中求尤拉函式:

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; }