数论
2026 IC 网络赛第二场结束后,E 我们队都没人会做,看了题解感觉自己什么概念都不懂,于是我说,重学一遍数论吧。于是就有了这篇博文。
整除
\(a\mid b,a\nmid b\)
第一遍系统的学习数论,这一遍我选择全部用形象化的描述来描述,对于形式化描述,以后再说吧。
\(a\mid b\) 就是说 \(a\) 是 \(b\) 的因数,\(a\nmid b\) 就是 \(a\) 不是 \(b\) 的因数。
带余除法
就是我们小学学的除法,对于两个整数相除,我们保留余数。比如说
\(a\div b= q...r\)。(\(b\not=0\))这是我们小学就学过的结果。
也就是说,\(a\) 除以 \(b\) 有唯一的一对 \(q,r\) 满足,\(a=bq+r\),这里的 \(q\) 要尽可能的大,满足 \(0\leq r<b\)。
当然还有绝对最小余数的概念,那么就是要让绝对值更小,我们在 \(r\) 的基础上平移就行了。
最大公约数,最小公倍数
由整除里的概念,最大公约数的概念就很显然了,就是说两个数或者多个数,把他们的约数全部列出来,找到中间最大的那个。我们一般用小括号 \((a,b)\) 来表示最大公约数。
最小公倍数也很明显了,就是把每个数的倍数全部列出来,然后在其中找到最小的一个。当然,倍数是列不尽的,但是不妨碍有最小的一个。我们一般用中括号 \([a,b]\) 来表示最小公倍数
如何高效的求最大公约数呢?用到了最大公约数的一个性质。
\((a,b)=(a,b-ca)\),\(b-ca>0,c\in Z\)。
那么我们看到带余除法里的概念,我们可以让 \(b-ca\) 成为 \(b\) 除以 \(a\) 的余数。那么 \((a,b)=(b,a\%b)\)。我们可以反复用这个式子求。
这个方法叫辗转相除法,他的时间复杂度我们应该怎么分析呢?我们只考虑最大的数
如果 \(b>\frac{1}{2}a\)。那么我们考虑两次操作后,\(a\%b\) 又变成了最大的数,而在这种情况下 \(a\% b = a-b<\frac{1}{2}a\)。
如果 \(b<\frac{1}{2}a\),那么由于带余除法的性质,\(a\%b<b\),两次操作后 \(a\%b<\frac{1}{2}a\)。于是总操作次数因该是 \(\mathcal{O}(\log \max(a,b))\) 级别的。
算术基本定理
重看一遍我才知道我一直以来的算术基本定理一直记错了。
算术基本定理:如果 \(p\) 是素数,\(p\mid a_1a_2\) 那么 \(p\mid a_1\) 和 \(p\mid a_2\) 至少有一个成立。
感觉上就很有道理,因为 \(p\) 不可分解,所以他必定要么全部在 \(a_1\) 里,要么全部在 \(a_2\) 里,不可能 \(a_1\) 贡献一点 \(a_2\) 再贡献一点得到。
而我之前一直认为的算术基本定理:其实是算术基本定理的唯一分解定理形式。
对于正整数 \(a\),那么必有唯一表示 \(a=p_1p_2...p_s\) 其中 \(p_j(1\leq j\leq s)\) 是素数。
然后我们把相同的因数合并,那么就有标准素因数分解式
\(a=p_1^{\alpha_1}p_2^{\alpha_2}...p_c^{\alpha_c}\)。
同余
其实就是对于 \(\pmod m\) 下的一些运算。正常加减乘都是符合要求的。我们来看看除法运算。
\(a\equiv b\pmod m\),如果 \(d\mid a,d\mid b\) 那么有 \(\frac{a}{d}\equiv\frac{b}{d}\pmod m\) 吗?
我们可以用带余除法来表示同余式子 \(a=mq_a+r,b=mq_b+r\)。但是 \(\frac{a}{d}=\frac{mq_a}{d}+\frac{r}{d}\) 可能不再是一个合法的带余除法。为什么?因为 \(mq_a\) 一定能整除 \(d\) 吗?不见得。这给我们提供了修改思路。
\(a\equiv b\pmod m,d|a,d|b,d|m\) 那么有 \(\frac{a}{d}\equiv\frac{b}{d}\pmod{\frac{m}{d}}\)。
另外,还有一个不是很显然的但是常见的例子。
\(a,b\in Z\),\(d,m\in \mathbf{N}^*, d\mid m\),\(a\equiv b\pmod m\) 那么有 \(a\equiv b\pmod d\)。
这个可以用上面的式子证明,只需要给同余式左右乘上 \(d\),然后用上面的式子就证明完了。
同余类和剩余系
借用 oiwiki 的描述
对于集合 \(A,B\) 和元素 \(r\),引入以下记号。
\(r+A=\{r+a,a\in A\}\)
\(rA = \{ra,a\in A\}\)
\(A+B=\{a+b,a\in A,b\in B\}\)
\(AB=\{ab,a\in A,b\in B\}\)
同余类的定义就是字面意思,对于某一个类中的数模某一个数(比如说 \(m\))都同余。显然我们把所有整数划分为了 \(m\) 个集合。这 \(m\) 个集合均称为模 \(m\) 的同余类。
这里有两条性质,感觉应该还是比较显然的:
- 对任意整数 \(a\),有 \(a+\textbf{Z}_m=\textbf{Z}_m\)。
- 对任意与 \(m\) 互质的整数 \(b\),\(b\textbf{Z}_m=\textbf{Z}_m\)。
这里还有一个完全剩余系的概念,对于 \(m\) 个整数 \(a_1,a_2,...,a_m\) 如果对于任意的数 \(x\),有且仅有一个数 \(a_i\) 使得 \(x\) 与 \(a_i\) 模 \(m\) 同余,那么这 \(m\) 个整数被称为一个模 \(m\) 的完全剩余系,简称剩余系。
如果这个剩余类里的所有数和 \(m\) 互质,那么这个剩余类被称为既约剩余类。
模 \(m\) 的既约剩余系一共有 \(\varphi(m)\) 个。\(\varphi(m)\) 是 \(m\) 的欧拉函数,关于欧拉函数我们按下不表。后面再谈。
那么类似的,对于任意的满足 \((a,m)=1\) 的 \(a\),有且仅有一个数 \(a_i\) 使得 \(x\) 与 \(a_i\) 模 \(m\) 同余,那么这 \(\varphi(m)\) 个整数被称为模 \(m\) 的一个既约剩余系(简化剩余系)。或者直观的,每个剩余类中取一个数出来,这就是模 \(m\) 的一个简化剩余系。
这里有两个定理
- 如果 \(m=m_1m_2\),令 \(Z_{m_1},Z_{m_2}\) 分别为模 \(m_1,m_2\) 的 完全剩余系,则对任意与 \(m_1\) 互质的 \(a\) 均有 \(Z_m=aZ_{m_1}+m_1Z_{m_2}\)。\(Z_m\) 表示模 \(m\) 的完全剩余系。这个结论可以推广,如果 \(m=\sum\limits_{i=1}^k(\prod\limits_{j=1}^{i-1}m_j)Z_{m_i}\)
如果从直观的角度去理解这个东西,首先我们从前面同余类的性质我们可以知道,任意一个与 \(m_1\) 互质的 \(a\) 去作用于 \(Z_{m_1}\) 得到的结果还是一个 \(Z_{m_1}\)。这个 \(Z_{m_1}\) 就是用来走遍 \(\%m_1\) 的结果的。而后面那个东西就是用来走遍 \(\%m_2\) 的结果的,并且让后面那个东西可以不被 \(m_1\) 所干扰。那么推广的例子也类似。
这个形式化的证明比较简单,且不是特别重要,这里就略过。
- \(m=m_1m_2,1\leq m_1,m_2,(m_1,m_2)=1\)。令 \(Z_{m_1}^*,Z_{m_2}^*\) 分别表示模 \(m_1,m_2\) 的既约剩余系,则:\(Z_m^*=m_2Z_{m_1}^*+m_1Z_{m_2}^*\)
我们先考虑完全剩余系,既然已经有前面那个定理,那么 \(Z_m=m_2Z_{m_1}+m_1Z_{m_2}\) 已经是模 \(m\)的一个完全剩余系,于是我们只需要证明 \(M=\{a\in Z_m|(a,m)=1\}=Z_m^*\) 即可。
取 \(m_2x+m_1y\in M\),其中 \(x\in Z_{m_1}, y\in Z_{m_2}\),于是 \((m_2x+m_1y, m_1m_2)=1\),由于 \((m_1,m_2)=1\) 于是 \((m_2x+m_1y,m_1)=(m_2x,m_1)=(x,m_1)=1\) 类似的也有 \((y,m_2)=1\)。于是这就证明了 \(M\subset Z_m^*\)。
再取 \(m_2x+m_1y\in Z_m^*\) 其中 \(x\in Z_{m_1}^*, y\in Z_{m_2}^*\),那么 \((x,m_1)=(m_2x,m_1)=(m_2x+m_1y,m_1)=1\) 并且 \((y,m_2)=(m_1y,m_2)=(m_1y+m_2x,m_2)=1\) 于是 \((m_2x+m_1y,m_1m_2)=1\) 于是我们证明了 \(Z_m^*\in M\)。
于是说明 \(M = Z_m^*\)。
我们如果提取一下两边剩余系里的元素个数,我们能够发现左边剩余系里元素的个数是 \(\varphi(m)\),右边剩余系里面的元素个数是 \(\varphi(m_1)\varphi(m_2)\)。于是我们证明了 \(\varphi(m)=\varphi(m_1)\varphi(m_2)\)。
这是一个相当好的性质,同时也引出了下面的内容。
数论函数
积性函数
如果函数 \(f(n)\) 满足对于任意互质的 \(x\) 和 \(y\),\(f(xy)=f(x)f(y)\) 成立,那么 \(f(n)\) 被称为 积性函数。上面的 \(\varphi(n)\) 就是满足这样条件的一个函数。
如果 \(f(n)\) 对于任意的 \(x\) 和 \(y\) 都有 \(f(xy)=f(x)f(y)\),那么 \(f(n)\) 被称为完全积性函数。
如果 \(f(x)\) 和 \(g(x)\) 都是积性函数,那么下面的函数也是积性函数。
- \(h(x)=f(x^p)\)
这个应该比较显然,不管几次方原来互质之后肯定还是互质。
- \(h(x)=f^p(x)\)
\(h(xy)=f^p(xy)=f^p(x)f^p(y)=h(x)h(y)\)
- \(h(x)=f(x)g(x)\)
\(h(xy)=f(xy)g(xy)=f(x)f(y)g(x)g(y)=f(x)g(x)f(y)g(y)=h(x)h(y)\)
- \(h(x)=\sum\limits_{d\mid x}f(d)g(\frac{x}{d})\)
\(h(xy)=\sum\limits_{d\mid xy}f(d)g(\frac{xy}{d})=\sum\limits_{d_1\mid x,d_2\mid y}f(d_1d_2)g(\frac{x}{d_1}\frac{y}{d_2})=\sum\limits_{d_1\mid x,d_2\mid y}f(d_1)f(d_2)g(\frac{x}{d_1})g(\frac{y}{d_2})=(\sum\limits_{d_1\mid x}f(d_1)g(\frac{x}{d_1}))(\sum\limits_{d_2\mid y}f(d_2)g(\frac{y}{d_2}))=h(x)h(y)\)
加性函数
如果函数 \(f(n)\) 满足 \(f(xy)=f(x)+f(y)\) 对任意互质的 \(x,y\) 成立,则 \(f(n)\) 为加性函数。
如果函数 \(f(n)\) 满足 \(f(xy)=f(x)+f(y)\) 对任意的 \(x,y\) 成立,则 \(f(n)\) 被称为完全加性函数。
性质:如果 \(F(x)\) 是加性函数,则有 \(F(x)=\sum F(p_i^{k_i})\)。
如果 \(F(x)\) 是完全加性函数,则有 \(F(x)=\sum F(p_i^{k_i})=\sum F(p_i)k_i\)
积性函数的例子前面我见过很多,所以我没有举例,而加性函数我比较陌生,所以我这里搬几个 oiwiki 上的例子。
- 素因数分解中 \(p\) 的重数。 \(\nu_p(n)=\max\{k\in\mathbf{N}:p^k\mid n\}\)。
完全加性的很显然啊,不谈。
- 所有质因子数目。
- 相异质因子数目。
- 所有质因子之和
- 相异质因子之和
我们能发现后面几个本质上都是跟重数挂钩的,只不过每个东西前面多了各种系数而已,这里就不谈了。
取整函数
取整函数确实有挺多性质的。前面我好像也确实不是很熟,所以这里再次复习一次。
首先就是最经典的公式
\(\left\lfloor x\right\rfloor=n\iff n\leq x<n+1 \iff x-1<n \leq x\)
\(\left\lceil x\right\rceil\iff n-1<x\leq n\iff x\leq n < x+1\)
然后又有结论
如果 \(f\) 是连续单增函数,且只需要 \(f(x)\in \mathbf{Z}\),就有 \(x\in\mathbf{Z}\),那么
\(\left\lfloor f(x)\right\rfloor=\left\lfloor f(\left\lfloor x\right\rfloor)\right\rfloor\) \(\left\lceil f(x)\right\rceil=\left\lceil f(\left\lceil x\right\rceil)\right\rceil\)
好像很好想吧?思考一下图像张什么样,对于连续的 \(x\in\mathbf{Z}\),考虑他们的 \(f(x)\) 的整数部分有没有发生变化,如果没有发生变化,那么在这两个中间的 \(x\) 都跟左边整数的函数下去整值相等,这很显然。如果整数部分发生了变化,因为只要 \(f(x)\in\mathbf{Z}\),\(x\in\mathbf{Z}\),所以变化只发生在整数位置,而整数位置原式等于没有发生变化。
然后还有一些含有整数函数的求和式结论:
- \(n=\lfloor\frac{n}{m}\rfloor+\lfloor\frac{n+1}{m}\rfloor+...+\lfloor\frac{n+m-1}{m}\rfloor\)
我们思考一下这个东西怎么证明
对 \(n\) 和 \(m\) 做带余除法。如果 \(n=qm+r,0\leq r<m\)
对 \(k=0,1,...,m-1\) 有 \(\lfloor\frac{n+k}{m}\rfloor=\lfloor\frac{qm+r+k}{m}\rfloor=q+\lfloor\frac{r+k}{m}\rfloor\)
\(k+r\ge m\) 的时候,后面的整数函数取得 \(1\)。这样的 \(k\) 一共有 \(r\) 个。
于是右边的和是 \(\sum\limits_{k=0}^{m-1}\lfloor\frac{n+k}{m}\rfloor=mq+r=n\)
\(\square\)
- \(n=\sum\limits_{k=0}^{m-1}\lceil\frac{n+k}{m}\rceil\)
这个东西应该跟上面东西证明思路差不多。我们还是写出这个东西的带余除法,不过这次我们让余数变成非正数。
\(n=qm+r,0\leq r<m\),那么对于 \(k\in[0,m)\)。
\(\lceil\frac{n-k}{m}\rceil=\lceil\frac{qm+r-k}{m}\rceil=q+\lceil\frac{r-k}{m}\rceil\)
如果 \(r-k>0\) 那么这个式子贡献是 \(1\) 否则贡献是 \(0\)。那么我们能想到一共有 \(r\) 个东西贡献是 \(1\)。
那么对左边全部求和,最后答案就是 \(\sum\limits_{k=0}^{m-1}\lceil\frac{n+k}{m}\rceil=qm+r=n\)
\(\square\)
- \(\lfloor mx\rfloor=\sum\limits_{i=0}^{m-1}\lfloor x+\frac{i}{m}\rfloor\) \(m\in\mathbf{Z}_+,x\in \mathbf{R}\)
首先用 \(x=\lfloor x\rfloor+\{x\}\) 代入一下
左边就是 \(\lfloor m\lfloor x\rfloor+m\{x\}\rfloor=m\lfloor x\rfloor+\lfloor m\{x\}\rfloor\)
右边我们也化简一下。
\(\lfloor\lfloor x\rfloor+\{x\}+\frac{i}{m}\rfloor=\lfloor x\rfloor+\lfloor\{x\}+\frac{i}{m}\rfloor\)
求和起来就是 \(m\lfloor x\rfloor + \sum\limits_{i=0}^{m-1}\lfloor\{x\}+\frac{i}{m}\rfloor\)
求和式我们试图继续将其化简。\(\lfloor\frac{m\{x\}+i}{m}\rfloor=\lfloor\frac{\lfloor m\{x\}\rfloor+i}{m}\rfloor\)。
我们发现这个东西求和不就是上面我们所证明过的东西吗。直接运用结论,这个东西求和就是 \(\lfloor m\{x\}\rfloor\)。那么代入就证完了。
\(\square\)
- \(\lceil mx\rceil=\sum\limits_{i=0}^{m-1}\lceil x-\frac{i}{m}\rceil\)
这个东西跟上面的东西比较类似,就不证明了。
- 当 \(m\perp n\) 时,\(\sum\limits_{k=1}^{m-1}\lfloor\frac{kn}{m}\rfloor=\frac{1}{2}(n-1)(m-1)\)
令 \(q_k=\lfloor\frac{kn}{m}\rfloor,r_k\equiv kn \pmod m,0\leq r_k<m\)
于是 \(kn=mq_k+r_k\)
对 \(k=1,2,...,m-1\) 求和。
\(n\sum\limits_{k=1}^{m-1}k=n\frac{m(m-1)}{2}=m\sum\limits_{k=1}^{m-1}q_k+\sum\limits_{k=1}^{m-1}r_k\)
\(A=\{0,1,2,...,m-1\}\) 是一个模 \(m\) 的完全剩余系,那么由于 \((n,m)=1\),\(nA\) 也是一个模 \(m\) 得到完全剩余系,\(nA=\{0,r_1,r_2,...,r_{m-1}\}\),于是 \(\sum\limits_{k=1}^{m-1}r_k=\sum\limits_{k=1}^{m-1}k=\frac{m(m-1)}{2}\)
代入原来等式,可以解得 \(\sum\limits_{k=1}^{m-1}\lfloor\frac{kn}{m}\rfloor=\frac{(m-1)(n-1)}{2}\)
\(\square\)
素数检验
我们回头重新看一下素数,首先我们考察一下基础的素数分布问题,有一个广为人知的结论 \(\pi (x)\sim \frac{x}{\ln(x)}\)。
然后我们考虑一下素性测试。
首先有一个很简单的确定性办法,我们用 \(1\) 到 \(\sqrt{n}\) 中的所有数去尝试一下能不能整除,这样的时间复杂度是 \(\mathcal{O}(\sqrt{n})\) 的。代码就不写了。
这里重点讲一下 Miller-Rabin 素性测试。
在讲 Miller-Rabin 素性测试之前,我们先来讲一下 Fermat 素性测试。
有一个广为人知的定理 \(a^{p-1}\equiv1\pmod p\),当 \(p\) 是素数的情况下,那么我们测试几个 \(a\) 如果都满足这个式子不就能大概猜测 \(p\) 是一个素数了吗?
所以 Fermat 素性测试是一个概率性算法。
Miller-Rabin 素性测试是 Fermat 素性测试的一个优化。
首先我们介绍一下二次探测定理
如果 \(p\) 是一个奇素数,那么 \(x^2\equiv1\pmod p\) 的解是 \(x\equiv1\pmod p\) 或者 \(x\equiv p-1\pmod p\)。
这里涉及一些群论的知识,暂时不加证明。
那么我们可以把 Fermat 素性测试用二次探测定理优化。
做法如下:
将 \(a^{n-1}\equiv1\pmod n\) 中的 \(n-1\) 分解成 \(u\times2^t\) 的形式,\(2\nmid u\)。然后我们将 \(a^u\) 做若干次平方操作,如果这个过程中已经是 \(1\) 或者 \(n-1\) 那么测试结束。如果做完了还没有成为 \(1\) 那么测试失败。
我们可以选取 \(\{2,7,61\}\) 来验证 \([1,2^{32})\) 以内的素数,选取 \(\{2,325,9375,28178,450775,9780504,1795265022\}\) 来验证 \([1,2^{64})\) 以内的素数,经过检验在这个值域内,这是一个确定性的做法。
扩展欧几里得算法
我们通常用扩展欧几里得算法来计算方程 \(ax+by=(a,b)\) 的一组可行解。
\(ax_1+by_1=(a,b)\)
如果我们找到了 \(bx_2+(a\%b)y_2=(b,a\%b)\) 的一组解。那么由于 \((a,b)=(b,a\%b)\) 于是有:
\(ax_1+by_1=bx_2+(a-\lfloor\frac{a}{b}\rfloor\times b)y_2=ay_2+b(x_2-\lfloor\frac{a}{b}\rfloor y_2)\)
那么我们可以让 \(x_1=y_2,y_1=x_2-\lfloor\frac{a}{b}\rfloor y_2\) 这样不断递归求解。
最后会得到 \(b=0\)。这个时候我们让 \(x=1,y=0\) 带回去求解就行了。
我们求出了满足要求的一组解,那么我们应该怎么表示通解呢?我们假如说我们找到的一组特解是 \(ax^*+by^*=(a,b)\)。

浙公网安备 33010602011771号