同余方程学习笔记

一、裴蜀定理

裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数 a,b 和它们的最大公约数 d,关于未知数 xy 的线性不定方程(称为裴蜀等式):若 a,b 是整数,且 gcd(a,b)=d,那么对于任意的整数 x,y,ax+by 都一定是 d 的倍数。特别地,一定存在整数 x,y,使 ax+by=d 成立。
它的一个重要推论是:a,b 互质的充分必要条件是存在整数 x,y 使 ax+by=1

证明:如果 gcd(a,b)>1 ,两边同时除以 gcd(a,b) 即可。

只需考虑 gcd(a,b)=1 的情况,那么此时考虑集合 A=0,a,2×a,,(b1)×a,共 b 个数。

i,jN,0i<jb1,i×aj×a(modb) ,则 b|(ji)×a ,因为gcd(a,b)=1,所以b|(ji),而b<ji,所以此情况不成立。

所以 A 中的 b 个数 modb 互不同余,故 uN,a×u1(modb),则一定 vN,满足 b×v+a×u=1。□

二、同余方程的基本求解方法

首先将关于 x 的同余方程 a×xc(modb),变成一个二元一次不定方程 a×x+b×y=c。然后由于裴蜀定理,我们一定可以求出来一组满足 a×x+b×y=gcd(a,b) 的解 x0,y0

然后如果 cgcd(a,b) 的整数倍,那么我们直接将 x0,y0 乘以 cgcd(a,b) 就可以得到原方程的一组特解 x0,y0 了。否则原方程无解。

接下来就是通解。容易知道是 {x=x0+kagcd(a,b)y=y0kbgcd(a,b)

所以我们的问题就转化为了求方程 a×x+b×y=gcd(a,b) 的一组特解。

三、exgcd 算法

先给出代码。

inline void exgcd(ll &x,ll &y,ll a,ll b){
    if(!b){x=1;y=0;return;}
    exgcd(y,x,b,a%b);y-=a/b*x;
}

考虑一个让 a,b 辗转相除的过程。注意 a,b 会变,但是 gcd(a,b) 不变,设为 g

首先我们递归到底层,b=0,那么此时 a=g,那么我们就知道了一组特解:{x=1y=0,因为 g×1+0×0=g

然后是回溯,假设我们已经求出方程 (amodb)×x+b×y=g 的一组特解 {x=x0y=y0 了,那怎么求 a×x+b×y=g 的一组特解呢?

首先 (amodb)×x0+b×y0=g,所以 (ab×ab)×x0+b×y0=g,所以得到 a×x0+b×(y0ab×x0)=g,所以 a×x+b×y=g 的一组特解是 {x=x0y=y0ab×x0

然后因为辗转相除,所以每一层到下一层时 (a,b)(b,amodb),所以 (x,y)(y,x)

然后我们就求出了方程 a×x+b×y=gcd(a,b) 的一组特解了。时间复杂度 O(logmax{a,b})

四、用途

  1. 求解二元一次不定方程的整数通解

  2. 求解同余方程

  3. 求逆元

    其实就是要求同余方程 a×x1(modb) 的最小正整数解。

    为什么不用快速幂+费马小定理求呢?因为时间复杂度同样是 O(logb) 的情况下,exgcd 的使用没有限制,而用快速幂+费马小定理要求 b 必须得是质数。

posted @   lrxQwQ  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示