欧拉函数(Euler)
定义
欧拉函数(Euler's totient function),即 ,表示的是小于等于 和 互质的数的个数。
比如说 。
当 是质数的时候,显然有 。
性质
-
欧拉函数是积性函数。
即对任意满足 的整数 ,有 。
特别地,当 是奇数时 。
-
。
证明利用莫比乌斯反演相关知识可以得出。
也可以这样考虑:如果 ,那么 。
如果我们设 表示 的数的个数,那么 。
根据上面的证明,我们发现,,从而 。注意到约数 和 具有对称性,所以上式化为 。
-
若 ,其中 是质数,那么 。 (根据定义可知)
-
由唯一分解定理,设 ,其中 是质数,有 。
-
由唯一分解定理,设 ,其中 是质数,有 。
证明-
引理:设 为任意质数,那么 。
证明:显然对于从 1 到 的所有数中,除了 个 的倍数以外其它数都与 互素,故 ,证毕。
接下来我们证明 。由唯一分解定理与 函数的积性
-
-
对任意不全为 的整数 ,。
可由上一条直接计算得出。
实现
如果只要求一个数的欧拉函数值,那么直接根据定义质因数分解的同时求就好了。这个过程可以用 Pollard Rho 算法优化。
#include <cmath>
int euler_phi(int n) {
int ans = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0) n /= i;
}
if (n > 1) ans = ans / n * (n - 1);
return ans;
}
如果是多个数的欧拉函数值,可以利用后面会提到的线性筛法来求得。
应用
欧拉函数常常用于化简一列最大公约数的和。国内有些文章称它为 欧拉反演[^1]。
在结论
中代入 ,则有
其中, 称为 Iverson 括号,只有当命题 为真时 取值为 ,否则取 。对上式求和,就可以得到
这里关键的观察是 ,即在 和 之间能够被 整除的 的个数是 。
利用这个式子,就可以遍历约数求和了。需要多组查询的时候,可以预处理欧拉函数的前缀和,利用数论分块查询。
给定 ,求
??? note "思路" 仿照上文的推导,可以得出
此时需要从 遍历到 求欧拉函数,用线性筛做就可以 得到答案。
欧拉定理
与欧拉函数紧密相关的一个定理就是欧拉定理。其描述如下:
若 ,则 。
扩展欧拉定理
当然也有扩展欧拉定理,用于处理一般的 和 的情形。
习题
- SPOJ #4141 "Euler Totient Function"[Difficulty: CakeWalk]
- UVa #10179 "Irreducible Basic Fractions"[Difficulty: Easy]
- UVa #10299 "Relatives"[Difficulty: Easy]
- UVa #11327 "Enumerating Rational Numbers"[Difficulty: Medium]
- TIMUS #1673 "Admission to Exam"[Difficulty: High]
习题和欧拉定理和费马小定理部分相同。