数论

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\)同余类

这里有两条性质,感觉应该还是比较显然的:

  1. 对任意整数 \(a\),有 \(a+\textbf{Z}_m=\textbf{Z}_m\)
  2. 对任意与 \(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\) 的一个简化剩余系。

这里有两个定理

  1. 如果 \(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\) 所干扰。那么推广的例子也类似。

这个形式化的证明比较简单,且不是特别重要,这里就略过。

  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)\) 都是积性函数,那么下面的函数也是积性函数。

  1. \(h(x)=f(x^p)\)

这个应该比较显然,不管几次方原来互质之后肯定还是互质。

  1. \(h(x)=f^p(x)\)

\(h(xy)=f^p(xy)=f^p(x)f^p(y)=h(x)h(y)\)

  1. \(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)\)

  1. \(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 上的例子。

  1. 素因数分解中 \(p\) 的重数。 \(\nu_p(n)=\max\{k\in\mathbf{N}:p^k\mid n\}\)

完全加性的很显然啊,不谈。

  1. 所有质因子数目。
  2. 相异质因子数目。
  3. 所有质因子之和
  4. 相异质因子之和

我们能发现后面几个本质上都是跟重数挂钩的,只不过每个东西前面多了各种系数而已,这里就不谈了。

取整函数

取整函数确实有挺多性质的。前面我好像也确实不是很熟,所以这里再次复习一次。

首先就是最经典的公式

\(\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}\),所以变化只发生在整数位置,而整数位置原式等于没有发生变化。

然后还有一些含有整数函数的求和式结论:

  1. \(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\)

  1. \(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\)

  1. \(\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\)

  1. \(\lceil mx\rceil=\sum\limits_{i=0}^{m-1}\lceil x-\frac{i}{m}\rceil\)

这个东西跟上面的东西比较类似,就不证明了。

  1. \(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)\)

参考资料

数学 - OI Wiki

posted @ 2026-09-17 18:46  Mercury_City  阅读(7)  评论(0)    收藏  举报