【OI】同余方程
一.同余方程的判定
我们知道同余方程是形如
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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)