尤拉函式φ

sad_lin發表於2024-09-23

尤拉函式

尤拉函式,即 \(\varphi(n)\),表示的是小於等於 \(n\)\(n\) 互質的數的個數,詳細定義看wiki

尤拉函式其實就是容斥原理的應用,舉個例子:

\(n=6\)\(1,2,3,4,5,6\) 是整個序列,我們將 \(6\) 的質因子 \(2\)\(3\) 取出,減去小於等於 \(6\)\(2\) 的倍數和 \(3\) 的倍數,但是 \(2\)\(3\) 的公倍數 \(6\) 被減了兩次所以還要再加一次:\(6-\frac{6}{2}-\frac{6}{3}+\frac{6}{6}=2\)

將這個公式轉化一下就可以得到通用公式(\(p\)\(n\) 的質因數):

\[\varphi(n)=n\times (1- \frac{n}{p_1})\times (1- \frac{n}{p_2}) \times ……\times (1- \frac{n}{p_k}) \]

看什麼程式碼,自己寫
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,m;
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
    	cin>>n;
	    m=n;
	    for(int i=2;i*i<=n;i++){
	    	if(n%i==0){
	    		m*=(1-1.0/i);
				while(n%i==0){
					n/=i;
				}
			}
		}
		if(n>1){
			m*=(1-1.0/n);
		}
		cout<<m<<"\n";
	}

    return 0;
}

相關文章