欧拉函数

欧拉函数的定义:

$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     }

 

posted @ 2020-03-26 11:37  dzcixy  阅读(242)  评论(1)    收藏  举报