定义:
- 对 正整数nnn,欧拉函数是 小于nnn的正整数 中 与nnn互质的数的数目。(φ(1)=1\varphi(1)=1φ(1)=1)
互质:aaa与bbb互质,即gcd(a,b)=1\gcd(a,b)=1gcd(a,b)=1
性质:
-
对于质数ppp,φ(p)=p−1\varphi(p)=p-1φ(p)=p−1
-
欧拉函数φ(x)\varphi(x)φ(x)为(不完全)积性函数,若 mmm与nnn互质,则φ(mn)=φ(m)φ(n)\varphi(mn)=\varphi(m)\varphi(n)φ(mn)=φ(m)φ(n)
特别地,当m=2m=2m=2,nnn为奇数时,有φ(2n)=φ(n)\varphi(2n)=\varphi(n)φ(2n)=φ(n) -
当n>2n\gt2n>2时,φ(n)\varphi(n)φ(n)是偶数;当n>6n\gt6n>6时,φ(n)\varphi(n)φ(n)是合数( 因为φ(n)=2\varphi(n)=2φ(n)=2是偶数,但不是合数 )
-
小于等于nnn的数中,与nnn互质的数的总和为:φ(n)∗n/2          (n>1)\varphi(n)*n/2\;\;\;\;\;(n\gt1)φ(n)∗n/2(n>1)
计算:
- 欧拉函数通式:φ(x)=x∏i=1n(1−1pi)\varphi(x)=x \prod_{i=1}^{n}(1-\frac{1}{p_i})φ(x)=xi=1∏n(1−pi1)
其中p1,p2,... ,pnp_1,p_2,...\,,p_np1,p2,...,pn为xxx的所有质因数,xxx是为正整数。(φ(1)=1\varphi(1)=1φ(1)=1)
为方便编程计算,对上述通式进行通分,得到:
φ(x)=x∏i=1n(pi−1pi)\varphi(x)=x \prod_{i=1}^{n}(\frac{p_i-1}{p_i})φ(x)=xi=1∏n(pipi−1)
那么只需要求得x的质因数,即可求得欧拉函数。
模板:
①求一个数nnn的欧拉函数       O(n)\;\;\;O(\sqrt n)O(n)
即遍历111~n\sqrt nn找出nnn的质因数进行计算即可。
int phi(int n) //计算φ(n)
{
if(n==1) //特判
return 1;
int res=n,k=sqrt(n);
for(int i=2;i<=k;i++)
{
if(n%i==0)
{
res=res/i*(i-1); //先除后乘避免溢出
while(n%i==0)
n/=i;
}
}
if(n>1) //不要漏了这句
res=res/n*(n-1);
return res;
}
② 求111~ nnn的欧拉函数       O(nloglogn)\;\;\;O(n\log{\log n})O(nloglogn)
用 埃氏素筛 的的方法进行处理即可(当然也可以用欧拉筛,不过写起来稍微麻烦些,但是时间复杂度能达到O(n)O(n)O(n))
就是每次找到一个质数,对 质因数包含该质数的数 的欧拉函数进行一次计算,同时筛去合数。
int get_phi() //得到欧拉函数表
{
phi[1]=1; //特判
for(int i=2;i<=maxn;i++) //先令φ(x)=x
phi[i]=i;
for(int i=2;i<=maxn;i++)
{
if(phi[i]!=i) //说明不是质数
continue;
for(int j=i;j<=maxn;j+=i) //遍历质因数包含i的数
phi[j]=phi[j]/i*(i-1); //先除后乘避免溢出
}
}