尤拉和莫比烏斯
初稿寫於2021-10-10,
再修改於2022-02-07
Achtung: 本文章使用p來代指“任意質數”,請勿混淆。
尤拉函式
尤拉函式 \(φ(n)\) 的概念是在 \([0,n-1]\) 範圍內有多少個整數與 \(n\) 互質。
其中,我們規定 \(φ(1)=1\),
且不難發現,\(φ(p)=p-1\)。
尤拉函式的一些性質
尤拉函式是積性函式
即 \(φ(mn) = φ(m) φ(n)\)
並且當 \(n \bmod{2} \equiv 1\) 時,\(φ(2n) = φ(n)\),
而當 \(n \bmod{2} \equiv 0\)(即 \(2|n\))時,\(φ(2n) = 2 φ(n)\)
\(\displaystyle \sum_{m|n}^{n} m = n \frac{φ(n)}{2}\)
\[\sum_{m|n}^{n} m = n \frac{φ(n)}{2} \]易證。
\(\displaystyle \sum_{d|n} φ(d) = n\)
\[\sum_{d|n} φ(d) = n \]我們利用莫比烏斯反演的相關知識可以得出。
或者我們這樣考慮:
如果 \(\gcd(k,n) = d\) ,那麼 \(\gcd(\frac{k}{d} , \frac{n}{d}) = 1 (k < n)\) 。
我們如果設 \(f(x)\) 為滿足 \(\gcd(k,n) = x\)
根據上面的證明,我們可以發現, \(f(x) = φ(\frac{n}{x})\) ,從而得到 \(n = \sum_{d|n} φ(\frac{n}{d})\) 。注意此時我們的約數 \(d\) 和 \(\frac{n}{d}\) 具有對稱性,所以上面的式子可以化為 \(n = \sum_{d|n} φ(d)\) 。
\(\displaystyle φ(p^k) = p^k - p^{k-1}\)
若 \(n = p^k\) ,那麼 \(φ(n) = p^k - p^{k-1}\) 。
由定義可知。
因為有 \(n \perp p^k \iff p \not \mid n\)
\(\displaystyle φ(\prod_{i=1}^s p_i^{k_i}) = \prod_{i=1}^s p_i^{k_i - 1} · (p_i - 1)\)
由唯一分解定理,設 \(n = \prod_{i=1}^s p_i^{k_i}\) ,則有 \(φ(n) = \prod_{i=1}^s \frac{p_i - 1}{p_i}\)。
證明:
\[\begin{align} φ(n) &= \prod_{i=1}^s φ(p_i^{k_i}) \\\\ &= \prod_{i=1}^s p_i^{k_i} - p_i^{k_i - 1} \\\\ &= \prod_{i=1}^s (p_i - 1) \times p_i^{k_i - 1} \\\\ &= \prod_{i=1}^s (1 - \frac{1}{p_i}) p_i^{k_i} \\\\ &= n \prod_{i=1}^s (1 - \frac{1}{p_i}) \end{align} \]計算尤拉函式的值
單點求值
我們不難發現,當 \(m\) 是一個質數的整數冪 \(p^k\) 時,我們有
\[φ(p^k)=p^k-p^{k-1} \];
如果 \(m>1\) 不是一個質數的整數冪,那我們可以把 \(m\) 拆分成 \(m=m_1 m_2\) ,其中 \(m_1 \perp m_2\)。這樣這個數就可以在剩餘系裡表示為 \((n \bmod m_1 , n \bmod m_2)\) 。如果你不知道什麼是剩餘系,可以看我的部落格:(咕了)。
根據
\[k \perp m 且 k \perp n \iff k \perp mn \]和
\[\gcd(m,n) = \gcd(n \bmod m,m) \]可得
\[n \perp m \iff n \bmod m_1 \perp m_1 且 n \bmod m_2 \perp m_2 \],由此,我們可以推得
\[φ(m)=φ(m_1)φ(m_2),m_1 \perp m_2 \]所以,尤拉函式是一個積性函式。
尤拉函式的通項公式是
\[φ(m)=\prod_{p|m} (p^{m_p}-p^{m_p-1})=m \prod_{p|m}(1-\frac{1}{p}) \]上程式碼:
int euler_phi(int n)
{
int m = int(sqrt(n + 0.5));
int ans = n;
for(int i = 2; i <= m; i++)
if(n % i == 0)
{
ans = ans / i * (i - 1);
while(n % i == 0) n /= i;
}
if(n > 1) ans = ans / n * (n - 1);
return ans;
}
如果將程式碼改為下面的形式可以優化一些:
int euler_phi(int n)
{
int ans = n;
for(int i = 2; i * i <= n; i++)
if(n % i == 0)
{
ans = ans / i * (i - 1);
while(n % i == 0) n /= i;
}
if(n > 1) ans = ans / n * (n - 1);
return ans;
}
區間篩
而我們可以使用篩法來求連續區間的尤拉函式值:
const int N = 1e7 + 5;
int phi[N], prime[N / 100];
bool visit[N];
void getphi(int n)
{
phi[1] = 1;
for(int i = 2; i <= n; i++)
{
if(!visit[i])
{
prime[prime[0] + 1] = i;
prime[0]++;
phi[i] = i - 1;
}
for(int j = 1; j <= prime[0] && i * prime[j] <= n; j++)
{
visit[i * prime[j]] = true;
if(!(i % prime[j]))
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else
{
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
}
還有OI Wiki上提供的程式碼:
void pre()
{
memset(is_prime, 1, sizeof(is_prime));
int cnt = 0;
is_prime[1] = 0;
phi[1] = 1;
for(int i = 2; i <= 5000000; i++)
{
if(is_prime[i])
{
prime[++cnt] = i;
phi[i] = i - 1;
}
for(int j = 1; j <= cnt && i * prime[j] <= 5000000; j++)
{
is_prime[i * prime[j]] = 0;
if(i % prime[j])
phi[i * prime[j]] = phi[i] * phi[prime[j]];
else
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
}
}
}
複雜度均為線性。
尤拉定理
我們先看一下費馬小定理。
費馬小定理
眾所周知,費馬小定理是:
\[a^{p-1} \equiv 1 \pmod{p},a \perp p \]還有另一種形式,是這樣的:
\[\forall a \in \mathbb{N} ,a^p \equiv a \pmod{p} \]。
證明
我們首先取一個不為 \(p\) 倍數的數 \(a\) 。
構造一個序列: \(A = \lbrace 1,2,3, \cdots , p - 1 \rbrace\) ,這個序列擁有這樣的一個性質:
證明:
\[\because (A_i,p) = 1 , (A_i \times a,p) = 1 \]又因為每一個 \(A_i \times a \pmod{p}\) 都是獨一無二的,且 \(A_i \times a \pmod{p} < p\) ,得證(每一個 \(A_i \times a\) 都對應了一個 \(A_i\))。
設 \(f = (p-1)!\),則
證畢。
或者也可以使用歸納法證明:
顯然 \(1^p \equiv 1 \pmod{p}\)。那麼假設 \(a^p \equiv a \pmod{p}\) 成立,那麼通過二項式定理有
\[(a+1)^p = a^p + C_p^1 a^{p-1} + C_p^2 a^{p-2} + \cdots + C_p^{p-1} a + 1 \]因為 \(C_p^k = \frac{p!}{(n-k)!k!}\) 對於 \(k \in \[ 1,p-1 \]\) 成立,在模 \(p\) 意義下 \(C_p^1 \equiv C_p^2 \equiv \cdots \equiv C_p^{p-1} \equiv 0 \pmod{p}\),那麼 \((a+1)^p \equiv a^p + 1 \pmod{p}\),將 \(a^p \equiv a \pmod{p}\) 代入得 \((a+1)^p \equiv a+1 \pmod{p}\)。
證畢。
尤拉定理
尤拉定理的內容如下:
若 \(\gcd(a,m) = 1\),則 \(a^{φ(m)} \equiv 1 \pmod{m}\)。
證明
尤拉定理的證明過程與費馬小定理的證明過程十分相似。
我們同樣首先構造一個與 \(m\) 互質的序列,再進行操作。
設 \(r_1,r_2, \cdots ,r_{φ(m)}\) 為模 \(m\) 意義下的一個簡化剩餘系,則 \(ar_1,ar_2, \cdots ,ar_{φ(m)}\) 同樣也為模 \(m\) 意義下的一個簡化剩餘系。所以,\(\prod_{i=1}^{φ(m)} r_i \equiv \prod_{i=1}^{φ(m)} ar_i \equiv a^{φ(m)} \prod_{i=1}^{φ(m)} r_i \pmod{m}\),約去 \(\prod_{i=1}^{φ(m)} r_i\) 後可得 \(a^{φ(m)} \equiv 1 \pmod{m}\)。
證畢。
當 \(m=p\) 時,由於 \(φ(m) = m-1\),將之代入可得費馬小定理。
擴充套件尤拉定理
擴充套件尤拉定理是這個樣子的:
\[a^b \equiv \begin{cases}a^{b \ \bmod \ φ(m)}, & \gcd(a,m) = 1,\\\\a^b, & \gcd(a,m) \neq 1, b < φ(m),\\\\a^{(b \ \bmod \ φ(m))+φ(m)}, & \gcd(a,m) \neq 1,b \geq φ(m). \end{cases} \pmod{m} \]證明見OI Wiki
莫比烏斯函式
定義
我們把一個數字分解質因數為 \(n=p_1^{c_1}p_2^{c_2} \cdots p_k^{c_k}\),則
\[μ(n)= \begin{cases} 1 & n=1 \\\\ 0 & \forall i \in [1,k] , c_i > 1 \\\\ (-1)^k & \forall i \in [1,k] , c_i = 1 \end{cases} \]解釋一下:
- 當 \(n=1\) 時, \(μ(n)=1\);
- 當 \(n \neq 1\) 時:
- 當存在 \(i\in [1,k]\),使得 \(c_i > 1\) 時,\(μ(n)=0\),也就是說只要某個質因子出現的次數超過一次,\(μ(n)\) 就等於 \(0\);
- 當任意 \(i\in[1,k]\),都有 \(c_i=1\) 時,\(μ(n)=(-1)^k\),也就是說每個質因子都僅僅只出現過一次時,\(μ(n)\) 等於 \(-1\) 的 \(k\) 次冪,此處 \(k\) 指的便是僅僅只出現過一次的質因子的總個數。
性質
莫比烏斯函式不僅是積性函式,還有如下性質:
\[\sum_{d|m} μ(d) = [m==1] \]其中 \([m==1]\) 代表 m==1?1:0
。
證明
設
\[n=\prod_{i=1}^k{p_i}^{c_i},n'=\prod_{i=1}^k p_i \]那麼
\[\sum_{d\mid n}μ(d)=\sum_{d\mid n'}μ(d)=\sum_{i=0}^k C_k^i·(-1)^i=(1+(-1))^k \]莫比烏斯反演
如果兩個的函式 \(f(n)\) 與 \(g(n)\) 滿足
\[f(n) = \sum_{d|n} g(d) \]則
\[g(n) = \sum_{d|n} μ(d) f(\frac{n}{d}) \]證明
{% note info 摘自《混凝土數學》 %}
充分性
\[\begin{align} f(n) &= \sum_{d|n} g (d)\\\\ &= \sum_{d|n} g (\frac{n}{d}) \end{align} \] \[\sum_{d|n} μ(d) f(\frac{n}{d}) = \sum_{d|n} μ(d) \sum_{d_1|\frac{n}{d}} g(d_1) \] \[\begin{align} \sum_{d|n} \sum_{d_1|\frac{n}{d}} μ(d) g (d_1) &= \sum_{d_1|n} g(d_1) \sum_{d|\frac{n}{d_1}} μ(d) \\\\ &= g(n) \end{align} \]考慮到
\[\sum_{d|\frac{n}{d_1}} μ(d) = \begin{cases} 1 & d_1 = n \\\\ 0 & d_1 < n \end{cases} \]因此
\[\begin{align} g(n) &= \sum_{d|n} μ(d) f(\frac{n}{d}) \\\\ &= \sum_{d|n} μ(\frac{n}{d}) f(d) \end{align} \]必要性
\[\begin{align} g(n) &= \sum_{d|n} μ(d) f(\frac{n}{d}) \\\\ &= \sum_{d|n} μ(\frac{n}{d}) f(d) \end{align} \] \[\begin{align} \sum_{d|n} g(d) &= \sum_{d|n}g(\frac{n}{d}) \\\\ &= \sum_{d|n} \sum_{d_1|\frac{n}{d}} μ(\frac{n}{d d_1})f(d_1) \\\\ &= \sum_{d d_1|n} μ(\frac{n}{d d_1}) f(d_1) \\\\ &= \sum_{d_1|n} f(d_1) \sum_{d|\frac{n}{d}} μ(\frac{n}{d d_1}) \\\\ &= f(n) \end{align} \]考慮到
\[\begin{align} \sum_{d|\frac{n}{d_1}} μ(\frac{n}{d d_1}) &= \sum_{d|\frac{n}{d_1}} μ(d) \\\\ &= \begin{cases} 1 & d_1 = n \\\\ 0 & d_1 < n \end{cases} \end{align} \]因此
\[\begin{align} f(n) &= \sum_{d|n} g(d) \\\\ &= \sum_{d|n} g(\frac{n}{d}) \end{align} \]{% endnote %}
求莫比烏斯函式的值
單點求值
自己算。
區間篩法
void getMu()
{
mu[1] = 1;
for(int i = 2; i <= n; ++i)
{
if(!flg[i]) p[++tot] = i, mu[i] = -1;
for(int j = 1; j <= tot && i * p[j] <= n; ++j)
{
flg[i * p[j]] = 1;
if(i % p[j] == 0)
{
mu[i * p[j]] = 0;
break;
}
mu[i * p[j]] = -mu[i];
}
}
}
莫比烏斯變換
設 \(f(n)\),\(g(n)\) 為兩個數論函式。
如果有 \(f(n) = \sum_{d|n} g(d)\) 那麼有:
形式1: \(g(n) = \sum_{d|n} μ(d) f(\frac{n}{d})\)。
這種形式下,函式 \(f(n)\) 被稱為函式 \(g(n)\) 的莫比烏斯變換,反之則稱之為其的莫比烏斯逆變換(反演)。
形式2: \(g(n) = \sum_{d|n} μ(\frac{d}{n}) f(d)\)。
據說這種形式更常考一點。
證明
- 方法一:對原式做數論變換。
用 \(\displaystyle\sum_{d\mid n}g(d)\) 來替換 \(f(\dfrac{n}{d})\),再變換求和順序。最後一步變換的依據:\(\displaystyle\sum_{d\mid n}μ(d)=[n=1]\),因此在 \(\dfrac{n}{k}=1\) 時第二個和式的值才為 \(1\)。此時 \(n=k\),故原式等價於 \(\displaystyle\sum_{k\mid n}[n=k]\cdot g(k)=g(n)\)
- 方法二:運用卷積。
原問題為:已知 \(f=g * 1\),證明 \(g=f * μ\)
易知如下轉化:\(f * μ=g * 1 * μ\implies f * μ=g\)(其中 \(1 * μ=ε\))。
對於第二種形式:
類似上面的方法一,我們考慮逆推這個式子。
\[\begin{align} & \sum_{n|d}{μ(\frac{d}{n})f(d)} \\\\ =& \sum_{k=1}^{+\infty}{μ(k)f(kn)} \\\\ =& \sum_{k=1}^{+\infty}{μ(k)\sum_{kn|d}{g(d)}} \\\\ =& \sum_{n|d}{g(d)\sum_{k|\frac{d}{n}}{μ(k)}} \\\\ =& \sum_{n|d}{g(d)ε(\frac{d}{n})} \\\\ =& g(n) \end{align} \]我們把 \(d\) 表示為 \(kn\) 的形式,然後把 \(f\) 的原定義代入式子。
發現列舉 \(k\) 再列舉 \(kn\) 的倍數可以轉換為直接列舉 \(n\) 的倍數再求出 \(k\),發現後面那一塊其實就是 \(ε\), 整個式子只有在 \(d=n\) 的時候才能取到值。
參考文獻
《混凝土數學》
OI Wiki