【OI】同余方程

本文深入解析了同余方程的判定与解法,通过具体实例展示了同余方程的求解过程,并引入扩展欧几里得算法(EXGCD)来求解线性同余方程,提供了详细的算法实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.同余方程的判定

我们知道同余方程是形如 

ax ≡ b (mod n)   的东西,用文字表达就是:

ax和b除以n的余数相同

那么,经过如下推理:(用=代替恒等于)

ax=b (mod n) 

ax=b+n*x2 (转化为b加上n乘上某个数等于ax)

ax-n*x2=b(移项得)

a x1 + n x2 = b(转换)

ax + ny = b

但是为了看起来更顺眼,我们将除x,y的元素改变名称,得到:

ax + by = c

那么,判断是否有解:

举几个例子,不难得到:

c|gcd(a,b)时,ax + by = c有解。

然后可以举几个例子:

①2x + 3y = 1

这是一种特殊情况,解得其中一个解为 x0 = -1, y0 = 1

②4x + 6y = 2

化简为 2x + 3y = 1,解同上

③2x + 3y = 5

解得其中一个解为  x0  = -5, y0 = 5

发现与①的规律,也就是x0 * 5,y0 * 5

那么就可以将ax + by = c 简化为ax + by = 1 ,

换种形式表达就是:ax ≡ 1 (mod n)


 

二.同余方程的解法

这时,我们需要引入exgcd。

exgcd可以用来求

ax + by = gcd (a,b)

那么,如何证明呢?

先给出结果:

{

要解 ax + by  = 1

先解 bx + (a%b)y = 1

}

如何得到它?

在 bx + (a%b)y = 1 中展开a,得到

a = b·floor(a/b) + a%b

代入原方程,得 

b·floor(a/b) + a%b)x + by = 1

与ax + by = 1等量代换,得

(a%b)*x + b(floor(a/b)·x+y) = 1

得到其中解:y0 = x,x0 = floor(a/b)·x+y

又由gcd(a,b) = gcd(b,a%b) 得到

exgcd(a,b,x,y) = exgcd(b,a%b,y,x), y -= (a/b) * x

代码:

#include <cstdio>
void exgcd(int a, int b, int &x, int &y)
{
    if (b == 0) x = 1, y = 0;
    else exgcd(b, a % b, y, x), y -= (a / b) * x;
}
int main()
{
    int a = 2, b = 3, x, y;
    exgcd(a, b, x, y);
    printf("%d %d\n", x, y);
    return 0;
}

 

 

 

转载于:https://www.cnblogs.com/dudujerry/p/10296330.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值