欧拉函数

欧拉函数的性质:

1)   p^k型欧拉函数:

若N是质数p(即N=p), φ(n)= φ(p)=p-p^(k-1)=p-1。

若N是质数p的k次幂(即N=p^k),φ(n)=p^k-p^(k-1)=(p-1)p^(k-1)。

(2)mn型欧拉函数

设n为正整数,以φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值。若m,n互质,φ(mn)=φ(m)φ(n)

(3)特殊性质:

若n为奇数时,φ(2n)=φ(n)。

对于任何两个互质 的正整数a,n(n>2)有:a^φ(n)=1 mod n (恒等于)此公式即 欧拉定理

当n=p 且 a与素数p互质(即:gcd(a,p)=1)则上式有: a^(p-1)=1 mod n (恒等于)此公式即 费马小定理

(4)对于n,p为n的素因子

φ(p*n) = p*φ(n)(由最根本的定理可知)

相关证明:https://www.cnblogs.com/handsomecui/p/4755455.html

欧拉函数模板

 1 int euler_phi(int n)//求单个
 2 {
 3     int m = (int)sqrt(n + 0.5);
 4     int ans = n;
 5     for(int i = 2; i <= m; i++)if(n % i == 0)
 6     {
 7         ans = ans / i * (i - 1);
 8         while(n % i == 0)n /= i;
 9     }
10     if(n > 1)ans = ans / n * (n - 1);
11     return ans;
12 }
13 void phi_table(int n, int* phi)//打表
14 {
15     for(int i = 0; i <= n; i++)phi[i] = i;
16     for(int i = 2; i <= n; i++)if(phi[i] == i)
17         for(int j = i; j <= n; j += i)phi[j] = phi[j] / i * (i - 1);
18 }
 1 void phi_table(int n)//稍微快一点的打表 
2 { 3 phi[1] = 1; 4 for(int i = 2; i <= n; i++) 5 { 6 if(!phi[i])//素数 7 { 8 for(int j = i; j <= n; j += i) 9 { 10 if(!phi[j])phi[j] = j; 11 phi[j] = phi[j] / i * (i - 1); 12 } 13 } 14 } 15 }
 1 ll phi[maxn];
 2 ll prime[maxn];
 3 bool not_prime[maxn];
 4 int cnt;
 5 void phi_table(int n)//最快打表 O(n)
 6 {
 7     phi[1] = 1;
 8     for(int i = 2; i <= n; i++)
 9     {
10         if(!not_prime[i])//素数
11         {
12             prime[++cnt] = i;
13             phi[i] = i - 1;
14         }
15         for(int j = 1; j <= cnt && i * prime[j] <= n; j++)
16         {
17             not_prime[i * prime[j]] = 1;
18             if(i % prime[j] == 0)//第j个素数是i的因子
19             {
20                 phi[i * prime[j]] = phi[i] * prime[j];
21                 break;
22             }
23             else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
24         }
25     }
26 }
原文地址:https://www.cnblogs.com/fzl194/p/9017174.html