欧拉函数

欧拉函数

欧拉函数 \(\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;
            }
        }
    }
}
posted @ 2022-11-19 18:11  半步蒟蒻  阅读(92)  评论(7)    收藏  举报