OI 學習筆記 (1):數論
0x00 前言
本文(可能)包含的內容:
- 學習數論的前置知識
- 各類數論函式與其性質(和證明)
- 如何使用各類篩求積性函式值
- 在 OI 題目中的應用
參考資料:
- 論文 ALGEBRAIC AND ANALYTIC PROPERTIES OF ARITHMETIC FUNCTIONS
- 演算法學習筆記(18):尤拉函式
- 演算法學習筆記(36): 莫比烏斯反演
- OI Wiki 篩法
- OI Wiki 杜教篩
閱讀本文您應該有初中數學水平,如果沒有建議閱讀初一至初三的數學書。
如果文中有數學記號或專有名詞您不懂其意思,請看 0xF0 附件。
0x01 數學雜項
狄利克雷卷積
定義:對於兩個數論函式 \(f,g\)
性質:兩個積性函式 \(f,g\) 的狄利克雷卷積也是積性函式。
證明:設 \(h\) 為 \(f,g\) 的狄利克雷卷積,即 \(h(n)=\sum\limits_{d|n}f(n)g(\frac{n}{d})\),\(gcd(x,y)=1\)
\[\begin{aligned} h(x)h(y) &= \sum_{i|x} f(i) g(\frac{x}{i}) \sum_{j|y} f(j) g(\frac{y}{j}) \newline &= \sum_{i|x} \sum_{j|y} f(i) f(j) g(\frac{x}{i}) g(\frac{y}{j}) \newline &= \sum_{i|x} \sum_{j|y} f(ij) g(\frac{xy}{ij}) \newline &= \sum_{d|xy} f(d) g(\frac{xy}{d}) \newline &= h(xy) \end{aligned} \]證畢。
0x10 數論函式
本 part 記錄了幾種常見的數論函式及其性質(和證明),有一些過於簡單的會放在 0xF2 中。
0x11 尤拉函式
尤拉函式,符號為 \(\varphi\),意為 \(\varphi(n)=\sum\limits_{i=1}^{n-1}[\gcd(i,n)=1]\),即所有小於 \(n\) 的數中有幾個數和 \(n\) 互質。
接下來是性質(和證明),設 \(p \in prime\)
性質1: \(\varphi(p)=p-1\),證明顯然。
性質2:\(\varphi(p^k)=p^k-p^{k-1}\quad(k \in \mathbb{Z+})\)
證明:\(p^k\)
\(p,2p,3p,\cdots,(p^{k-1}-1)p\),一共有 \(p^{k-1}-1\) 個數。
於是在 \(1 \sim p^k-1\) 中,與 \(p^k\) 互質的數的個數為 \((p^k-1)-(p^{k-1}-1)=p^k-p^{k-1}\)。
證畢。
性質3:\(\varphi(ax)=a\varphi(x)\quad(a|x)\)
性質4:\(\varphi(x)\varphi(y)=xy\quad (\gcd(x,y)=1)\),所以尤拉函式是積性函式。
性質5:設 \(n\) 的質因數分解為 \(\prod\limits_{i=1}^mp_i^{a_i}\),那麼 \(\varphi(n)=n\prod\limits_{i=1}^m(1-\frac{1}{p_i})\)
性質6:\(\sum\limits_{d|n}\varphi(d)=n\)
證明:設 \(f(n)=\sum\limits_{d|n}\varphi(d)\),當 \(gcd(x,y)=1\) 時:
\[\begin{aligned} f(x)f(y) &= \sum_{i|x}\varphi(i) \times \sum_{j|y}\varphi(j)\newline &= \sum_{i|x} \sum_{j|y} \varphi(i) \varphi(j)\newline &= \sum_{i|x} \sum_{j|y} \varphi(i \times j)\newline &= \sum_{d|xy} \varphi(d)\newline &= f(xy) \end{aligned} \]所以 \(f\) 是積性函式,那麼設 \(n\) 的質因數分解為 \(\prod\limits_{i=1}^mp_i^{a_i}\),由 \(f\) 是積性函式可得:
\[f(n) = \prod_{i=1}^mf(p_i^{a_i}) \]由性質2,可得 \(f(p^c)=\varphi(1)+\varphi(p)+\varphi(p^2)+\cdots+\varphi(p^c)=1+(p-1)+(p^2-p)+\cdots+(p^c-p^{c-1})=p^c\)
所以 \(f(n)=\prod_{i=1}^mf(p_i^{a_i})=\prod_{i=1}^mp_i^{a_i}=n\)
原命題得證。
證畢。
0x12 莫比烏斯函式
莫比烏斯函式,符號為 \(\mu\),定義如下:
\[\left\lbrace \begin{aligned} 1 & & n=1 \newline (-1)^m & & n=\prod\limits_{i=1}^mp_i^{a_i},a_{1\sim n}=1 \newline 0 & & otherwise \newline \end{aligned} \right. \]性質1:\(\mu(x)\mu(y)=\mu(xy)\quad(\gcd(x,y)=1)\)
證明:如果 \(x = 1\) 或 \(y = 1\),顯然。
如果 \(\mu(x) = 0\) 或 \(\mu(y) = 0\),顯然。
否則 \(\mu(x) \mu(y) = (-1)^{m_x} (-1)^{m_y} = (-1)^{m_x+m_y} = \mu(xy)\)
證畢。
性質2:\(\sum\limits_{d|n}\mu(d)=\epsilon(n)\)
證明:與尤拉函式的性質6證明類似。
0x20 篩法
本 part 記錄了幾種常見的篩法篩積性函式和素數的方法。
0x21 埃拉託斯特尼篩法(埃氏篩)
篩質數
考慮如果一個數 \(x\) 是合數,那麼 \(x\) 的倍數也是合數,所以如果我們從小到大考慮每個數,然後同時把當前這個數的所有(比自己大的)倍數記為合數,那麼執行結束的時候沒有被標記的數就是素數了。
CI N = 2e5; bool Mx[N + 5];
void Eratosthenes (int n) {
RI i, j; Mx[1] = 1; for (i = 2; i <= n; ++ i) if (! Mx[i]) for (j = 2; i * j <= n; ++ j) Mx[i * j] = 1;
}
時間複雜度 \(O(n\log\log n)\)
0x22 線性篩(尤拉篩)
考慮到埃氏篩一個合數可能被篩多遍,如果省掉無意義的步驟,複雜度就降為 \(O(n)\) 了。
篩質數
CI N = 2e5; int P[N + 5], Nt; bool Mx[N + 5];
void Euler (int n) {
RI i, j; for (i = 2; i <= n; ++ i) for (! Mx[i] && (P[++ Nt] = i), j = 1; j <= Nt && i * P[j] <= n; ++ j) if (Mx[i * P[j]] = 1, ! (i % P[j])) break;
}
篩尤拉函式
根據尤拉函式的如下性質:
- \(\varphi(p)=p-1\quad(p \in prime)\)
- \(\varphi(x\times p)=\varphi(x)\times p\quad(p\mid x)\)
- \(\varphi(x\times p)=\varphi(x)\times(p-1)\quad(\gcd(p,x)=1)\)
可以在篩質數的同時篩出尤拉函式。
CI N = 1e5; int P[N + 5], Pt, phi[N + 5], n; bool Mx[N + 5];
void C (int d)
{
RI i, j; phi[1] = 1; for (i = 2; i <= d; ++ i) for (! Mx[i] && (P[++ Pt] = i, phi[i] = i - 1), j = 1; j <= Pt && i * P[j] <= d; ++ j) {
if (Mx[i * P[j]] = 1, ! (i % P[j]) && (phi[P[j] * i] = phi[i] * P[j], 1)) break;
else phi[i * P[j]] = phi[i] * (P[j] - 1);
}
}
篩莫比烏斯函式
CI N = 1e5; int P[N + 5], Pt, mu[N + 5], n; bool Mx[N + 5];
void C (int d)
{
RI i, j; mu[1] = -1; for (i = 2; i <= d; ++ i) for (! Mx[i] && (P[++ Pt] = i, mu[i] = -1), j = 1; j <= Pt && i * P[j] <= d; ++ j) {
if (Mx[i * P[j]] = 1, ! (i % P[j]) && (mu[P[j] * i] = 0, 1)) break;
else mu[i * P[j]] = -mu[i];
}
}
0x30 例題
P2158 [SDOI2008] 儀仗隊
思路
顯然,如果一個座標 \((x,y)\),\(\gcd(x,y) \ne 1\),那麼這個點一定會被 \((\frac{x}{\gcd(x,y)},\frac{y}{\gcd(x,y)})\) 這個點擋住。那麼,這個式子就很顯然了:
\[\sum_{x=1}^n \sum_{y=1}^n [\gcd(x,y)=1] \]這個式子可以拆成三部分:
\[\sum_{x=1}^n \sum_{y=1}^{x-1} [\gcd(x,y)=1] + \sum_{x=1}^n \sum_{y=x}^{x} [\gcd(x,y)=1] + \sum_{x=1}^n \sum_{y=x+1}^{n} [\gcd(x,y)=1] \]其中因為對於所有 \((x,x)\) 的點,都會被 \((2,2)\) 擋住,所以中間這部分為 \(1\)。由影象可知,式子前後兩部分是對稱的,所以這個式子可以化簡為:
\[2\sum_{x=1}^n \sum_{y=1}^{x-1} [\gcd(x,y)=1] + 1 \]而 \(\sum_{y=1}^{x-1} [\gcd(x,y)=1]\) 這部分剛好是 \(\varphi\) 的定義,所以最終式子為:
\[2\sum_{x=1}^n \varphi(x) + 1 \]可以先線性篩篩出 \(1 \sim n\) 的尤拉函式,然後 \(O(n)\) 統計答案。
P2398 GCD SUM
\[\sum_{i=1}^n \sum_{j=1}^n \gcd(i,j)\qquad (0) \]通過尤拉函式的性質,可以將這個式子化簡為:
\[\begin{aligned} (0) &= \sum_{i=1}^n \sum_{j=1}^n \sum_{d | gcd(i,j)} \varphi(d)\newline &= \sum_{i=1}^n \sum_{j=1}^n \sum_{d | i,d | j} \varphi(d)\newline &= \sum_{i=1}^n \sum_{j=1}^n \sum_{d=1}^n \varphi(d) [d | i] [d | j]\newline &= \sum_{d=1}^n \varphi(d) \sum_{i=1}^n \sum_{j=1}^n [d | i] [d | j]\newline &= \sum_{d=1}^n \varphi(d) \lfloor \frac{n}{d} \rfloor^2 \end{aligned} \]這樣就可以 \(O(n)\) 解決問題了,可以再套一個整除分塊,但是 \(n \le 10^5\),所以沒必要。
P3455 [POI2007]ZAP-Queries
假設 \(b \ge a\),那麼題目顯然讓我們求
\[\sum_{i=1}^a \sum_{j=1}^b [\gcd(i,j) = x] \]將 \(x\) 除掉,得:
\[\sum_{i=1}^{\lfloor\frac{a}{x}\rfloor} \sum_{j=1}^{\lfloor\frac{b}{x}\rfloor} [\gcd(i,j) = 1] \]根據莫比烏斯函式的性質,得:
\[\sum_{i=1}^{\lfloor\frac{a}{x}\rfloor} \sum_{j=1}^{\lfloor\frac{b}{x}\rfloor} \sum_{d|\gcd(i,j)} \mu(d) \]將 \(d\) 改為列舉 \(d\) 的形式,得:
\[\sum_{i=1}^{\lfloor\frac{a}{x}\rfloor} \sum_{j=1}^{\lfloor\frac{b}{x}\rfloor} \sum_{d=1}^{\lfloor\frac{a}{x}\rfloor} \mu(d) [d | \gcd(i,j)] \]發現 \(\sum\limits_{d=1}^{\lfloor\frac{a}{x}\rfloor} \mu(d)\) 可以提到前面去,得:
\[\sum_{d=1}^{\lfloor\frac{a}{x}\rfloor} \mu(d) \sum_{i=1}^{\lfloor\frac{a}{x}\rfloor} \sum_{j=1}^{\lfloor\frac{b}{x}\rfloor} [d | \gcd(i,j)] \]如果 \([d | \gcd(i,j)] = 1\),那麼 \(i,j\) 都要是 \(d\) 的倍數,於是得:
\[\sum_{d=1}^{\lfloor\frac{a}{x}\rfloor} \mu(d) \lfloor\frac{a}{xd}\rfloor \lfloor\frac{b}{xd}\rfloor \]由於有多組資料,所以套一個整除分塊,複雜度 \(O(T\sqrt n)\),其中 \(T\) 為資料組數,\(n\) 為 \(\min(a,b)\)。
0xF0 附件
0xF1 算式中出現的符號及其含義
符號 | 含義 | 例子 |
---|---|---|
\(x \mid y,x \nmid y\) | 前者為 \(y\) 整除 \(x\),即 \(x\) 是 \(y\) 的因數;後者與前者相反 | \(1 \mid 2,2\mid6 ,4\mid 20,3 \nmid 4,4 \nmid 9\) |
\(\gcd(x,y)\) | \(x\) 和 \(y\) 的最大公因數 | \(\gcd(2,4)=2,\gcd(3,7)=1\) |
\(\sum\) | 求和,具體見例子 | \(\sum\limits_{i=1}^na_i=a_1+a_2+\cdots+a_n,\sum\limits_{d\mid n}d=n的所有因數相加\) |
\(\prod\) | 求積,具體見例子 | \(\prod\limits_{i=1}^n a_i=a_1 \times a_2 \times \cdots \times a_n\) |
\(\forall\) | 所有滿足某條件的數 | \(\forall x\mid y\) 指 \(x\) 的取值範圍為 \(y\) 的因數,或 \(y\) 的因數集合 |
\([A]\) | 如果 \(A\) 為 false,那麼 \([A]=0\);如果 \(A\) 為 true,那麼 \([A]=1\) | \([2\mid 3]=0,[\gcd(2,4)=2]=1,[1=0]=0\) |
\(\lfloor x \rfloor\) | 向下取整 | \(\lfloor 1.2 \rfloor = 1,\lfloor 4.9 \rfloor = 4,\lfloor 5 \rfloor = 5\) |
0xF2 描述中出現的專有名詞或字母含義
- 數論函式: 指在整數集中定義的函式。
- 積性函式:如果數論函式 \(f\),對於滿足 \(\gcd(x,y)=1\) 的 \(\forall x,y\),\(f(x)f(y)=f(xy)\) ,那麼 \(f\) 就是一個積性函式。
- \(\mathbb{Z}\):指整數集,\(\mathbb{Z+}\) 指正整數集。
- \(\epsilon\):單位函式,定義為 \(\epsilon(1)=1,\epsilon(n)=0\quad(n\ge2)\)。
- \(Id\):單位函式,定義為 \(Id(n)=n\)。