欧拉函数(Euler's function)即
例如
特别地,当
欧拉函数的性质
- 当
是质数时,对于 ,有 。
证明:比
小的正整数共有 个(例如 ),而其中能被 整除的有 个,两者做差即可得到。
- 对任意满足
的整数 ,有 。
证明:在
中,既与 互质,也与 互质的数才可以与 互质,而 和 没有公因子,因而这样的数共有 个。
对于质数
,若 ,则 ,若 ,则 。 对于
, 中与 互质的数的和等于 。 。
欧拉函数朴素求解方法
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int T; cin >> T;
while (T--) {
int n; cin >> n;
int ans = n;
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) {
// ans = ans * (1 - 1 / i);
ans = ans / i * (i - 1);
while (n % i == 0) n /= i;
}
}
if (n > 1) ans = ans / n * (n - 1);
cout << ans << endl;
}
return 0;
}筛法求解欧拉函数
依据性质
cpp
int phi[N], prime[N], st[N], tot;
void eular(int n) {
phi[1] = 1;
for (int i = 2; i <= n; i++) {
if (!st[i]) {
prime[++tot] = i;
phi[i] = i - 1;
}
for (int j = 1; j <= tot && i * prime[j] <= n; j++) {
st[i * prime[j]] = 1;
if (i % prime[j] == 0) {
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else phi[i * prime[j]] = phi[i] * phi[prime[j]];
}
}
}