歐拉函數的積性證明
歐拉函數即φ函數
以下兩段是從大佬那裏淘來的證明
同樣的,t⊥nm⇔t⊥n,t⊥m⇔(tmodn)⊥n,(tmodm)⊥m,所以每個 [1,nm]之間的與nm互質的數t都可以對應到一個[1,n]的與n互質的數 tmodn和一個[1,m]的與m互質的數tmodm。
並且根據中國剩餘定理,這種對應是一一對應的(即已知 a⊥n,b⊥m後可以唯一確定一個[1,nm]之間的t使得tmodn=a,tmodm=b,且t⊥nm)。因此 φ(nm)=φ(n)φ(m) 。
然而我看不懂……還是從定義上來證明吧!
假設有兩個互質的正整數n,m,則
φ(n)=n∏(1−pi1)
φ(m)=m∏(1−pi′1)
φ(n)φ(m)=n∏(1−pi1)m∏(1−pi′1)=nm∏(1−pi1)∏(1−pi′1)
因爲n,m互質,所以pi和pi′各各都不相同,且都是nm的質因子
因此就可以推出φ(nm)=φ(n)φ(m)
至此,積性函數的性質得證。但是由上面的證明可知,n,m必須要互質纔可以滿足歐拉函數是積性函數,由此可見歐拉函數不是完全積性函數
線性篩歐拉函數
友情提示:建議先學習線性篩素數再來學習,在此不會講線性篩的基本操作
線性篩歐拉函數可以分爲三種情況:
- i是質數時,φ(i)=n−1,根據質數的性質,在1∼i中,有i−1個與i互質的數,所以質數i的歐拉函數就是i−1
- imodp[j]=0時,說明i和p[j]互質,φ(i×p[j])=φ(i)φ(p[j])(因爲p[j]是質數,所以φ(p[j])也可以寫成p[j]−1,代碼裏寫的是φ(p[j]))
- imodp[j]=0時,φ(i∗p[j])=φ(i)∗p[j](從歐拉函數定義來證明,表示我也不會)
代碼如下:
int phi[A], p[A], cnt;
bool vis[A];
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]];
}
}
}