zoukankan      html  css  js  c++  java
  • 欧拉函数学习

    定义

    所有小于n的与n互质的数的个数被称为欧拉函数,记作φ(n)

    通式

    φ(x)=x(11/p1)(11/p2)(11/p3)(11/p4)..(11/pn)φ(x)=x(1-1/p_1)(1-1/p_2)(1-1/p_3)(1-1/p_4)…..(1-1/p_n)

    p是x的质因子

    可以这样理解:

    如果一个数与x互质

    那么这个数一定不是x任何一个质因子的倍数

    而对x=p1^a1* p2^a2 * ……*pn^an

    p1p_1倍数的数占x的1p1frac{1}{p_1}

    而不是的数占x的11p11-frac{1}{p_1}

    p2p_2同理,不是p2p_2的倍数的数占x的11p21-frac{1}{p_2}

    所以说不是x的任意一个质因子的倍数的数有φ(x)=x(11/p1)(11/p2)(11/p3)(11/p4)..(11/pn)φ(x)=x(1-1/p_1)(1-1/p_2)(1-1/p_3)(1-1/p_4)…..(1-1/p_n)

    性质

    1:对于一个质数x,φ(x)=x-1;

    这是显然的吧,如果x是质数那么所有小于它的数都与它互质

    2:对于一个数x,1~x中与其互质的数的和为xφ(x)/2x*φ(x)/2

    证明:
    考虑到求gcd的更相损减gcd(a,b)=gcd(a,ab)gcd(a,b)=gcd(a,a-b)

    所以所有和x不互质的数都是a,xa(a,x-a)(上面gcd式子第二项)这样成对出现

    而平均值为x/2x/2,所以所以和x互质的数的平均值也是n/2,而总共有φ(x)个,所以和为xφ(x)/2x*φ(x)/2

    3:若a,b互质,则φ(ab)=φ(a)φ(b)φ(a*b)=φ(a)*φ(b)(φ为积性函数)

    证明:

    考虑到a,b,互质,也就是说a,b没有相同的质因子

    若设
    φ(a)=(11/p1)(11/p2)(11/p3)(11/p4)..(11/pn)φ(a)=(1-1/p_1)(1-1/p_2)(1-1/p_3)(1-1/p_4)…..(1-1/p_n)
    φ(b)=(11/p1)(11/p2)(11/p3)(11/p4)..(11/pm)φ(b)=(1-1/p_1)(1-1/p_2)(1-1/p_3)(1-1/p_4)…..(1-1/p_m)(两个p不同,指各自数的质因子)

    因为a,b的质因子没有相同的

    则根据φ的通式,φ(ab)=ab11/p1)(11/p2)(11/p3)(11/p4)..(11/p(n+m))=φ(a)φ(b)φ(a*b)=(a*b)*(1-1/p_1)(1-1/p_2)(1-1/p_3)(1-1/p_4)…..(1-1/p_(n+m))=φ(a)*φ(b)

    4:设n=pkn=p^k(p为质数) ,则φ(n)=pkpk1φ(n)=p^k-p^{k-1}

    证明:因为p为质数,所以n只有p一个质因子

    根据公式φ(n)=n(11p)=pk(11p)=pkpk1φ(n)=n*(1-frac{1}{p})=p^k*(1-frac{1}{p})=p^k-p^{k-1}

    5:若pn,p2np|n,p^2|n,则φ(n)=φ(n/p)pφ(n)=φ(n/p)*p

    证明:因为pn,p2np|n,p^2|n,所以n,n/pn,n/p有相同的质因子,只是系数不同而已,把φ(n)和φ(n/p)按照欧拉函数通式写出来,相除商为p,移项后就为原等式

    6:若pnp2!np|n且p^2! | n,则φ(n)=φ(n/p)*(p-1)

    证明:类似与5可得n,n/pn,n/p互质,由性质3可得φ(n)=φ(n/p)*φ(p)

    因为p为质数,所以φ§=p-1,所以得证

    7:Σdnφ(d)=nΣ_{d|n}φ(d)=n

    我也不太会证明,以后有时间再回来补吧

    大概就是这些了

    关于欧拉筛

    OnlognO(nlogn)

    根据欧拉函数的通式

    考虑到一个数只会被其质因子更新,所以我们用类似埃式筛,在筛质数的时候改成更新质数的所有倍数的欧拉函数

    模板:(以BZOJ2190仪仗队为例)

    inline void init(){
     for(int i=1;i<=50000;i++)phi[i]=i;
     for(int i=2;i<=50000;i++)
      if(phi[i]==i)
       for(int j=i;j<=50000;j+=i)
        phi[j]=phi[j]/i*(i-1);
    }
    

    O(n):

    感觉和欧拉筛质数很类似

    然后利用欧拉函数的性质(5、6)计算

    inline void init(){
     phi[1]=1;
     for(int i=2;i<=50000;i++){
      if(!vis[i]){
       pri[++cnt]=i,phi[i]=i-1;
      }
      for(int j=1;j<=cnt&&pri[j]*i<=50000;j++){
       vis[pri[j]*i]=1;
       if(i%pri[j]==0){
        phi[i*pri[j]]=phi[i]*pri[j];break;
       }
       else phi[i*pri[j]]=phi[i]*phi[pri[j]];
      }
     }
    }
    
  • 相关阅读:
    python3随记——字符编码
    python基础3(元祖、字典、深浅copy、集合、文件处理)
    python的颜色显示
    python基础2(数据类型、数据运算、for循环、while循环、列表)
    python基础之初始python
    0423作业(函数)
    0423上课练习(list、while、def)
    函数的定义与调用(4.23)
    0422作业:基础(if,while)
    while,for,if输入账号密码判断(还请各位大牛能够优化,本人刚学习一周)
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/10366421.html
Copyright © 2011-2022 走看看