整除与同余
整除得到了扩展,于是便成了同余。
整除
定义及性质
若整数\(b\)除以非零整数\(a\),商为整数,且余数为零,\(b\)为被除数,\(a\)为除数,即\(a|b\)(“|”是整除符号),读作“\(a\)整除\(b\)”或“\(b\)能被\(a\)整除”。\(a\)叫做\(b\)的约数(或因数),\(b\)叫做\(a\)的倍数。整除属于除尽的一种特殊情况。
①若\(b|a\),\(c|a\),且\(b\)和\(c\)互质,则\(bc|a\)。
②对任意非零整数\(a\),\(±a|a=±1\)。
③若\(a|b\),\(b|a\),则\(|a|=|b|\)。
④如果\(a\)能被\(b\)整除,\(c\)是任意整数,那么积\(ac\)也能被\(b\)整除。
⑤对任意整数\(a,b>0\),存在唯一的数对\(q,r\),使\(a=bq+r\),其中\(0 ≤ r < b\)。带余除法定理,是整除理论的基础。
⑥若\(c|a\),\(c|b\),则称\(c\)是\(a,b\)的公因数。若\(d\)是\(a,b\)的公因数,\(d≥0\),且\(d\)可被\(a,b\)的任意公因数整除,则\(d\)是\(a,b\)的最大公因数。若\(a,b\)的最大公因数等于\(1\),则称\(a,b\)互素,也称互质。累次利用带余除法可以求出\(a,b\)的最大公因数,这种方法常称为辗转相除法。又称欧几里得算法。
(百度百科)
欧几里德算法
用来求最大公因数(gcd),又称辗转相除法。
给定 \(a,b\in N\) ,有 \(\gcd(a,b)=\gcd(b,a\ \%\ b)\ (a\geq b)\) ,利用这个性质一直递归下去,直到 \(b'=0\) ,于是 \(a'\) 就是 \(a,b\) 的 gcd 了,因为 \(\gcd(a,0)=a\)。
裴蜀定理
\(\forall a,b \in Z\) ,一定有一组整数解使得 \(ax+by=\gcd(a,b)\)。
\(ax+by=\gcd(a,b)\) 有解 $\ \ \Leftrightarrow\ \ $ \(ax+by=m\ \ (\gcd(a,b)|m)\) 有解。
证明
扩展欧几里德算法(exgcd)
扩展欧几里得的用途
- 判断方程\(ax+by=m\)是否有解
- 求\(ax+by=m\)的任意一组解、通解、最小整数解
- 求逆元
我们现在需要求解方程 \(ax+by=\gcd(a,b)\) ,
首先 \(b=0\) 时显然有解 \(x=1,y=0\) ,
再来看 \(\gcd(a,b)=\gcd(b,a\ \%\ b)\) ,把 \(a\ \%\ b\) 拆开:
再加入一点裴蜀定理:
我们发现 \(x,y\) 能递归向下求解,由辗转相除性质可知,总能递归到 \(b=0\) 的情况。
于是我们得到了方程 \(ax+by=\gcd(a,b)\) 的一组解。
这个解保证 \(|x|+|y|\) 最小。
现在来讲讲如何把这一过程作用在具体用途上:
-
判断方程\(ax+by=m\)是否有解:
由裴蜀定理的充要性可知,若 \(\gcd(a,b)|m\) ,则方程一定有解,反之一定无解。 -
求\(ax+by=m\)的任意一组解、通解、最小整数解:
首先保证 \(\gcd(a,b)|m\) ,求出 \(ax+by=\gcd(a,b)\) 的解再同乘即可。 -
求逆元:
重中之重,吊打费马小求逆元。
众所周知,使用费马小定理 \(a^{p-2}\equiv\dfrac{1}{a} \mod p\) 有两点限制: \(a \bot p\ ,\ p \in prime\)。
扩展欧几里德求逆元只有一条限制:$a \bot p\ $。要求 \(a\) 在模 \(p\) 意义下的逆元 \(b\) ,有:
\(\begin{aligned} &\ \ \ \ \ \ \frac{1}{a} \equiv b \mod p \\ &\Rightarrow ab \equiv 1 \mod p \\ &\Rightarrow ab = 1 + px \\ &\Rightarrow ab + (-p)x = 1 \\ \end{aligned}\)使用扩欧求解 \(b\) 即可。
同余
定义同余符号为 \(\equiv\) ,\(a \equiv b \mod m\) 表示式子两边在模 \(m\) 意义下相等,也称在模 \(m\) 意义下同余。
同余公式(性质)
1.公式一
2.公式二(\(\forall k \in Z\))
3.公式三(\(\forall k \in Z\))
- 逆向不一定成立,具体见公式六。
4.公式四(\(\forall k \in Z\))
5.公式五(\(f(x)\) 是整系数多项式)
6.公式六(\(k \bot m\))
涉及到变化 \(m\) 的公式:
7.公式七
- 逆向就是三者同乘任意正整数,亦成立
- 由这个公式和公式三可以推出公式六的一般形态:\[\left.\begin{array}{l} \gcd(k,m) = d \\ ak \equiv bk \\ \end{array}\right\} \;\Rightarrow\; a \equiv b \mod \frac{m}{d} \]
8.公式八
- 这实际上是群论的一个推论 ,\(\mathbb{Z_d}\) 构成了 \(\mathbb{Z_m}\) 的一个子群。
- 逆向不一定成立,显然当 \(d=1\) 时 \(a \equiv b \mod d\) 恒成立。
- 这条公式等效于:\[a \equiv b \mod nm \;\Rightarrow\; \left\{\begin{array}{l} a \equiv b \mod n \\ a \equiv b \mod m \\ \end{array}\right. \]
- 逆向需要互质,见下一条性质
9.公式九
- 更完整的形态(无需互质)
- 具体证明见中国剩余定理引理一。
费马小定理
\(p \in prime\ ,\ a \bot p\)
欧拉定理
\(a \bot m\)
证明:
设 \(x_1,x_2...x_{\varphi(m)}\) 是模 \(m\) 的简化剩余系,那 \(ax_1,ax_2...ax_{\varphi(m)}\) 也是模 \(m\) 的简化剩余系。
因为 \(\gcd(a,m)=1\) ,\(ax_{1}ax_{2}...ax_{\varphi(m)} \equiv x_{1}x_{2}...x_{\varphi(m)} \mod m\) ,所以欧拉定理成立。
可以发现费马小定理是欧拉定理的一种特殊情况。
扩展欧拉定理
证明:OI-Wiki
值得注意的是,无论是费马小定理,还是(扩展)欧拉定理,一个很重要的应用就是降幂,从而将不可能的表达式化为可能。
乘法逆元
设 \(\dfrac{1}{a} = b \mod m\) ,则 \(b\) 称为 \(a\) 在模 \(m\) 意义下的乘法逆元,又记作 \(a^{-1}(\bmod\ m)\)。
注意,只有当 \(\gcd(a,m)=1\) 时 \(a\) 才有逆元。
费马小求逆元
\(a\ \bot\ p\ ,\ p \in prime\)
扩展欧几里德求逆元
\(a\ \bot\ m\)
见 扩展欧几里德(exgcd) 。
欧拉定理求逆元
\(a\ \bot\ m\)
线性求逆元
线性递推,当递推到 \(i\) 时,设 \(k = \lfloor\dfrac{p}{i}\rfloor\) 且 \(j = p \mod i\)。
则 $$p = k \times i + j$$
两边同乘 \(i^{-1} \times j^{-1}\) :
所以递推式可写为 \(inv(i) = (-\dfrac{p}{i}+p) \times inv(j) \bmod p\)。
线性同余方程组(中国剩余定理/CRT)
求解:
中国剩余定理
要求模数互质。
设:
\(m\) 为 \(m_1 \sim m_n\) 的乘积,
\(b_i = \dfrac{m}{m_i}\),
\(c_i = b_{i}(b_i^{-1}\ \bmod\ m_i)\) (外层不对 \(m_i\) 取模)。
则 \(x\) 有最小解:
下面给出证明:
我们要求上面式子求出来的 \(x\) 对于任意 \(i \in [1,n]\) 都满足 \(x \equiv a_i \mod m_i\) 成立。
那么我们对于任意 \(i\) 对答案式进行验证:
首先,设 \(j \neq i\) ,则 \(c_j \equiv b_j \equiv \dfrac{m}{m_i} \equiv 0 \mod m_i\),
然后我们可以发现答案式在模 \(m_i\) 意义下可以化成原式:
由此,答案式正确性得以证明(从中我们可以发现答案式其实就是一个构造)。
扩展中国剩余定理
不要求模数互质。
CRT无法应对模不互质的情况。这个缺陷是在于CRT的核心思想,给它动小手术是没有用的。我们想找到解模不互质方程组的办法,就必须完全跳出CRT的窠臼。
——阮行止
对于解模数不互质的线性同余方程组问题,扩展中国剩余定理给出了可行的解法,
那就是将两个线性同余方程合并成一个完全等价的方程,最终化方程组为单个方程求解。
设现在有两个方程:
写成等式
移个项
这样我们就可以用 exgcd 求出一组 \(p_1,p_2\) 的解(或报告无解),获得了在这组解下的 \(x\)(这里我们称之为 \(p\)),从而求得 \(x\) 所在的等价类(模 \(lcm(m_1,m_2)\) 意义下),于是俩方程式可以合并成:
对于这里为什么是模 \(lcm(m_1,m_2)\) 意义下,以及为什么解所在的等价类唯一(就是上面\(p\)所在的等价类),这里引用阮行止的证明:
【定理】若有特解 \(x^{*}\) ,那么 \(\left\{\begin{array}{l}x \equiv r_{1}\left(\bmod m_{1}\right) \\ x \equiv r_{2}\left(\bmod m_{2}\right)\end{array}\right.\) 的通解是: \(x^{*}+k \cdot \operatorname{lcm}\left(m_{1}, m_{2}\right)\) ,亦即
\[x \equiv x^{*} \quad\left(\bmod \operatorname{lcm}\left(m_{1}, m_{2}\right)\right) \]从线性代数的角度讲,这个通解的构造方式是十分平凡的。对 \(\operatorname{lcm}\left(m_{1}, m_{2}\right)\) 取模的结果,将整个整数集划分成了 \(\operatorname{lcm}\left(m_{1}, m_{2}\right)\) 个等价类,哪个等价类里面有特解,那整个等价类肯定全都是解。一人得道,鸡犬升天。接下来唯一需要说明的事情就是:为什么任意一个完全剩余系里面,只会有一个解?这个问题等价于:为什么 \(0,1,2, \cdots, \operatorname{lcm}\left(m_{1}, m_{2}\right)\) 里面,只有一个解?
证明解的唯一性,常常采用这样一种手段:假设 \(x, y\) 都是原问题的解,然后经过一系列推理,得到 \(x=y\) ,于是解的唯一性就不言而喻了。我们也采用这种手段来解决唯一性问题。设上述集合里面有 \(0 \leq x, y \leq \operatorname{lcm}\left(m_{1}, m_{2}\right)\) 满足
\[\left\{\begin{array}{l} x \equiv a_{1}\left(\bmod m_{1}\right) \\ x \equiv a_{2}\left(\bmod m_{2}\right) \end{array},\left\{\begin{array}{l} y \equiv a_{1}\left(\bmod m_{1}\right) \\ y \equiv a_{2}\left(\bmod m_{2}\right) \end{array}\right.\right. \]不妨设 \(x \geq y\) .那立刻就可以发现
\[\left\{\left.\begin{array}{l} (x-y) \bmod m_{1}=0 \\ (x-y) \bmod m_{2}=0 \end{array} \quad \Rightarrow \quad \operatorname{lcm}\left(m_{1}, m_{2}\right) \right\rvert\,(x-y)\right. \]\(x, y\) 都是小于 \(\operatorname{lcm}\left(m_{1}, m_{2}\right)\) 的数,它们的差也必然要小于 \(\operatorname{lcm}\left(m_{1}, m_{2}\right)\) .但 \((x-y)\) 又要被 \(\operatorname{lcm}\left(m_{1}, m_{2}\right)\) 整除,那怎么办?只有 \(x-y=0\) ,也就是 \(x=y\) .到此为止,我们证明了:一个完全剩余系中,有且仅有一个解。以上就是整个 exCRT 算法的全部数学基础。
或者感性理解一下,有 \(a \equiv b \mod m \;\Rightarrow\; \forall d \mid m\ ,\ a \equiv b \mod d\) ,由此 \(\bmod\ lcm(m_1,m_2)\) 可一同时满足 \(\bmod\ m_1\) 和 \(\bmod\ m_2\) 的性质。
离散对数
若 \(g\) 为模数 \(m\) 的一个原根。
则有唯一的 \(0 \leq k < \varphi(m)\) 使得:
有时候我们已知 \(g,a,m\) ,需要求 \(k\) ,这就是离散对数问题。
这里我们记 \(k = \operatorname{ind}_{g}a \mod m\)。
离散对数 \(ind\) 和普通对数一样也有着很多优美性质:
-
\(\operatorname{ind}_{g}ab = \operatorname{ind}_{g}a\ +\ \operatorname{ind}_{d}b\)
-
\(\operatorname{ind}_{g}a^b = b \times \operatorname{ind}_{g}a\)
-
设 \(g_1\) 为 \(m\) 的另一原根:\(\operatorname{ind}_{g}a = \dfrac{\operatorname{ind}_{g_1}a}{\operatorname{ind}_{g_1}g} \;\Rightarrow\; \operatorname{ind}_{g_1}a = \operatorname{ind}_{g}a \times \operatorname{ind}_{g_1}g\)
求取离散对数,大步小步算法(BSGS)可以在 \(O(\sqrt m)\) 的时间复杂度内完成。
大步小步算法(BSGS)
\(a \bot m\)
先考虑朴素算法:暴力枚举指数。
由欧拉定理我们可以知道 \(a^x \equiv b \mod m\) 可以降次到 \(a^{x \bmod\ \varphi(m)} \equiv b \mod m\)。
由此枚举范围可以降到 \(x \in [0,m-1)\) ,但这还远远不够,于是我们把枚举范围分成 \(\sqrt m\) 大块,每个大块里有 \(\sqrt m\) 小块(这里的 \(\sqrt m\) 向上取整),这样 \(x\) 就可以写成 \(A \sqrt m - B\) (\(A \in [1,\sqrt m]\ ,B \in [0,\sqrt m)\))。
代入式子:
这时候我们已经将 \(A,B\) 抽离开了,也就是 \(A,B\) 之间互不影响,那么就可以先计算出 \(b \cdot a^B\) 的所有可能值塞进 \(\operatorname{map}/\operatorname{hash}\) 里面,再枚举左端的 \(A\) ,若有 \(A\) 使得 \(\exist B\) 使原式成立,那么就得到了一个可行解 \(x = A \sqrt m - B\) ,若没有则报告无解。
注意,由于 \(A\) 的系数 \(\sqrt m\) 大于 \(B\) 的值域 ,所以第一次求得的可行解即最小解。
扩展大步小步算法(exBSGS)
无限制。
由于 BSGS 中有用到乘法逆元,无法应对 \(a,m\) 不互质的情况,所以我们考虑把他们变成互质的。
设 \(d = \gcd(a,m)\) ,由同余方程公式八,原式可化为:
但此时 \(a\) 仍然不一定与 \(\dfrac{m}{d}\) 互质,因为 \(a\) 中存在的公因子在 \(m\) 里可能存在多个,那么就需要重复上面的操作直到 \(a\ \bot\ \dfrac{m}{d_1 d_2 ...}\) 为止,这样我们就可以愉快地使用 BSGS 求解啦。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具