欧拉函数
仓促之下赶出来的笔记,以后再补充吧
# 欧拉函数
定义:
小于等于中与互质的数的个数,记作
(1与任何数互质)
特别的,
# 性质
欧拉函数为积性函数
即对于互质的整数,有
中与互质的数的和为
证明:若,则,这样的数成对出现且和为
# 求法
# 计算单个数的欧拉函数
复杂度
假设为合数
当为某一质数的幂,即(为质数)时,有
否则,有
int GetPhi(int p) {
int ans = 1;
for(int i = 2; i * i <= p; i++) {
if(p % i == 0) {
int now = i - 1; p /= i;
while(p % i == 0) now = now * i, p /= i;
ans = ans * now;
}
}
if(p != 1) ans *= (p - 1);
return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 线性筛
若为素数,
若,且为素数,
若,且为素数
const int maxn = 1e5 + 1001;
int phi[maxn], prime[maxn], pcnt = 0;
bool not_prime[maxn];
void init(int n){
not_prime[1] = true;
for(int i=2; i<=n; i++){
if(!not_prime[i]) {
prime[pcnt++] = i;
phi[i] = i - 1;
}
for(int j=0; j<pcnt && i * prime[j] <= n; j++){
not_prime[i * prime[j]] = true;
if(i % prime[j] == 0){
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
上次更新: 2021/02/24, 03:37:30