欧几里得算法
一、欧几里得算法(辗转相除法)
ll gcd(ll a, ll b){ if(b==0) return a; else return gcd(b,a%b); }
二、扩展欧几里得算法
在求a,b的gcd的同时求出一组特解 x,y满足方程 ax + by = gcd(a,b)
void extgcd(ll a,ll b,ll& d,ll& x,ll& y){ if(!b){ d=a; x=1; y=0;} else{ extgcd(b,a%b,d,y,x); y-=x*(a/b); } }
三、关于方程 ax + by = c
若gcd(a,b) | c,则方程有解,否则无解。
【解法】先运用扩展欧几里得算法求出ax + by = gcd(a,b) 一组特解x0,y0
则通解:
x = x0 + b/gcd(a,b) * t
y = y0 - a/gcd(a,b) * t
对应方程 ax + by = c只需要在通解基础上乘以一个比例系数:c/gcd(a,b)
【求最小正整数解】
使用拓展欧几里德找到ax+by=c的一组整数解(x0,y0)之后,
令k=b/gcd(a,b),x'=(x0%k+k)%k,y'=(c-ax)/b,就可以得到x的最小正整数解。
同理,令k=a/gcd(a,b),y'=(y0%k+k)%k,x'=(c-by)/a,就可以得到y的最小正整数解。
四、解模线性方程 ax ≡ b (mod p)
先对方程进行转换 (ax - b) = -y*p 根据同余的性质ax与b的差是模数的倍数
移项可知: ax + py = b
显然,这个方程有解的条件是gcd(a,p) | b
用扩欧先求出ax + py = gcd(a,p)的一个解x0
则ax + py = b的一个特解是 x = b/gcd(a,p) * x0
然后把x处理成最小的正整数,x = (x%p + p) % p即可
ll linearCong(ll a, ll b, ll p){ ll d,x,y; extgcd(a,p,d,x,y); if(b % d != 0) return -1; x = x*b/d; x = (x%p + p) % p; return x; }
五、求逆元
六、解模线性方程组
这两节见另一篇博客:中国剩余定理
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 2025成都.NET开发者Connect圆满结束
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析