zoukankan      html  css  js  c++  java
  • Evanyou Blog 彩带

    欧拉函数

      对于一个正整数$x$,定义它的欧拉函数$phi (x)$,表示$[1,x-1]$中与$x$互质的数的个数。

      定义$p$为质数,那么可得以下定理:

      1,$phi (1)=1$,易证,从质数的定义中就知道1与1互质;

      2,$phi (p)=p-1$,这个也很容易证明,因为$p$是质数所以与任何正整数都互质;

      3,如果$p|x$,$phi (x*p)=phi (x) * p$,否则$phi (x*p)=phi (x) * (p-1)$;额,这个蒟蒻不会证,自己百度吧(>.<);

      4,$phi (p^x)= p^x-p^{x-1}$,证明:因为$p$是质数,所以在小于$p^x$的数中与它互质的数也就是不包含$p$这个质数的数,而包含$p$的数一共有$p^{x-1}$个,所以小于且与$p^x$互质的数为$p^x-p^{x-1}$个。得证。(当然,这个式子有时也写成$phi (p^x)=p^x*(1-frac {1}{p})$)。

      5,设另一个质数$q$,那么$phi (q*p)= phi (q) * phi (p)=(q-1)*(p-1)$,证明:因为$q,p$都是质数,所以$q*p$的因数除了1和它本身外就只有$q,p$,那么与它互质的数的个数其实就是与$q,p$互质的数的个数之积。

      6,设$n=prod^k_{i=1}p_i^{a_i}$为 $n$ 的素数幂乘积表达式,$phi (n)=n*prod^k_{i=1}(1-frac {1}{p_i})$。证明:

      $phi (n)=prod^k_{i=1}phi (p_i^{a_i})$

         $=prod^k_{i=1}p_i^{a_i}*(1-frac {1}{p_i})$

         $=n*prod^k_{i=1}(1-frac {1}{p_i})$

      了解了以上内容,那么怎么求欧拉函数呢?

      为了求欧拉函数,就有了下面要讲的欧拉筛。

    欧拉筛 

      实际上思想和埃氏筛的优化版本有些相似,枚举一个数$x$的时候枚举比它小的质数$p$,因为$phi (x)$和$phi (p)$都已经求出来了,就可以用上面的定理3求出$phi (x*p)$。

      Code:

    int top=0,k,phi[N],q[N];phi[1]=1;
        for(int i=2;i<N;i++){
            if(!vis[i])phi[q[++top]=i]=i-1;
            for(int j=1;j<=top&&(k=i*q[j])<N;j++){
                vis[k]=true;
                if(i%q[j])
                    phi[k]=phi[i]*(q[j]-1);
                else {
                    phi[k]=phi[i]*q[j];break;}
            }
        }

       不过实际上有时候我们只需要用几个数的欧拉函数,而且可能范围还很大,这时候用线性筛就太不划算了,这里可以用上面的定理6直接求解任意一个数的欧拉函数。

      Code:

    inline int euler(int x)
    {
      int ret=x;
      for(int i=2;i*i<=x;i++){
        if(x%i==0){
          ret=ret/i*(i-1);
          while(x%i==0)x/=i;
        }
      }
      if(x>1)ret=ret/x*(x-1);
      return ret;
    }

      两种求法各有优缺点,根据具体需要选择使用。

    欧拉定理与扩展欧拉定理

      欧拉定理:对于互质的整数$a,n$,有$a^{phi (n)}equiv 1pmod n$;

      证明:

      1,若$n$为质数,那么$phi (n) = n-1$,由费马小定理$a^{p-1} equiv 1 pmod p$即可证得。

      2,若$n$不是质数,那么设集合$Z={ x_1,x_2,...,x_{phi (n)} }$表示小于且与$n$互质的正整数的集合,那么因为$a$与$n$也互质,那么$a * x_i$与$n$也互质。又对于任意的$x_i,x_j,i eq j$,都有$a * x_i \% n eq a * x_j \% n$(由取模的消去律可得)。那么就有

       $a^{phi (n)}*x_1*x_2*...*x_{phi (n)} pmod n$

      $equiv (a*x_1)*(a*x_2)*...*(a*x_{phi (n)}) pmod n$

      $equiv ((a*x_1 \% n)*(a*x_2 \% n)*...*(a*x_{phi (n)} \% n)) pmod n$

      $equiv x_1*x_2*...*x_{phi (n)} pmod n$

      $equiv 1 pmod n$

      又由消去律得到$a^{phi (n)} equiv 1pmod n$。

      

      扩展欧拉定理: 

    $a^bequiv egin{cases}a^{b\%phi(p)}pmod p & gcd(a,p)=1 \a^bpmod p & gcd(a,p) eq1&&b<phi(p)\a^{b\%phi(p)+phi(p)}pmod p&gcd(a,p) eq1&&bgeqphi(p) end{cases}$

      额这个实在是懒,真的不想证($LaTeX$打公式累。。。>.<)。

    例题

      UVA12995 【Solution

      Luogu.org P4139 【Solution

  • 相关阅读:
    用栈消除递归调用,实现DFS【伪代码】
    B树残缺版
    lvm
    RAID独立冗余磁盘阵列
    压缩、归档
    磁盘、文件系统
    setfacl、getfacl
    locate,find
    vim编辑器
    sed流编辑器
  • 原文地址:https://www.cnblogs.com/cytus/p/9240690.html
Copyright © 2011-2022 走看看