欧拉函数

 

定义:正整数n, 1到n-1中与n互质的数的个数为x, 欧拉函数值phi[n]=x。

通式:phi[n]=n(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn)[pi为小于等于n的质因数]

如果n为质数,phi[n]=n-1。(因为对于质数n,它的因子只有1和它本身,1和n互质。所以n之前的数都和它互质

  x=x/i*(i-1) 等价于  x-=x/i

 

性质:

1, m和n互质 那么phi[m*n]=phi[m]*phi[n]

2,费马小定理(i为质数)

      n为i的倍数时 phi[n*i]=phi[n]*i;

       n不为i的倍数时 phi[n*i]=phi[n]*(i-1)

3, 1==n%2时,phi[2*n]=phi[n]

  n为奇数

4,设小于n的与n互质的数的总和为S, 那么S=phi[n]*n/2

  因为当x和p互质的时候,p-x和p也是互质的 

 

模板

 1 const int mx=1e5+10;
 2 ll euler(ll n){
 3     ll res=n;
 4     for(ll i=2;i*i<=n;i++){
 5         if(0==n%i){//质因子
 6             res-=res/i;//
 7             while(0==n%i) n/=i;//
 8         }
 9     }
10     return (n>1)?res-res/n :res;
11 }
12 ll phi[mx];
13 void euler(){
14     phi[1]=1;
15     for(ll i=2;i<mx;i++){
16         if(!phi[i])// 欧拉值没有计算过 不是前面的数的倍数-质数 只筛质数
17         for(ll j=i;j<mx;j+=i){//i的倍数
18             if(!phi[i]) phi[j]=j;//假设前面所有数字都和j互质
19             phi[j]-=phi[j]/i;//
20         }
21     }
22 }

 

posted @ 2020-08-18 13:11  反射狐  阅读(238)  评论(0)    收藏  举报