1. 程式人生 > >數學 尤拉函式相關

數學 尤拉函式相關

尤拉函式相關

1,\(phi(i)\)表示在1到i的數中與i互質的數的個數。

2,\(O(\sqrt{n})\)\(phi\)

​ 算數基本定理:
\[ phi(i)=i*(p_1-1)/p_1*(p_2-1)/p_2*……*(p_k-1)/p_k \]
​ 列舉質因數套公式即可:

​ code:

int phi(int x){
    int re=x;
    for(int i=2;i*i<=x;i++){
        if(x%i==0){
            re=re/i*(i-1);
            while(x%i==0)x/=i;
        }
    }
    if(x>1)re=re/x*(x-1);
    return re;
}

3,線性篩尤拉函式

​ 1,如果當前數是質數,易知:
\[ phi(i)=i-1 \]
​ 2,如果當前數取模列舉的質數不等於零,則:
\[ phi(i*prime[j])=phi(i)*phi(prime[j]) \]
​ 3,如果當前數取模列舉的質數等於零,則:
\[ phi(i*prime[j])=phi(i)*prime[j] \]
開始愉快地寫程式碼:

void Euler_phi(){
    memset(isprime,1,sizeof isprime);
    phi[1]=1; 
    for(int i=2;i<=n;i++){
        if(isprime[i]){
            phi[i]=i-1; prime[++tot]=i;
        }
        for(int j=1;j<=tot&&i*prime[j]<=n;j++){
            isprime[i*prime[j]]=0;
            if(i%prime[j]!=0){
                phi[i*prime[j]]=phi[i]*phi[prime[j]];
            }
            else{
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
        }
    }
}