数论学习笔记之欧拉函数

~1~.  欧拉函数φ(n) 表示小于或等于 n 的正整数中与 n 互质的数的个数,即:φ(n) 为 集合{ a| 1 <= a <= n 且 gcd(a,n) = 1 }的元素个数,比如,φ(5) = 4,(1,2,3,4)。

~2~.  欧拉函数的的推导(待续)

  先看几个结论:

  ①,对于素数 p ,显然 $ 。(此式记为 Ⅰ)

  ②,对于素数 p,有 φ(pk) = pk -  pk-1。 (此式记为 Ⅱ)

  ③,如果 gcd(m,n) = 1,则 φ(m*n) = φ(m)*φ(n) 。(此式记为 Ⅲ )

  ④,算术基本定理:任意 m >= 2 都可以化成这种形式(且是一的):

 m = p1k1*p2k2*p3k3*......*pnkn其中 pi  都是素数,且互不相同,把此式记为 Ⅳ) 

  ⑤,要证明的式子: φ(m) = m*(1 - p1) * (1 - p2) * ......*(1 - pn) 。(其中 pi  都是素数,且互不相同,式记为 Ⅴ)

  

要证明 ⑤ 首先得证明前面的几个结论。下面依次证明:  

④不予证明。

②的证明(φ(pk) = pk - pk-1)  

  这个可以根据定义来证明  

自然数列:  1,2, 3, 4, 5, ,,p,,,2*p,,,3*p,,,,,,pn    .

  在 [1 , p] 中 满足1 <= a <= n 且 gcd(a,p) = 1 的数有 p-1 个,(除了 p之外都满足)

  在 (p,2*p]中 满足1 <= a <= n 且 gcd(a,p) = 1 的数有 p-1 个,(除了 2*p)

  。。。。。。

  可以看出每个区间的长度都是 p ,一共有 pk/p = pk-1个区间 ,所以 φ(pk) = pk-1*(p - 1)。证明完成。、

③的证明 (如果 gcd(m,n) = 1,则 φ(m*n) = φ(m)*φ(n))

这个是用中国剩余定理 证明的~待续。。。

 

~3~. 几个代码

 

  1.单个数的欧拉函数值。

  

 1 LL eu(LL N)
 2 {
 3     LL ans = N ;
 4     for (LL i = 2; i*i <= N; i ++) {
 5         if (N%i == 0) {
 6             ans -= ans/i ;
 7             while (N%i == 0) N /= i ;
 8         }
 9     }
10     if (N > 1) ans -= ans/N ;
11     return ans ;
12 }
单个数的欧拉函数

 

  2.筛法求欧拉函数

 1 LL euler[maxn+1] ;
 2 void get_euler()
 3 {
 4     memset(euler,0,sizeof(euler)) ;
 5     euler[1] = 1 ;
 6     for (LL i = 2; i <= maxn; i ++) {
 7         if (!euler[i]) {
 8             for (LL j = i; j <= maxn; j += i) {
 9                 if (!euler[j]) euler[j] = j ;
10                 euler[j] =euler[j]/i*(i-1) ;
11             }
12         }
13     }
14 }
筛法求欧拉函数

  3.同时得到素数表和欧拉函数

 1 bool ch_ch[maxn+1] ;
 2 LL pr[maxn+1] ;
 3 LL phi[maxn+1] ;
 4 LL tot = 0 ;
 5 void get_euler_prime()
 6 {
 7     memset(ch_ch,false,sizeof(ch_ch)) ;
 8     phi[1] = 1;
 9     for (LL i = 2; i <= maxn; i ++) {
10         if (!ch_ch[i]) {
11             pr[tot++] = i ;
12             phi[i] = i - 1 ;
13         }
14         for (LL j = 0; j < tot && pr[j] <= maxn/i; j ++) {
15             ch_ch[i*pr[j]] = true ;
16             if (i%pr[j] == 0) {
17                 phi[i*pr[j]] = phi[i]*pr[j] ;
18                 break ;
19             }
20             else {
21                 phi[i*pr[j]] = phi[i] * (pr[j] - 1) ;
22             }
23         }
24     }
25 }
同时得到欧拉函数和素数表

   感觉代码的第十七行十分巧妙,是这样的:

 i = t*pr[j]^k,i * pr[j] = t*pr[j]^(k+1), phi(i*pr[j]) = phi(t*pr[j]^(k+1)) = phi(t) * phi(pr[j]^(k+1))

 = phi(t) * pr[j] * phi(pr[j]^k) = phi(t) * phi(pr[j]^k) * pr[j] = phi(i) * pr[j] ;

  4.一个小结论。  

    设 b[i] 与 N 互质, 则 b[1] + b[2] + ... + b[φ(N)] = N*φ(N)/2 ;

倒序相加即可证明。若 gcd(a,N) = 1,那么 gcd (N-a,N) = 1 ;