• 数论学习笔记之欧拉函数


                数论学习笔记之欧拉函数

    ~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 ;

     

     

     

  • 相关阅读:
    postman简单传参,上个接口的返回值作为下个接口的入参。
    python 给定URL 如何获取其内容,并将其保存至HTML文档。
    外键关联on_delete参数含义
    excel导入与导出
    序列化关系
    使用框架的各种代码示例
    国产celery简单使用
    selecte_related 函数优化查询
    django 之 配置文件
    类与缓存问题 类与属性的关系
  • 原文地址:https://www.cnblogs.com/smile-0/p/4584094.html
Copyright © 2020-2023  润新知