歐拉函數的積性證明及線性篩

歐拉函數的積性證明

歐拉函數即φ\varphi函數

以下兩段是從大佬那裏淘來的證明

同樣的,tnmtn,tm(tmodn)n,(tmodm)mt\perp nm\Leftrightarrow t\perp n,t\perp m\Leftrightarrow(t\bmod n)\perp n,(t\bmod m)\perp m,所以每個 [1,nm][1, nm]之間的與nmnm互質的數tt都可以對應到一個[1,n][1,n]的與nn互質的數 tmodnt\bmod n和一個[1,m][1,m]的與mm互質的數tmodmt\bmod m

並且根據中國剩餘定理,這種對應是一一對應的(即已知 an,bma\perp n, b\perp m後可以唯一確定一個[1,nm][1,nm]之間的tt使得tmodn=a,tmodm=bt\bmod n=a, t\bmod m=b,且tnmt\perp nm)。因此 φ(nm)=φ(n)φ(m)\varphi(nm)=\varphi(n)\varphi(m)


然而我看不懂……還是從定義上來證明吧!

假設有兩個互質的正整數n,mn,m,則

φ(n)=n(11pi)\varphi(n)=n\prod(1-\frac{1}{p_i})

φ(m)=m(11pi)\varphi(m)=m\prod(1-\frac{1}{p_{i'}})

φ(n)φ(m)=n(11pi)m(11pi)=nm(11pi)(11pi)\varphi(n)\varphi(m)=n\prod(1-\frac1{p_i})m\prod(1-\frac1{p_{i'}})=nm\prod(1-\frac1{p_i})\prod(1-\frac1{p_{i'}})

因爲n,mn,m互質,所以pip_ipip_{i'}各各都不相同,且都是nmnm的質因子

因此就可以推出φ(nm)=φ(n)φ(m)\varphi(nm)=\varphi(n)\varphi(m)

至此,積性函數的性質得證。但是由上面的證明可知,n,mn,m必須要互質纔可以滿足歐拉函數是積性函數,由此可見歐拉函數不是完全積性函數

線性篩歐拉函數

友情提示:建議先學習線性篩素數再來學習,在此不會講線性篩的基本操作

線性篩歐拉函數可以分爲三種情況:

  1. ii是質數時,φ(i)=n1\varphi(i)=n-1,根據質數的性質,在1i1\sim i中,有i1i-1個與ii互質的數,所以質數ii的歐拉函數就是i1i-1
  2. imodp[j]0i\bmod p[j]\neq 0時,說明iip[j]p[j]互質,φ(i×p[j])=φ(i)φ(p[j])\varphi(i\times p[j])=\varphi(i)\varphi(p[j])(因爲p[j]p[j]是質數,所以φ(p[j])\varphi(p[j])也可以寫成p[j]1p[j]-1,代碼裏寫的是φ(p[j])\varphi(p[j])
  3. imodp[j]=0i\bmod p[j]=0時,φ(ip[j])=φ(i)p[j]\varphi(i*p[j])=\varphi(i)*p[j](從歐拉函數定義來證明,表示我也不會)

代碼如下

int phi[A], p[A], cnt;
//phi歐拉函數,p質數數組,cnt記錄質數個數 
bool vis[A];//爲1即爲合數,爲0則爲質數 

void getphi() {
	phi[1] = 1;
	for (int i = 2; i <= n; i++) {
		if (!vis[i]) p[++cnt] = i, phi[i] = i - 1;
		for (int j = 1; j <= cnt && i * p[j] <= n; j++) {
			vis[i * p[j]] = 1;
			if (i % p[j] == 0) { phi[i * p[j]] = phi[i] * p[j]; break; }
			else phi[i * p[j]] = phi[i] * phi[p[j]];//互質,利用歐拉函數的積性 
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章