「观前提醒」
「文章仅供学习和参考,如有问题请在评论区提出」
欧拉函数#
定义#
欧拉函数的符号表示是
例如,
性质#
-
若
是质数, 则 。质数会和小于它本身的所有正整数互质,即
与 中所有数互质。 -
当
是奇数时, 。只有这一种情况成立,并不是
的偶数倍的意思。 -
如果
,其中 是质数,那么 中只有不包含质数 ,才会与 互质。而包含质数 的数为 倍数,即 ,总共有 个。所以去掉包含
的数,就是和 互质的数的个数,即 。公式变形,就会有上述三个表示方式。
-
积性函数:若
,则 。
计算公式推导#
由唯一分解定理,
是 的质因子 提醒:
是乘积运算符号,代表 所有数的乘积,即 。
那么有,
因为对于任意的
然后再根据性质3,推出
最后进行公式变形,可得
公式进行整理,可得
观察公式就能发现,欧拉函数仅与
求欧拉函数#
分解质因子法#
思路:用试除法分解出
时间复杂度:
代码:
// 分解质因数求欧拉函数
int phi(int n) {
int res = n;
// 分解质因子
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) {
// 公式求值
res = res / i * (i - 1);
while (n % i == 0) n /= i;
}
}
if (n > 1) res = res / i * (i - 1);
return res;
}
筛法求欧拉函数#
// 线性筛法求 1 ~ n 的 质数
const int N = 1e5 + 10;
int p[N], cnt; // p[]存储所有素数
bool st[N]; // st[x]存储x是否被筛掉
void get_primes(int n) {
st[1] = true;
for (int i = 2; i <= n; i++) {
if (!st[i]) p[cnt++] = i;
for (int j = 1; p[j] <= n / i; j++) {
st[p[j] * i] = true;
if (i % p[j] == 0) break;
}
}
}
思路:
观察上面的线性筛质数的代码,我们可以再用一个 phi[]
来存储每一个数的欧拉函数,即
若
而且在线性筛中,每个合数(非质数)都会被自身的最小质因子筛掉。那么设
-
若
能被 整除,则 就包含了 的所有质因子。若
能被 整除,说明 也是 的质因子。又因为 也是 的质因子,而且 ,所以 就包含了 的所有质因子。然后再根据推导的公式变形,得
根据推导公式,一个数得欧拉函数只与其本身和其质因子有关。
虽然
是从 推导出来的,但是因为 与 的质因子相同,所以也可以被用来推导出 。 -
若
不能被 整除,则 和 是互质的。因为
是质数,除了 本身,就没有其他的质因子。若 不能被 整除,那么 和 就没有相同的质因子,那么两者就是互质的。然后根据性质4和性质1进行公式变形,得
总结上面的思路,就能得到所有的情况,
- 若
是 质数,得 。 - 若
不是质数,说明已经被自己的质因子赋值了。 - 遍历
,- 若
能被 整除,得 ,并退出遍历。 - 若
不能被 整除,得 。
- 若
时间复杂度:
代码:
const int N = 1e5 + 10;
int p[N], cnt; // p[] 存储所有素数
int phi[N]; // phi[x] 存储 x 的欧拉函数值
bool st[N]; // st[x] 存储 x 是否被筛掉
// 线性筛法求欧拉函数
void get_phi(int n) {
phi[1] = 1;
st[1] = true;
for (int i = 2; i <= n; i++) {
// 没有被筛过,说明是质数
if (!st[i]) {
p[cnt++] = i;
phi[i] = i - 1;
}
for (int j = 0; p[j] <= n / i; j++) {
int m = i * p[j];
st[m] = true;
// 判断是否能整除,然后根据公式赋值
if (i % p[j] == 0) {
phi[m] = p[j] * phi[i];
break;
} else phi[m] = (p[j] - 1) * phi[i];
}
}
}
参考资料#
欧拉函数 – OI Wiki (oi-wiki.org):https://oi-wiki.org/math/number-theory/euler/
【RSA原理2】浅谈–什么是欧拉函数 韦_恩的博客-CSDN博客:https://blog.csdn.net/qq_42539194/article/details/118514310
董晓算法 515 筛法求欧拉函数:https://www.bilibili.com/video/BV1VP411p7Bs