[数论]扩展欧几里得

扩展欧几里得

导语

这是一个有关数论的知识,涉及最大公约数

正文

讲解

a a a b b b 是两个正整数,求 x x x y y y 满足
         ~~~~~~~~                   ~~~~~~~~          gcd ⁡ ( a , b ) = a x + b y          ( 1 ) \gcd(a ,b) = ax + by~~~~~~~~(1) gcd(a,b)=ax+by        (1)
b ≠ 0 ⇒ gcd ⁡ ( a , b ) = gcd ⁡ ( b , a m o d    b ) b \ne 0 \xRightarrow{} \gcd(a ,b) = \gcd(b ,a\mod b) b=0 gcd(a,b)=gcd(b,amodb) (辗转相除法)

设此时 x ′ x' x y ′ y' y 使得
                 ~~~~~~~~~~~~~~~~                  b x ′ + ( a m o d    b ) y ′ = gcd ⁡ ( b , a m o d    b )          ( 2 ) bx' + (a \mod b) y' = \gcd (b ,a \mod b)~~~~~~~~(2) bx+(amodb)y=gcd(b,amodb)        (2) (跟第二行差不多)
( 1 ) (1) (1) ( 2 ) (2) (2) 可得
                 ~~~~~~~~~~~~~~~~                  b x ′ + ( a m o d    b ) y ′ = a x + b y bx' + (a \mod b) y' = ax + by bx+(amodb)y=ax+by

注意到 a m o d    b = a − ⌊ a b ⌋ b a \mod b = a - \left\lfloor\dfrac{a}{b}\right\rfloor b amodb=abab (此处的括号为向下取整, ⌊ a b ⌋ \left\lfloor\dfrac{a}{b}\right\rfloor ba a ÷ b a \div b a÷b 的商)
所以 a x + b y = b x ′ + ( a − ⌊ a b ⌋ b ) y ′ ax + by = bx' + ( a - \left\lfloor\dfrac{a}{b}\right\rfloor b) y' ax+by=bx+(abab)y

注:我们注意到这个方程里面有个未知数却只有个方程,那么根据线性代数相关知识我们可以知道这东西是有无数组解的。注意到这个等式每一项只与a或b有关,所以我们只需要按照a和b分类一下这个东西就可以获得一组特解
—结尾dalao的博客

变形得
                 ~~~~~~~~~~~~~~~~                  a x + b y = a y ′ + b ( x ′ − ⌊ a b ⌋ y ′ ) ax + by = ay' + b(x' - \left\lfloor\dfrac{a}{b}\right\rfloor y') ax+by=ay+b(xbay)

得一组解 x = y ′ , y = x ′ − ⌊ a b ⌋ y ′ x = y',y = x' - \left\lfloor\dfrac{a}{b}\right\rfloor y' x=y,y=xbay

可以发现这是一个递归的式子,当 b = 0 b = 0 b=0 时是边界

因此,当 b = 0 b = 0 b=0 时,显然 x = 1 , y = 0 x = 1,y = 0 x=1,y=0 时满足 gcd ⁡ ( a , b ) = a x + b y \gcd(a ,b) = ax + by gcd(a,b)=ax+by

代码

#define pa pair <int ,int >
pa exgcd (int r1 ,int r2) {
 if (r2 == 0) return make_pair (1 ,0);
 pa tmp = exgcd (r2 ,r1 % r2);
 pa ans = make_pair (tmp.second ,tmp.first - (r1 / r2) * tmp.second);
 return ans;
}

结语

参考博客(写的真是好)

谢谢大家

——2020.9.30

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值