裴蜀定理、Exgcd与乘法逆元

裴蜀定理

逆元并非对任何数存在……

定理ax+by=c 有解 {x,y} 当且仅当 cgcd(a,b) 的倍数。

证明必要性:反证

假设 c 不是 gcd(a,b) 的倍数。

d=gcd(a,b),将等式两边除以 d 可得: axd+byd=cd

因为 da,db,所以 dax,dby,就有 dax+by,说明等式左边是一个整数。

然而 c 不是 d 的倍数,所以右边不是整数。矛盾。


那么,这和逆元有什么关系呢?

哦,发现 gcd(a,b)=1 的时候,方程变为 ax+by=1,ax=1by,啊发现方程一定有解。

等式两边同时模 bax%b=(1by)%b=1%bby%b,得到: ax1(modb)

艹,这不是逆元嘛……

而且根据裴蜀定理,发现 gcd(a,b)>1 时这个方程无解。

gcd(a,b)=1,此时求出的 x 就是 a1

推论ax1(modb) 有解当且仅当 ab 互质(也记作 ab

例题:P4549,模板题

Exgcd 扩展欧几里得算法

此算法用于求解 ax+by=c 的解,其中 (a,b)c

此方法的基本思路已经在如下几篇文章里讲的很清楚了:

https://www.luogu.com.cn/blog/command-block/tong-yu-xi1

https://oi-wiki.org/math/number-theory/gcd/

得到一个求出全解的递推公式:

x1=y2;y1=x2aby2

如果不会,可以背板子

int Exgcd(int a, int b, int &x, int &y) {
  if (!b) {
    x = 1;
    y = 0;
    return a;
  }
  int d = Exgcd(b, a % b, x, y);
  int t = x;
  x = y;
  y = t - (a / b) * y;
  return d;
}

我们就可以用这个求逆元,ax+by=1

可是注意,这里的Exgcd算法并不是基于同余的算法,所以算出的结果可能是负数,啊我们只需要加上模数再模就能保证正数。即我们求出了 x,返回要(x+mod)%mod能够保证正数,其与x%mod(x>=0)是等价的。

例题:P5656,exgcd模板题

等我学会了……

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