扩展欧几里得详解

扩展欧几里得

  • 裴蜀定理

方程ax + by = c有解的充要条件是(a, b) 是 c 的因数,换种说法,即c为gcd(a, b)(a,b的最大公约数)的倍数

引入gcd(a, b)

int gcd (int a, int b) {
    if (b == 0) 
        return a;
    else
        return gcd(b, a % b);
}
  • 丢番图方程

不定方程(丢番图方程)是指未知数的个数多于方程个数,且未知数受到某些限制(即要求有理数、整数或正整数等)的方程式或方程组

  • 逆元

引入求余概念

(a + b) % p = (a%p + b%p) % p (Y)

(a - b) % p = (a%p - b%p) % p (Y)

(a * b) % p = (a%p * b%p) % p (Y)

(a / b) % p = (a%p / b%p) % p (N)

除法是不成立的

a * x = 1

那么x是a的倒数,x = 1/a

如果a不是1,那x就是小数

在数论中, 很多时候都需要求余,所以问题变成

a * x = 1 (mod p)  此时x一定等于1/a吗,显然不是

此时,我们就把x看成a的倒数,但是加了一个求余条件,所以x叫做 a关于p的逆元

例如 2 * 3 % 5 = 1,那么3就是2关于5的逆元,也可以说2和3关于5互为逆元

(注意,只有a和p互质,a才有关于p的逆元)

来到我们的重头戏扩展欧几里得了

a * x + b * y = 1, 如果a和b互质,有解

这个解的x就是a关于b的逆元, y就是b关于a的逆元

为什么呢?

对公式两边同时求余b

a * x % b  + b * y  %  b = 1 % b

a * x % b = 1 % b   => a * x = 1 (mod b)

同理 同时求余a

b * y % a = 1 % a    => b * y = 1 (mod a)

 

我们假设 a  > b

1、当 b = 0 时,gcd(a, b) = a, 此时 x = 1, y = 0

2、当 a * b != 0 时

a  * x1  + b * y1 = gcd(a, b)

让 a = b

有 b * x2 + (a mod b) y2 = gcd (b, a mod b)

我们由朴素欧几里得得出 gcd (a, b) = gcd (b, a mod b);

根据恒等

a * x1 + b * y1 = b * x2 + (a mod b) * y2 

a mod b = a - (a/b)*b

代入上式得

a * x1 + b * y1 = b * x2 + a*y2 - (a/b)*b*y2

有 x1 = y2,     y1 = x2 - (a/b)*y2

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值