数论 · 求解线性同余方程

问题

求解方程 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——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值