欧拉函数是一个积性函数,即对于互质的两个数 m 和 n ,有 φ(m×n)=φ(m)×φ(n) ,容易通过唯一分解定理证明。
这给我们提供了很多很好的性质。
φ(1)=1
φ(p)=p−1 (p 为质数)
φ(pk)=pk−pk−1 (p 为质数)
φ(m×n)=φ(m)×φ(n) (m 和 n 互质)
φ(n)=n×∏p∣n(1−p1)=n×∏p∣npp−1 (p 为 n 的质因数)
φ(n)=φ(pn)×(p−[pn∤p]) (p 为 n 的最小质因数)
还有一个莫反得到的结论是 ∑d∣nφ(d)=n ,因为没学过,暂时不知道怎么证明。
其中第三条性质可以通过定义证明:小于等于 pk 的数有 pk 个,其中有 ppk=pk−1 个数是 p 的倍数,所以有 pk−pk−1 个数与 p 互质。
求法
根号单个求法
枚举 n 的所有质因数 p ,然后根据直接公式 φ(n)=n×∏p∣n(pp−1) 求得,时间复杂度为 O(n) 。
值得一提的是,可以使用 Pollard-ρ 算法来分解质因数,就能将时间复杂度降低到分解质因数的复杂度,约为 O(p) ,其中 p 为 n 的最小质因数。(如果是大质数,可以用 Miller-Rabin 算法来判断)
1 2 3 4 5 6 7 8 9 10 11
intphi(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; }