欧拉函数
欧拉函数
欧拉函数 \(\phi(n)\) 表示小于等于 \(n\) 的和 \(n\) 互质的数的个数。
求一个数 \(n\) 的欧拉函数,设将 \(n\) 质因数分解后的质因数集合为 \(p_{1...m}\) ,则 \(\phi(n)=n*\prod_{i=1}^{m}\frac{p_i-1}{p_i}\).
inline int getphi(int n){
int ans=n;
for(int i=2;i*i<=n;i++){
if(n%i)continue;
ans=ans/i*(i-1);
while(n%i==0)n/=i;
}
if(n>1)ans=ans/n*(n-1);
return ans;
}
欧拉定理
若 \(gcd(a,p)=1\),则 \(a^{\phi(p)}\equiv 1 (\mod p)\).
扩展欧拉定理
\(x^k\equiv x^{k\mod \phi(p)},gcd(x,p)=1\).
\(x^k\equiv x^k,gcd(x,p)!=1,b<\phi(p)(\mod p )\).
\(x^k\equiv x^{k\mod \phi(p)+\phi(p)},gcd(a,p)!=1,b>\phi(p)(\mod p)\).
inline int exeuler(string sa,string sb,int mod){
int a=0,b=0,phi=getphi(mod);
for(char c:sa)a=(a<<1)+(a<<3)+(c^48),(a>=mod)&&(a%=mod);
bool up=false;
for(char c:sb)b=(b<<1)+(b<<3)+(c^48),(b>=phi)&&(up=true,b%=phi);
b+=up*phi;
return po(a,b,mod);
}
筛法求欧拉函数
设 \(p\) 为 \(n\) 的最小质因子,\(n=i*p\),若 \(i\mod p=0\),则 \(n\) 的所有质因子已经出现过,即 \(i\) 中包含了 \(n\) 的所有质因子,\(\phi(n)=p*\phi(i)\),否则 \(i\) 与 \(p\) 互质,\(\phi(n)=(p-1)*\phi(i)\).
inline void sieve(int n){
for(int i=2;i<=n;i++){
if(!v[i])prime[++m]=i,phi[i]=i-1;/*质数的欧拉函数是自己减一,[1,x-1]都与x互质*/
for(int j=1;j<=m&&i*prime[j]<=n;j++){
v[i*prime[j]]=1;
if(i%prime[j])phi[i*prime[j]]=phi[i]*phi[prime[j]];/*未出现的质因子prime[j]*/
else{/*已经出现过的最小质因子*/
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
}
}
}

浙公网安备 33010602011771号