1. 程式人生 > 實用技巧 >尤拉函式及尤拉定理 學習筆記

尤拉函式及尤拉定理 學習筆記

尤拉函式,即$\varphi(n)$,表示$\leq n$且與$n$互質的個數。

例如,$\varphi(1)=1$。當$n$為質數時,顯然有$\varphi(n)=n-1$。

求某一個數的尤拉函式,我們可以用唯一分解定理求出。

設$n=p_1^{k_1}+p_2^{k_2}+\cdots +p_s^{k_s}$,則$\varphi(n)=n*\prod\limits_{i=1}^s \frac{p_i-1}{p_i}$。證明詳見OI Wiki。(反正OI不需要證明,只需要會用

根據上述式子,我們可以$\sqrt n$求出一個數的尤拉函式。

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

如果求多個數的尤拉函式,可以使用線性篩。尤拉函式是積性函式,當$b$為質數時,滿足下面性質:

$\varphi(ab)=\varphi(a)*b\ (a\ mod\ b=0)$($b$為最小質因子)

$\varphi(ab)=\varphi(a)*\varphi(b)\ (a\ mod\ b≠0)$

所以我們可以線性篩質數的同時求出尤拉函式。

inline int work()
{
    vis[0]=vis[1]=1;
    for (int i=2;i<=maxn;i++)
    {
        if(!vis[i]) prime[++tot]=i;
        for (int j=1;j<=tot&&prime[j]*i<=maxn;j++)
        {
            vis[i*prime[j]]=1;
            
if (i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; } else phi[i*prime[j]]=phi[i]*phi[prime[j]]; } } }