数论 · 求解线性同余方程

问题

求解方程 a x + b y = c ax+by=c ax+by=c

以下摘自一本通

1 求特解

定理

对于该方程,它等价于 a x ≡ c ( m o d b ) ax \equiv c \pmod b axc(modb)

即有整数解的充要条件就是: gcd ⁡ ( a , b ) ≡ 0 ( m o d c ) \gcd (a,b) \equiv 0 \pmod c gcd(a,b)0(modc)

求解

根据定理,我们可以先用 扩展欧几里得算法 求出一组解 x 0 , y 0 x_0,y_0 x0,y0,即 a ∗ x 0 + b ∗ y 0 = gcd ⁡ ( a , b ) a*x_0+b*y_0=\gcd (a,b) ax0+by0=gcd(a,b)

然后两边同除 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b),再同乘 c c c 即可得到特解。

( a ∗ x 0 + b ∗ y 0 ) ∗ c   ÷ gcd ⁡ ( a , b ) = c (a*x_0+b*y_0) * c\ \div\gcd (a,b)=c (ax0+by0)c ÷gcd(a,b)=c

2 求通解

定理

a ⊥ b a \perp b ab,且 x 0 , y 0 x_0,y_0 x0,y0 为方程 a x + b y = c ax+by=c ax+by=c 的一组解,

则该方程的任意解可以表示为: x = x 0 + b ∗ t ,   y = y 0 − a ∗ t x = x_0 +b *t,\ y = y_0 - a*t x=x0+bt, y=y0at,且对 t 为任一整数都成立。

求解

按照上述定理可以求出方程的所有解。

但实际往往让我们求最小整数解,也就是:

t = b ÷ gcd ⁡ ( a , b ) ,   x = ( x   m o d   t + t )   m o d   t t = b \div \gcd(a,b),\ x = (x \bmod t+ t) \bmod t t=b÷gcd(a,b), x=(xmodt+t)modt

【补】 求最小解

可以看 P1516 青蛙的约会 这道题,里面就有求最小解的部分。

详细证明看 小花的题解 有对通解、最小解公式的证明。

3 代码

用扩欧求解线性方程 a x + b y = c ax+by=c ax+by=c

inline bool linearEquation (int a, int b, int c, int &x, int &y)
{
	int gcd = exgcd (a, b);
	if (c % gcd) return false;
	int k = c / gcd;
	x *= k, y *= k;
	return true;
}

—— E n d End End——

posted @   pldzy  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示