浅谈欧拉函数

介绍

欧拉函数是小于 \(x\) 的整数中与 \(x\) 互质的数的个数,一般用 \(\varphi(x)\) 表示。特殊的, \(\varphi(1)=1\) 。

内容

通式:\(\varphi(x)=x\prod_{i=1}^n{1-\frac{1}{p_i}}\)

其中, \(p_1,p_2...p_n\) 为 \(x\) 的所有质因数, \(x\in N^*\) 。

性质

  1. 对于质数 \(p\) , \(\varphi(p)=p-1\) 。
  2. 若 \(p\) 为质数,\(n=p^k\) ,则 \(\varphi(n)=p^k-p^{k-1}\) 。
  3. 欧拉函数是积性函数,但不是完全积性函数。若 \(m,n\) 互质,则 \(\varphi(m*n)=\varphi(m)*\varphi(n)\) 。特殊的,当 \(m=2,n\) 为奇数时, \(\varphi(2*n)=\varphi(n)\) 。
  4. 当 \(n>2\) 时, \(\varphi(n)\) 是偶数。
  5. 小于 \(n\) 的数中,与 \(n\) 互质的数的总和为 \(\varphi(n)*n/2 \ \ \ (n>1)\) 。
  6. \(n=\sum_{d|n}\varphi(d)\) ,即 \(n\) 的因数(包括1和它本身)的欧拉函数之和为 \(n\) 。

容斥原理求欧拉函数

  • 将 \(N\) 分解为不同素数的乘积,即:

    \[N=p_1^{r_1}*p_2^{r_2}*p_3^{r_3}*...*p_k^{r_k}\]

  • 设 \(1\) 至 \(N\) 的 \(N\) 个数中为 \(p_i\) 倍数的集合为 \(A_i\) ,则有 \(|A_i|=\lfloor\frac{N}{p_i}\rfloor\) \((i=1,2,3,..,k)\)。

  • 对于 \(p_i\not=p_j\) , \(A_i\cap A_j\) 既是 \(p_i\) 的倍数也是 \(p_j\) 的倍数,即可得 \(|A_i\cap A_j|=\lfloor\frac{N}{p_ip_j}\rfloor\) \((1\le i,j \le k,i\not=j)\) 。

  • \[\begin{split} \varphi(N) &=|A_1\cap A_2 \cap A_3 \cap ... \cap A_k|\\ &=N-(\frac{N}{p_1}+\frac{N}{p_2}+...+\frac{N}{p_k})+(\frac{N}{p_1p_2}+\frac{N}{p_2p_3}+...+N)...\pm(\frac{N}{p_1p_2...p_k})\\ &=N(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_k}) \end{split}\]

算法实现

时间复杂度:\(O(\sqrt{n})\)

int euler_phi(int n) {
    int res = n;
    for (int i = 2; i * i <= n; ++i) {
        if (n % i == 0) {
            res = res / i * (i - 1);
            while (n % i == 0) n /= i;
        }
    }
    if (n != 1) res = res / n * (n - 1);
    return res;
}

参考

blog

上一篇:题解 洛谷P2158 【[SDOI2008]仪仗队】


下一篇:2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 huntian oy