欧拉函数

欧拉函数

欧拉函数 \(\varphi(a)\) 为小于等于 \(a\) 的正整数中与 \(a\) 互质的个数。

显然得到 \(\varphi(1) = 1\) ,当 \(a\) 为质数的时候我们有 \(\varphi(a) = a-1\)

同时,我们有\(\varphi(n) = n\times(\frac{p-1}{p}) = p^{k-1}\times(p-1)\) ,其中 \(n = p^k\) 并且 \(p\) 为质数。

同时我们知道欧拉函数是一个积性函数,也就是当 \(\gcd(a,b) = 1\) 时有

\[\varphi(a\times b) = \varphi(a) \times \varphi(b) \]

我们可以将 \(n\) 唯一质因数分解, \(n = \prod_{i=1}^sp_i^{k_i}\) ,其中 \(p_i\) 表示第 \(i\) 个质因数, \(k_i\) 表示对应的质因数的因数个数 。

显然我们得到了

\[\varphi(n) = n\times\prod_{i=1}^s\frac{p_i-1}{p_i} \]

如果我们找到 \(n\) 的最小质因数 \(p\) , 如果 \(\gcd(p,\frac{n}{p}) = 1\) ,那么就有 \(\varphi(n) = \varphi(\frac{n}{p})\times\frac{p-1}{p}\)

如果 \(\gcd(p,\frac{n}{p}) = p\) 那么就有 \(\varphi(n) = \varphi(\frac{n}{p})\times p\)

我们可以使用欧拉筛来线性求出欧拉函数

void init()
{
    phi[1] = 1;
    for(int i = 2;i <= 100000;i ++){
        if(!vis[i]) pri[++cnt] = i,phi[i] = i-1;
        for(int j = 1;j <= cnt&&(i*pri[j]<=100000);j ++){
             
            vis[i*pri[j]] = 1;
            phi[i*pri[j]] = phi[i]*(pri[j]-1);
            if(i%pri[j]==0){
                phi[i*pri[j]] = phi[i]*pri[j];
                break;
            }
        }
    }
}
posted @ 2020-09-10 17:49  nao-nao  阅读(165)  评论(0编辑  收藏  举报