[模板] 扩展欧几里得算法详解

本文详细介绍了扩展欧几里得算法,包括其核心思想、算法应用和多种扩展,如求解一元线性同余方程组和多元同余方程。通过实例解析,帮助理解如何使用该算法解决数论问题,并提供了经典例题以供实践。
摘要由CSDN通过智能技术生成

算法简介

P.S.扩展欧几里得非常重要,本人在此纠结多时,将经验总结于此。
本算法由欧几里得辗转相除得出:

int Gcd(int a,int b) {
    if(b==0)return a;
    else return Gcd(b,a%b);
}

如此简洁又高效的代码可以快速地解决最大公约数的问题,那么我们能否对其增加一些应用呢?


算法应用

扩展欧几里得算法主要应用在下面三个方面:

①求解不定方程ax+by=c
②求解模的逆元ax≡1(mod m)
③求解同余方程ax≡b(mod m)

可以看出,第②项是第③项的特例,第③项可以化为第①项:ax+my=b


算法核心

要求ax+by=c的解,先求出ax+by=gcd(a,b)(为什么?看后面去)
下面使用扩展欧几里得解出这样的一组特解

long long Exgcd(long long a,long long b,long long &x,long long &y) {
    if(b==0) {
        x=1;
        y=0;
        return a;
    }
    long long ans=Exgcd(b,a%b,x,y),tmp=x;
    x=y;
    y=tmp-a/b*y;
    return ans;
}

对于算法进行解释:
(i)若b=0,则gcd(a,b)=a,x=1,y=0(为什么y=0?因为不定方程有无数组解我们只需要求出一组特解,后面再进行解的放大缩小即可)
(ii)若b≠0,由欧几里得辗转相除可得到
gcd=gcd(a,b)=gcd(b,a%b) ①
因为我们要求gcd=ax+by,又由①得
gcd=bx’+(a%b)y’ ②
因为m%n可以表示为m-(m/n)*n (此处的’/’是整除符号)
故将②变形为:
gcd=bx’+(a-(a/b)*b)y’=ay’+b(x’-(a/b)*y’) ③
又因为gcd=ax+by,则有:x=y’,y=x’-(a/b)*y’

以上过程较为复杂,建议读者在草稿纸上推算一遍,并将算法记忆下来。

下面解决之前留下来的一个问题(蓝色部分):
我们求出了ax+by=gcd(a,b)的一组解,如何解出ax+by=c的所有解呢?
仔细观察这两个方程,就会发现他们相差c/gcd倍
故将原方程乘上c/gcd即可得出答案:
x0=x*c/gcd
y0=y*c/gcd
其中若c%gcd!=0,则无解。

我们可以用这一组特解表示出不定方程的通解:
X=x0+(b/gcd)*t
Y=y0-(a/gcd)*t

下面是证明(伪证):
ax1+by1=c ①
ax2+by2=c ②
①+②得:
ax1+by1=ax2+by2 ③
合并同类项: <

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值