扩展欧几里得算法 | exgcd 证明 + 板子 + 习题
创始人
2024-03-11 23:49:54

扩展欧几里得算法 是在 欧几里得算法 && 裴楚定理 基础上得出来的

前提回顾:

欧几里得算法:
gcd(a,b)=gcd(b,a%b)gcd(a, b) = gcd(b,a\%b)gcd(a,b)=gcd(b,a%b)
裴楚定理:
若 a , b 是整数,且 gcd ⁡ ( a , b ) = d,那么对于任意的整数 x , y , ax + by 都一定是 d 的倍数,特别地,一定存在整数 x , y,使 ax + by = d 成立。

扩展欧几里得算法

当 b=0b = 0b=0 时 ax+b=aax + b = aax+b=a 故: x=1,y=0x = 1,\ y = 0x=1, y=0
当 b≠0b \neq 0b​=0 时
由欧几里得算法得: gcd(a,b)=gcd(b,a%b)gcd(a, b) = gcd(b,a\%b)gcd(a,b)=gcd(b,a%b)
由裴楚定理得:
gcd(a,b)=ax+bygcd(a, b) = ax + bygcd(a,b)=ax+by
gcd(b,a%b)=bx1+(a%b)y1=bx1+(a−⌊ab⌋×b)y1=ay1+b(x1−⌊ab⌋y1)gcd(b,a\%b) = bx_1 + (a\%b)y_1 = bx_1+(a - \lfloor\frac{a}{b}\rfloor \times b) y_1 = ay_1 + b(x_1 - \lfloor\frac{a}{b}\rfloor y_1)gcd(b,a%b)=bx1​+(a%b)y1​=bx1​+(a−⌊ba​⌋×b)y1​=ay1​+b(x1​−⌊ba​⌋y1​)
所以:
x=y1,y=x1−⌊ab⌋y1x = y_1, \ y = x_1 - \lfloor\frac{a}{b}\rfloor y_1x=y1​, y=x1​−⌊ba​⌋y1​

可以用递归算法,先求出下一层的 x1,x1x_1,\ x_1x1​, x1​
再回代到上一层,层层回代,可以求出特解 (x0,y0)(x_0,\ y_0)(x0​, y0​)

构造通解
x=x0+bgcd(a,b)×kx = x_0 + \frac{b}{gcd(a,b)} \times kx=x0​+gcd(a,b)b​×k
y=y0−agcd(a,b)×ky = y_0 - \frac{a}{gcd(a, b)} \times ky=y0​−gcd(a,b)a​×k
(考虑 ax+by=0ax + by = 0ax+by=0 构造)

exgcd板子代码

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

例题一:

P1082 [NOIP2012 提高组] 同余方程
板子题,不做解释。

AC代码:

int a, b;
int exgcd(int a, int b, int &x, int &y)
{if (b == 0){x = 1, y = 0;return a;}// int d = exgcd(b, a % b, x, y);// int t = x;// x = y, y = t - a / b * y;// 或int d = exgcd(b, a % b, y, x);y = y - a / b * x;return d;
}
void solve()
{cin >> a >> b;int x, y;int d = exgcd(a, b, x, y);cout << (x % b + b) % b << '\n';
}
int main()
{buff;solve();
}

例题二:

青蛙的约会

思路:

假设跳了 t 次后相遇,则可以列出方程:(x+mt)%L=(y+nt)%L(x + mt) \% L = (y + nt) \% L(x+mt)%L=(y+nt)%L,将未知数 t 移到等式左边,常数移到等式右边,得到模线性方程:(m−n)t%L=(y−x)%L(m-n) t \%L = (y-x) \% L(m−n)t%L=(y−x)%L
利用扩展欧几里德定理可以求得 t 的通解 (t0+kd∣k为任意整数)(t_0 + kd | k为任意整数)(t0​+kd∣k为任意整数),由于这里需要求 t 的最小正整数,而 t0t_0t0​ 不一定是最小的正整数,甚至有可能是负数,我们发现 ttt 的通解是关于 d 同余的,所以最后的解可以做如下处理:ans=(t0%d+d)%dans = (t_0 \% d + d) \% dans=(t0​%d+d)%d

AC代码:

#define int long long
//#define ll long long
#define PII pair
#define px first
#define py second
using namespace std;
const int mod = 1e9 + 7;
const int N = 100009;
int exgcd(int a, int b, int &x, int &y)
{if (b == 0){x = 1, y = 0;return a;}// int d = exgcd(b, a % b, x, y);// int t = x;// x = y, y = t - a / b * y;// 或int d = exgcd(b, a % b, y, x);y = y - a / b * x;return d;
}
void solve()
{int x, y, m, n, L;cin >> x >> y >> m >> n >> L;int a, b;int d = exgcd(n - m, L, a, b);if ((x - y) % d){cout << "Impossible\n";return;}cout << ((a * ((x - y) / d)) % L + L) % L << '\n';
}
signed main()
{buff;solve();
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...