欧拉函数
欧拉函数的定义:
$1~N$中与$N$互质的数的个数被称为欧拉函数,记为$phi(N)$。在算数基本定理中,$N = p_{1}^{a_1}p_{2}^{a_2}p_{3}^{a_3}\cdot \cdot \cdot p_{m}^{a_m}$。
则$phi(N) = N*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})\cdot \cdot \cdot *(1-\frac{1}{p_m})$
根据欧拉函数的定义,我们可以将$N$分解质因数,再将其值乘入欧拉函数。
1 int x; 2 scanf("%d", &x); 3 4 int res = x; 5 for(int i = 2 ; i <= x / i ; i ++) 6 if(x % i == 0) 7 { 8 res = res / i * (i - 1); 9 while(x % i == 0)x /= i; 10 } 11 if(x > 1)res = res / x * (x - 1); 12 printf("%d\n", res);
筛法求欧拉函数:
因为欧拉函数需要分解质因数,所以在做筛法求素数的时候,可以一起求出欧拉函数。先设置初始的1的欧拉函数为1。
对于筛法求欧拉函数中,因为筛法求素数有三种情况,所以我们也需要分三种情况:
①当前的数$x$是质数,将$x$加入$primes$数组中,并将$x$的欧拉函数置为$x-1$。(因为$x$是质数,所以$1-x$里面和$x$互质的数有$x - 1$个)
②$p_j$是$i$的一个质因子,那么$i * p_j$的欧拉函数的值就是$p_j * phi[i]$。($p_j$指代$primes[j]$)
因为$i\; mod \; p_j == 0$, $phi[i] = i \left ( 1 - \frac{1}{p_1} \right )\left ( 1-\frac{1}{p_2} \right )\left ( 1-\frac{1}{p_3} \right )\cdot \cdot \cdot \left ( 1-\frac{1}{p_k} \right )$ 。
所以$phi[i * p_j] = i * p_j \left ( 1 - \frac{1}{p_1} \right )\left ( 1-\frac{1}{p_2} \right )\left ( 1-\frac{1}{p_3} \right )\cdot \cdot \cdot \left ( 1-\frac{1}{p_k} \right )$。
即为$phi[i * p_j] = p_j * phi[i]$。
③$p_j$不是$i$的一个质因子,那么$i * p_j$的欧拉函数的值计算$(p_j - 1)*phi[i]$。
$phi[i] = i \left ( 1 - \frac{1}{p_1} \right )\left ( 1-\frac{1}{p_2} \right )\left ( 1-\frac{1}{p_3} \right )\cdot \cdot \cdot \left ( 1-\frac{1}{p_k} \right )$ 。
因为$i\; mod \; p_j != 0$,所以$phi[i * p_j] =p_j * i \left ( 1 - \frac{1}{p_1} \right )\left ( 1-\frac{1}{p_2} \right )\left ( 1-\frac{1}{p_3} \right )\cdot \cdot \cdot \left ( 1-\frac{1}{p_k} \right )\left ( 1-\frac{1}{p_j} \right )$
$phi[i * p_j] =p_j \left ( 1-\frac{1}{p_j} \right )phi[i]$。
$phi[i * p_j] = (p_j - 1)phi[i]$。
1 phi[1] = 1; 2 for(int i = 2 ; i <= n ; i ++) 3 { 4 if(!st[i]) 5 { 6 primes[cnt ++] = i; 7 phi[i] = i - 1; 8 } 9 for(int j = 0 ; primes[j] * i <= n ; j ++) 10 { 11 st[primes[j] * i] = true; 12 if(i % primes[j] == 0) 13 { 14 phi[i * primes[j]] = phi[i] * primes[j]; 15 break; 16 } 17 phi[i * primes[j]] = phi[i] * (primes[j] - 1); 18 } 19 }

浙公网安备 33010602011771号