数论学习笔记之欧拉函数
~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 ;