文章目录
- 定义
- 性质
- 求法
- 分解质因数
- 线性筛
定义
欧拉函数: φ ( n ) \varphi(n) φ(n) 表示小于等于 n 且与 n 互质的数的个数
性质
- 对于质数 n n n, φ ( n ) = n − 1 \varphi(n)=n-1 φ(n)=n−1
- 对于两个互质的正数 a 、 b a、b a、b,有 φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab)=\varphi(a)\varphi(b) φ(ab)=φ(a)φ(b)
- 对于两个质数, φ ( a b ) = ( a − 1 ) ( b − 1 ) \varphi(ab)=(a-1)(b-1) φ(ab)=(a−1)(b−1)
- 当 n n n 为奇数时, φ ( 2 n ) = φ ( n ) \varphi(2n)=\varphi(n) φ(2n)=φ(n)
- 如果 n > 2 n>2 n>2 , φ ( n ) \varphi(n) φ(n) 为偶数
求法
分解质因数
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;
}
线性筛
vector<int> pri;
bool not_prime[N];
int phi[N];void pre(int n)
{phi[1] = 1;for (int i = 2; i <= n; i++){if (!not_prime[i]){pri.push_back(i);phi[i] = i - 1;}for (int pri_j : pri){if (i * pri_j > n) break;not_prime[i * pri_j] = true;if (i % pri_j == 0){phi[i * pri_j] = phi[i] * pri_j;break;}phi[i * pri_j] = phi[i] * phi[pri_j];}}
}