详解扩展欧几里得算法(扩展GCD)

浅谈扩展欧几里得(扩展GCD)算法

本篇随笔讲解信息学奥林匹克竞赛中数论部分的扩展欧几里得算法。为了更好的阅读本篇随笔,读者最好拥有不低于初中二年级(这是经过慎重考虑所评定的等级)的数学素养。并且已经学会了学习这个算法的前置知识:欧几里得算法。

对于对欧几里得算法还有知识模糊的读者,请不要担心,这里为你准备了前导知识讲解,请移步至本蒟蒻的另两篇博客:

浅谈GCD

求最大公约数的方式

裴蜀定理

裴蜀定理的概念及证明

因为翻译版本的不同,这个定理可能还会被叫做贝祖定理、Be´zout定理等。

裴蜀定理是这样被描述的:

a,bZ,(x,y)Z

满足:

ax+by=gcd(a,b)

文字描述是这样的:对于任意的整数a,b,都存在一对整数x,y,使得ax+by=gcd(a,b)成立。

证明:

来看欧几里得算法求解过程的这个函数:

int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}

可以看出,这是一个递归求解的函数。在函数递归到最后的时候,存在b=0,不管a是什么,这时显然有一对整数x=1,y=0来使得:

a×1+0×0=gcd(a,0)

(ps:0和任何数的最大公约数都等于原数,可以从最大公约数和约数的定义得知)

那么,我们通过这个递归的实现过程来进行回溯的模拟。当b>0,则程序还可以继续往下走:gcd(b,a%b)=gcd(a,b)。这时假设存在一对整数x,y,使得其一定会满足b×x+(a%b)×y=gcd(b,a%b), 因为a%b=aba/b,所以有以下的推导:

b×x+(a%b)×y=gcd(b,a%b)=bx+(aba/b)y=ayb(xa/by)

这个时候令x=y,y=xa/by,再结合一开始的原式子,就得出:

ax+by=gcd(a,b)

因为欧几里得算法的实现是递归的,而我们已经推出其中一个递归过程的实现,那么其他的递归过程就可以借助数学归纳法,一层层地向上推,必然会得出最终结论。

证毕。

裴蜀定理的应用

裴蜀定理:

ax+by=gcd(a,b)

那么可以推出:如果一个数m满足:ax+by=m,那么这个m一定是gcd(a,b)的倍数。

那么对于一个经典方程ax+by=1,利用裴蜀定理,我们有:gcd(a,b)=1,即a,b一定互质。


扩展欧几里得算法

在介绍扩展欧几里得算法之前,我想首先介绍它的应用:

1、求解不定方程

2、求解模的逆元

3、求解线性同余方程

为什么它能应用到这几个方面呢?回到裴蜀定理:

ax+by=m

对于这个不定方程,如果存在一组合法的解(x,y),那么一定会有gcd(a,b)|m,即mgcd(a,b)的倍数。那么现在我不仅想知道到底有没有解,而是想知道在有解的情况下,这个解到底是多少。

这就是求解不定方程的过程。这个解决的算法就叫做扩展欧几里得算法

可以发现,我们求解不定方程其实就是要求解一组合法的(x,y),那么根据裴蜀定理的证明(基于欧几里得算法,采用递归的数学归纳),可以发现x,y的互相推导的关系。

这种采取递归来求解x,y的方法就叫做扩展欧几里得算法。

扩展欧几里得算法的实现:

先放板子:

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 k=x;
    x=y;
    y=k-a/b*y;
    return d;
}

扩展欧几里得算法的实现基于裴蜀定理的证明。实质上相当于在做欧几里得算法(普通GCD)的时候对不定方程ax+by=mx,y也做了更改。所以经过扩展欧几里得算法处理过的x,y就已经是一组合法的可行解了。

这里需要注意一个细节,因为扩展GCD需要对x,y本身进行修改,所以需要在传参数的时候加取址符,这样能保证被修改。

posted @   Seaway-Fu  阅读(10418)  评论(2编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示