欧拉函数及欧拉定理 学习笔记
欧拉函数,即$\varphi(n)$,表示$\leq n$且与$n$互质的个数。
例如,$\varphi(1)=1$。当$n$为质数时,显然有$\varphi(n)=n-1$。
求某一个数的欧拉函数,我们可以用唯一分解定理求出。
设$n=p_1^{k_1}+p_2^{k_2}+\cdots +p_s^{k_s}$,则$\varphi(n)=n*\prod\limits_{i=1}^s \frac{p_i-1}{p_i}$。证明详见OI Wiki。(反正OI不需要证明,只需要会用
根据上述式子,我们可以$\sqrt n$求出一个数的欧拉函数。
一定要把除号写在乘号的前面!!!(血与泪的教训QAQ)
inline int phi(int x) { int res=x,m=x); for (int i=2;i*i<=m;i++) { if (x%i==0){ res=res/i*(i-1); while(x%i==0) x/=i; } } if (x>1) res=res/x*(x-1); return res; }
如果求多个数的欧拉函数,可以使用线性筛。欧拉函数是积性函数,当$b$为质数时,满足下面性质:
$\varphi(ab)=\varphi(a)*b\ (a\ mod\ b=0)$($b$为最小质因子)
$\varphi(ab)=\varphi(a)*\varphi(b)\ (a\ mod\ b≠0)$
所以我们可以线性筛质数的同时求出欧拉函数。
inline int work() { vis[0]=vis[1]=1; for (int i=2;i<=maxn;i++) { if(!vis[i]) prime[++tot]=i; for (int j=1;j<=tot&&prime[j]*i<=maxn;j++) { vis[i*prime[j]]=1; if (i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; } else phi[i*prime[j]]=phi[i]*phi[prime[j]]; } } }
欧拉定理:如果$gcd(a,p)=1$,那么$a^{\varphi(p)}\equiv 1\ (mod\ p)$。
扩展欧拉定理(学长的PPT):
欧拉定理可以解决一些幂比较大的毒瘤题目(比如$10^{2000000}$之类的)。证明什么的看OI Wiki吧。反正我也不会证明qwq