數學 尤拉函式相關
阿新 • • 發佈:2018-11-05
尤拉函式相關
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; } } } }