本文的目标
- 记录从最基础的数论知识到高级的应用的所有算法。
- 尽量提供每一种算法的证明,包括正确性和复杂度。
- 做到绝对的严谨,同时力求简明扼要,简洁美观。
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\)。
证明:【待补】
模意义下的除法群: