本文的目標
- 記錄從最基礎的數論知識到高級的應用的所有算法。
- 盡量提供每一種算法的證明,包括正確性和復雜度。
- 做到絕對的嚴謹,同時力求簡明扼要,簡潔美觀。
0.數論基礎
整除:
對於 \(a,b\in\mathbb{Z},(a\ne 0)\),若有 \(\frac{b}{a}\in\mathbb{Z}\),則 \(a\) 整除 \(b\),記作 \(a|b\)。
這時稱 \(a\) 是 \(b\) 的因數,\(b\) 是 \(a\) 的倍數。
每連續的 \(\left|a\right|\) 個整數中有且只有一個是 \(a\) 的倍數。
\(0\) 是任何整數的倍數,\(\pm 1\) 是任何整數的因數。
整除的基本性質:
若 \(a|b\),且 \(a|c\),則 \(a|b+c\)。
若 \(a|b\),則 \(a|bx\),對 \(x\in\mathbb{Z}\)。
結合以上兩條:若 \(a|b_1,a|b_2,\cdots,a|b_n\),則 \(a|b_1x_1+b_2x_2+\cdots+b_nx_n\),對 \(x_1,x_2,\cdots,x_n\in\mathbb{Z}\)。
帶余除法:
對於 \(a,b\in\mathbb{Z},(b\ne 0)\),則定義:\(a\) 除以 \(b\) 的商為 \(q\),余數為 \(r\)。
並滿足 \(q\times b+r=a,(q,r\in\mathbb{Z},0\leq r<\left|b\right|)\)。
對於唯一的 \(a,b\),這樣的表示也是唯一的。
證明:
- 在 \(\left(a-\left|b\right|,a\right]\) 中,有連續的 \(\left|b\right|\) 個整數,其中恰有一個是 \(b\) 的倍數。
- 則令這個數為 \(x\),那么 \(q,r\) 有唯一表示:\(q=\frac{x}{b},r=a-x\)。
模和同余:
對於 \(a,b\in\mathbb{Z},(b\ne 0)\),則定義:\(a\) 對 \(b\) 的模等於 \(a\) 除以 \(b\) 的余數,記作 \(a\bmod b\)。
對於 \(a,b,m\in\mathbb{Z},(m\ne 0)\),滿足 \(a\bmod m=b\bmod m\),則稱 \(a\) 與 \(b\) 模 \(m\) 同余,記作 \(a\equiv b\pmod{m}\)。
\(a\equiv 0\pmod{m}\) 等價於 \(m|a\)。
模運算的性質:
對加法,減法,乘法的分配律:
\(\left(a\bmod m\right)\pm\left(b\bmod m\right)\equiv a\pm b\pmod m\)。
\(\left(a\bmod m\right)\times\left(b\bmod m\right)\equiv a\times b\pmod m\)。
正整數的正因數:
對於 \(a\in\mathbb{Z}^+\),定義 \(a\) 的正因數為所有 \(d|a\) 的正整數 \(d\) 的集合。
對於 \(a\) 的一個正因數 \(d\),必有另一個正因數 \(\frac{a}{d}\) 與其對應。
也就是說,正因數是成對出現的。
而又因為 \(min(d,\frac{a}{d})\leq\sqrt{a}\),這說明了只需要枚舉 \(\left[1,\left\lfloor\sqrt{n}\right\rfloor\right]\) 中的整數就可以確定正整數 \(n\) 所有的因數。
同時也揭示了一個正整數 \(n\) 的正因數個數不超過 \(2\sqrt{n}\)。
公因數:
對於 \(a,b\in\mathbb{Z}\):
如果存在 \(c\in\mathbb{Z}\),使得 \(c|a\),並且 \(c|b\),則稱 \(c\) 是 \(a\) 和 \(b\) 的一個公因數。
\(a,b\) 的最大公因數記作 \((a,b)\),為了避免混淆,有時記作 \(\gcd(a,b)\)。
\(0,0\) 的最大公因數未定義,下列討論中也避免 \(\gcd(0,0)\) 的出現。
因為 \(1\) 是任何數的因數,所以 \((a,b)\geq 1\) 一定是正整數。
對於 \(n(n\geq 2)\) 個整數 \(a_1,a_2,\cdots,a_n\),它們的最大公因數記作 \((a_1,a_2,\cdots,a_n)=((a_1,a_2,\cdots,a_{n-1}),a_n)\) 通過遞歸定義。
最大公因數有交換律:\((a,b)=(b,a)\),和結合律:\((a,b,c)=((a,b),c)=(a,(b,c))\)。
若 \((a,b)=1\),則稱 \(a,b\) 互質,有時用記號 \(a\perp b\) 表示。
若 \((a_1,a_2,\cdots,a_n)=1\),則稱 \(a_1,a_2,\cdots,a_n\) 互質,但未必兩兩互質。
公倍數:
類比公因數,可以定義公倍數的概念:
對於 \(a,b\in\mathbb{Z},(a,b\ne 0)\):
如果存在 \(c\in\mathbb{Z}\),使得 \(a|c\),並且 \(b|c\),則稱 \(c\) 是 \(a\) 和 \(b\) 的一個公倍數。
\(a,b\) 的公倍數中的最小正值稱為 \(a,b\) 的最小公倍數,記作 \([a,b]\),為了避免混淆,有時記作 \(\operatorname{lcm}(a,b)\)。
因為 \(a|ab\) 和 \(b|ab\),所以 \(0<[a,b]\leq ab\)。
對於 \(n(n\geq 2)\) 個整數 \(a_1,a_2,\cdots,a_n\),它們的最小公倍數記作 \([a_1,a_2,\cdots,a_n]=[[a_1,a_2,\cdots,a_{n-1}],a_n]\) 通過遞歸定義。
最小公倍數有交換律:\([a,b]=[b,a]\),和結合律:\([a,b,c]=[[a,b],c]=[a,[b,c]]\)。
最小公倍數和最大公因數有關系:\((a,b)\times [a,b]=a\times b\) ,即 \(a\times b\div (a,b)=[a,b]\)。
這也可以推出 \([a,b]=a\times b\) 等價於 \(a,b\) 互質。
質數:
如果一個正整數只有 \(2\) 個正因數,那么稱其為質數。
如果一個正整數有超過 \(3\) 個正因數,那么稱其為合數。
\(1\) 不是質數也不是合數。
對於一個正整數來說,因為 \(1\) 和這個正整數本身都是這個正整數的因數;
所以質數也可以表示為大於 \(1\) 的且只能被 \(1\) 和本身整除的正整數。
最開始的幾個質數為:\(2,3,5,7,11,13,17,19,\cdots\)。
\(2\) 是唯一的偶質數,因為比 $2$ 大的偶數 $a$ 都有 $1,2,a$ 等至少 $3$ 個不同的正因數,是合數。
每一個合數都有質因數,證明:
- 假設有的合數沒有質因數,那么設其中最小的一個為 \(P\)。
- 因為 \(P\) 是合數,所以可以分解成 \(P=a\times b(a,b\in\mathbb{Z},a,b>1)\) 的形式。
- 如果 \(a\) 是質數,那么 \(P\) 有質因數,與假設矛盾。
- 否則因為 \(1<a<P\) 是合數,那么 \(a\) 有質因數,設 \(a=p\times x\),\(p\) 是質數。
- 那么 \(P=p\times xb\),有質因數 \(p\),與假設矛盾。
- 所以每一個合數都有質因數。
質數有無窮多個,證明:
- 假設質數沒有無窮多個,有限多的 \(k\) 個質數從小到大排列為 \(\left\{p_1,p_2,p_3,\cdots,p_k\right\}\)。
- 那么令 \(P=(\prod_{i=1}^{k}p_i)+1\)。
- 則對於所有的 \(1\leq i\leq k\),都有 \(p_i\!\!\not|P\)。
- 因為 \(P>1\),所以 \(P\) 不是質數就是合數。
- 如果 \(P\) 是質數,則找到了一個新的質數,與假設矛盾。
- 如果 \(P\) 是合數,則 \(P\) 除了 \(1\) 和本身之外還有別的因數,但是 \(P\) 卻沒有已知的所有質因數,那么找到了一個新的質數,與假設矛盾。
- 所以質數有無窮多個。
裴(pěi)蜀(shǔ)定理:
對於 \(a,b\in\mathbb{Z}\),一定有 \((a,b)\) 是集合 \(\left\{ax+by|x,y\in\mathbb{Z}\right\}\) 中的最小正元素,這個集合也叫做 \(a,b\) 的線性組合集。
證明:
- 設集合 \(\left\{ax+by|x,y\in\mathbb{Z}\right\}\) 中的最小正元素為 \(s\),那么有 \(s=ax+by\)。
- 設 \(q=\left\lfloor\frac{a}{s}\right\rfloor\),則 \(a\bmod s=a-qs=a-q(ax+by)=a(1-qx)+b(-qy)\)。這說明了 \(a\bmod s\) 也是這個線性組合集中的元素。
- 又因為 \(0\le a\bmod s<s\),而 \(s\) 是集合中的最小正元素,所以 \(a\bmod s=0\),即 \(s|a\)。
- 同理,\(s|b\)。因此,\(s\) 是 \(a,b\) 的一個公因數。所以 \(s\leq(a,b)\)。
- 因為 \((a,b)\) 能整除 \(a\) 和 \(b\),並且 \(s=ax+by\),所以有 \((a,b)|s\)。又因為 \(s>0\),所以有 \((a,b)\leq s\)。
- 又因為 \(s\leq(a,b)\),所以 \(s=(a,b)\)。
推論:若 \(d|a\) 且 \(d|b\),則 \(d|(a,b)\),因為 \((a,b)\) 是 \(a\) 和 \(b\) 的一個線性組合。
輾轉相除法求最大公因數:
現有兩整數 \(a,b\in\mathbb{Z}\),要求它們的最大公因數。
首先,\((a,b)=(|a|,|b|)\)。所以將問題轉化為 \(a,b\geq 0\)。
又因為 \((0,x)=(x,0)=|x|\),所以將問題轉化為 \(a,b>0\)。
因為 \((a,b)=(b,a)\),不妨設 \(a\geq b\)。
- 令 \(a\) 對 \(b\) 的模為 \(r\),則有 \(0\leq r<b\)。轉到2。
- 如果 \(r=0\),則 \(b|a\),所以 \((a,b)=b\),結束。否則轉到3。
- 令 \(a=b\),\(b=r\),轉到1。
這樣的過程會在有限步內結束,因為每一次回到步驟1時,\(b\) 的值都相較上一次小。
但它為什么是對的呢?證明:
- 有 \(a,b\in\mathbb{Z}^+\)。令 \(a\) 除以 \(b\) 的商是 \(q\),余數是 \(r\),\(d=(a,b)\)。
- 若 \(r=0\),則結束,答案正確。
- 若 \(r\neq 0\),則有 \(d|a\),\(d|b\)。那么設 \(a=Ad,b=Bd(A,B\in\mathbb{Z}^+)\)。
- 那么因為 \(qb+r=a\),有 \(r=a-qb=Ad-qBd=(A-qB)d\)。所以 \(d|r\)。
- 又因為 \(d|b\),所以 \(d\) 是 \(b,r\) 的一個公因數,\(d|(b,r)\),即 \((a,b)|(b,r)\)。
- 同時,設 \(e=(b,r)\),即 \(e|b\),\(e|r\)。那么 \(e|qb+r\) 即 \(e|a\)。
- 所以 \(e|(a,b)\),即 \((b,r)|(a,b)\)。又因為 \((a,b)|(b,r)\),所以有 \((a,b)=(b,r)\)。
- 所以我們把求解 \((a,b)\) 轉化為了求解 \((b,r)\),證畢。
而且,輾轉相除法求最大公因數的算法的時間復雜度也很優越。
為 \(\mathcal{O}(\log a+\log b)=\mathcal{O}(\log ab)=\mathcal{O}(\log\max(a,b))\),證明:
- 設過程中 \(a\geq b\)。
- 那么 ①若 \(b\leq a<2b\),則 \(a\bmod b=a-b<\frac{a}{2}\)。
- ②若 \(a\geq 2b\),則 \(a\bmod b<b\leq\frac{a}{2}\)。
- 因此每次遞歸中,較大的那個數至少要減半。
- 所以復雜度在對數級別。
- 這里用到了對比自己小的數取模后,數的大小會至少減半的結論,這個結論在很多地方都能用到。
實際上復雜度可以更緊地表示為 \(\mathcal{O}(\log\min(a,b))\),因為只要做不超過 \(2\) 次迭代,就能得到 \(\max(a',b')\le\min(a,b)\)。
代碼實現(遞歸版):
int gcd (int a, int b) { return b ? gcd(b, a % b) : a; }
代碼實現(循環版):
int gcd (int a, int b) { if (!b) return a; static int t; while (t = a % b) a = b, b = t; return b; }
另外,在 C++ 中有函數 __gcd(x, y) 可以求出正整數 \(x\) 和 \(y\) 的最大公因數,對於在 long long 范圍內的數也有效。
擴展歐幾里得算法:
輾轉相除法也叫歐幾里得算法,因為它最早被公元前300年的古希臘數學家歐幾里得在他的著作《幾何原本》中提出。
接下來介紹它的擴展形式:鏈接【待補】。
算術基本定理(唯一因子分解定理):
定理:
- 設 \(a\in\mathbb{Z}^+\),且 \(a\geq 2\),則存在唯一一組質數 \(p_1<p_2<\cdots<p_n\) 與唯一一組正整數 \(e_1,e_2,\cdots,e_n\),使得 \(a=p_1^{e_1}p_2^{e_2}\cdots p_n^{e_n}\)。
- 此式稱為正整數 \(a\) 的標准分解式。
證明:
- 先證存在性,用數學歸納法:
- 當 \(a=2\) 時,結論成立。
- 假設對於一切小於 \(a(a\in\mathbb{Z}^+,a>2)\) 的正整數,結論都成立。
- 若 \(a\) 是素數,則結論成立。
- 若 \(a\) 是合數,則存在 \(b,c\in\mathbb{Z}^+\),且 \(b,c\geq 2\),使得 \(a=bc\)。
- 所以有 \(1<b,c<a\)。根據歸納假設,有:
- \(b=q_1^{s_1}q_2^{s_2}\cdots q_r^{s_r}\)。
- \(c=r_1^{t_1}r_2^{t_2}\cdots r_l^{t_l}\)。
- 其中 \(q_1,q_2,\cdots,q_r,r_1,r_2,\cdots,r_l\) 都是質數,\(s_1,s_2,\cdots,s_r,t_1,t_2,\cdots,t_l\in\mathbb{Z}^+\)。
- 將它們相乘,即得到 \(a\) 的標准分解式。
- 再證唯一性:
- 設另有一組素數 \(q_1<q_2<\cdots<q_m\) 以及正整數 \(k_1,k_2,\cdots,k_m\),使得 \(a=q_1^{k_1}q_2^{k_2}\cdots q_m^{k_m}\)。
- 因為 \(p_1,p_2,\cdots,p_n\) 和 \(q_1,q_2,\cdots,q_m\) 都是 \(a\) 的全部質因數。所以 \(n=m\)。
- 又因為 \(p_1\) 和 \(q_1\) 都是 \(a\) 的最小質因數,所以 \(p_1=q_1\),並且 \(e_1=k_1\)。
- 所以存在 \(a'<a\),有 \(a'=p_2^{e_2}\cdots p_n^{e_n}=q_2^{k_2}\cdots q_m^{k_m}\)。
- 那么重復上述過程,有 \(p_1=q_1,p_2=q_2,\cdots,p_n=q_m\) 和 \(e_1=k_1,e_2=k_2,\cdots,e_n=k_m\)。
引申結論:
對於 \(a,b\in\mathbb{Z}^+\),則存在一組素數 \(p_1<p_2<\cdots<p_n\) 與兩組非負整數 \(\alpha_1,\alpha_2,\cdots,\alpha_n\) 和 \(\beta_1,\beta_2,\cdots,\beta_n\),使得 \(a=p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_n^{\alpha_n}\),和 \(b=p_1^{\beta_1}p_2^{\beta_2}\cdots p_n^{\beta_n}\)。
這意味着有必要時可以在標准分解式中插入素數0次冪。
那么有:
\((a,b)=p_1^{\min(\alpha_1,\beta_1)}p_2^{\min(\alpha_2,\beta_2)}\cdots p_n^{\min(\alpha_n,\beta_n)}\) 和
\([a,b]=p_1^{\max(\alpha_1,\beta_1)}p_2^{\max(\alpha_2,\beta_2)}\cdots p_n^{\max(\alpha_n,\beta_n)}\)。
據此也可以推出 \((a,b)\times [a,b]=a\cdot b\)。
引申結論的證明:
先證明一個引理:\(d=(a,b)\) 當且僅當 \(d|a, d|b\) 且不存在 \(kd|a, kd|b\),其中 \(k\in \mathbb{Z}^+, k\ge 2\)。
首先裴蜀定理有結論:若 \(d|a, d|b\),則 \(d|(a,b)\)。
。
一些其他定理:
消去定理:若 \(ac\equiv bc\pmod m\),且 \((c,m)=1\),則 \(a\equiv b\pmod m\)。
證明:
- 先證明引理:若 \(m|ab\),且 \((b,m)=1\),則 \(m|a\)。
因為 \((b,m)=1\),則存在 \(x,y\in\mathbb{Z}\) 使得 \(bx+my=1\) (裴蜀定理)。
兩邊同乘 \(a\),則有 \(abx+amy=a\)。
又有 \(m|ab\),所以存在 \(k\in\mathbb{Z}\) 使得 \(ab=km\)。
代入 \(ab=km\),得 \(kmx+amy=a\),即 \(a=(kx+ay)m\),所以 \(m|a\)。 - 因為 \(ac\equiv bc\pmod m\),所以 \(c(a-b)\equiv 0\pmod m\)
即 \(m|c(a-b)\),因為 \((c,m)=1\),所以 \(m|a-b\),即 \(a\equiv b\pmod m\)。
可以說相當於同余式中的除法了,但是有互質的限制。
1.萬能的取模運算
剩余類:
對於 \(m\in\mathbb{Z}^+\),所有對 \(m\) 的模相同的整數的集合形成一個模 \(m\) 的剩余類。
舉個例子,\(S=\{\cdots,-7,-1,5,11,17,\cdots\}\) 是一個模 \(6\) 的剩余類。
模 \(m\) 的每一個余數對應着一個剩余類,所以模 \(m\) 有 \(m\) 個不同的剩余類。
可以把 \(a\) 所在的剩余類記作 \([a]\)。
剩余系:
對於 \(m\in\mathbb{Z}^+\),一個正整數集可以被稱作一個模 \(m\) 的剩余系當且僅當其中的元素對 \(m\) 的模互不相同。
舉個例子,\(S=\{-2,1,2,9,6\}\) 是一個模 \(6\) 的剩余系。
完全剩余系:
從模 \(m\) 的每個剩余類中各取出一個元素組成的集合是一個模 \(m\) 的完全剩余系,簡稱完系。
換句話說,有 \(m\) 個元素的模 \(m\) 的剩余系是模 \(m\) 的完全剩余系。
典型的完全剩余系是模 \(m\) 的最小非負完全剩余系:\(\{0,1,2,\cdots,m-2,m-1\}\)。
簡化剩余系:
可以發現模 \(m\) 的一個剩余類中的元素與 \(m\) 的最大公因數都相同,這一點可以通過裴蜀定理得到。
從元素與 \(m\) 互質的模 \(m\) 的剩余類中各取出一個元素組成的集合是一個模 \(m\) 的簡化剩余系,簡稱縮系。
典型的簡化剩余系是由 \(1\) 到 \(m\) 之間所有與 \(m\) 互質的整數組成的剩余系。
例:$12$ 的簡化剩余系有 $4$ 個元素,一個典型的例子為為 \(\{1,5,7,11\}\)。
群論基礎:
【待補】
模意義下的加法群:
【待補】
模意義下的乘法群:
【待補】
逆元:
對於模運算,已經給出了它對加法,減法和乘法的性質,與普通的運算相同。
唯獨略去了重要的四則運算:除法。為什么不給出它的性質?
看如下過程:\(3\cdot 3\equiv 2\pmod 7\),但是 \(2\div 3\) 在模 \(7\) 意義下等於多少呢?
注意到 \(2\cdot 5\equiv 3\pmod 7\)。可不可以說明在模 \(7\) 意義下 \(\div 3\) 與 \(\times 5\) 是具有相同性質的呢?
可以發現 \(15\div 3\equiv 5\pmod 7\),即 \(1\div 3\equiv 5\pmod 7\),而 \(1\times 5\equiv 5\pmod 7\)。
還可以有 \(18\div 3\equiv 6\pmod 7\),即 \(4\div 3\equiv 6\pmod 7\),而 \(4\times 5\equiv 6\pmod 7\)。
經過實踐的確可以發現 \(\div 3\) 和 \(\times 5\) 的作用相同。
定義這樣與 \(\div x\) 作用相同的 \(\times y\) 為 \(x\) 的逆元,記作 \(y=x^{-1}\)。比如 \(5\) 在模 \(7\) 意義下是 \(3\) 的逆元。
又有 \(3\times 5\equiv 1\pmod 7\)。即一個數的逆元和這個數相乘在模意義下等於 \(1\)。
那么同理,\(3\) 也是 \(5\) 的逆元。逆元是成對的,\(1\) 的逆元是 \(1\)。
有的數在模特定數下沒有逆元,比如 \(2\times 3\equiv 0\pmod{6}\),而 \(0\) 乘任何數都不會等於 \(2\) 或 \(3\),那么 \(2\) 和 \(3\) 在模 \(6\) 意義下沒有逆元。
更具體的,在 \(\bmod m\) 意義下,如果 \(\gcd(a,m)=1\),即 \(a,m\) 互質,則 \(a\) 存在逆元。
如果模的數為質數,那么所有非 \(0\) 的數都有逆元。
費馬小定理:
對於 \(a\in\mathbb{Z},p\text{是質數},a\not\equiv 0\pmod p\),有 \(a^{p-1}\equiv 1\pmod p\)。
證明:【待補】
模意義下的除法群: