Exgcd(拓展欧几里得算法)的初步理解

这篇具有很好参考价值的文章主要介绍了Exgcd(拓展欧几里得算法)的初步理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

裴蜀定理

若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.

Exgcd

针对于一次不定方程ax+by=c进行求解,利用以上的裴蜀定理可以进行求解,当然要满足 gcd(a,b)|c 这个前置情况这个时候实际上就是对于

b*x+(a%b)*y=d(辗转相除法求得)

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

进行带入即可得到:

a*y-b*(x-(a/b)*y)=d

和原式ax+by=d对比可以知道辗转相除的过程中:

x=y,y=x-(a/b)*y

所以我们可以得到exgcd的过程为:

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

解决了exgcd的过程,我们就要看它的作用,解一次不定方程ax+by=c.此时求出来的x,y还不是该方程的解,此时还是ax+by=gcd(a,b)的解(不满足gcd(a,b)|c则无解).我们将x和y均除以gcd(a,b)在乘以一个c就是一组方程的特解.那么如何求通解呢?

取一组x,y和刚刚求出来的特解x0,y0:

ax+by=ax0+by0

a(x-x0)=b(y0-y)两边同时除以d(即为gcd(a,b))

a/d*(x-x0)=b/d*(y0-y)

已知此时a/d和b/d是互质的,那么可知(x-x0)和b/d,(y0-y)和a/d成倍数关系,可以进一步退出下面的式子:

x=x0+k*b/d;

y=y0-k*a/d;

注意此时的k可以取任意值,那么这里的加号和减号表示的就是两者符号相反,而不是真正意义上的家或者减.这就是通解.

利用这个我们也可以求出x,y的最小值,就直接用(x%(b/d)+(b/d))%(b/d)即可,y的最小值同理.当x取最小值时,y取最大,反之亦然.

下面是实站例子:

【模板】二元一次不定方程 (exgcd) - 洛谷https://www.luogu.com.cn/problem/P5656板子题.上代码,代码有注释:

#include<bits/stdc++.h>
#define int long long
using namespace std;
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,y,x);
    y-=(a/b*x);
    return d;
}
//exgcd板子
void solve()
{
    int a,b,c,x,y;
    scanf("%lld%lld%lld",&a,&b,&c);
    int d=exgcd(a,b,x,y);
    if(c%d)
    {
        printf("-1\n");
        return ;
    }
//这表示不符合裴蜀定理,不成立
    else
    {
        x=x*c/d;
        y=y*c/d;
        int minx=(x%(b/d)+b/d)%(b/d);
        if(minx==0)
            minx+=b/d;
        int miny=(y%(a/d)+a/d)%(a/d);
        if(miny==0)
            miny+=a/d;
//分别求出x,y的最小值
        int maxx=(c-b*miny)/a;
        int maxy=(c-a*minx)/b;
        if(maxx<=0||maxy<=0)
        {
            printf("%lld %lld\n",minx,miny);    
            return ;
        }
//求出x,y的最大值,原理就是当x,y分别取最小时,对方都是处于最大值的状态
//当最大值不是正整数时,只输出最小的情况
        int num=(maxx-minx)/(b/d)+1;
        printf("%lld %lld %lld %lld %lld\n",num,minx,miny,maxx,maxy);
    }
    return;
}
signed main()
{
    int t;
    scanf("%d",&t);
    while(t--)
        solve();
    return 0;
}

青蛙的约会 - 洛谷https://www.luogu.com.cn/problem/P1516这题老演员了,见挺多次了.

这题和上题稍微不太一样,我们不能直接用exgcd,要列出式子然后自己进行变形,变为exgcd的形式然后进行求解.我们设跳跃了p次,青蛙A调了q圈才追上青蛙B,所以我们可以列出式子:

(m-n)q=pl+(y-x)

进行变形后:

(m-n)q-pl=(y-x)

形似ax+by=c,直接带入exgcd进行计算即可,注意用裴蜀定理判断是否能成功追上.

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);
    y-=(a/b*x);
    return d;
}
void solve()
{
    int x,y,m,n,l,p,q;
    scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
    int d=exgcd(m-n,l,p,q);
    if((y-x)%d)
    {
        printf("Impossible\n");
    }
    else
    {
        l=abs(l/d);
        p=p*(y-x)/d;
        printf("%lld\n",(p%l+l)%l);
    }
    return ;
}
signed main()
{
    solve();
    return 0;
}

当然有一些同余方程也可以进行变形:

可以变形为ax+km=b文章来源地址https://www.toymoban.com/news/detail-602290.html

到了这里,关于Exgcd(拓展欧几里得算法)的初步理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法基础 & 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理)

    原文链接 首先,在算法竞赛中,很多情况下会遇到数值很大的数据,这个时候,题目往往会让我们对某个数去摸,来控制数据范围。 在±*运算中,我们可以对每个数单独取模,然后再对运算之后的数取模。 但是除法比较特殊,例如: ( 40 ÷ 5 ) m o d 10 ≠ ( ( 40 m o d 10 ) ÷ ( 5

    2024年01月23日
    浏览(37)
  • 一文看懂什么是欧几里得算法!多图演示辗转相除算法究竟是什么!为什么要这样开展!多图预警!

    ps:全文图片均为手绘,如果有不标准的地方还望谅解,之后会慢慢熟悉画图工具的,感谢感谢!!! 欧几里得算法 又称为 辗转相除法 ,是指用于计算两个非负整数a,b的最大 公约数 。 两个整数的最大公约数是指能够同时整除它们的最大的正整数。 辗转相除法能够实现效

    2024年02月02日
    浏览(40)
  • 快乐地谈谈:关于RSA算法中求私钥d的欧几里得方法(辗转相除法)考试向的欸

    关于RSA算法本身,就提及一下,它是属于非对称密码体制. 基本的加密方式就如下图所示: c为加密后的密文,m为加密前的明文 其中一般会给出公开密钥n、e的值,这样根据规则,便可以实现加密过程。而题目往往需要进行解密,那么就需要 先求解出p、q,随后再求解出私钥

    2024年02月04日
    浏览(29)
  • Python欧几里得距离变换

    edt ,即 Euclidean distance transform. ,欧氏距离变换。对于一个二值矩阵 A A A ,元素 a ∈ A ain A a ∈ A ,则 edt ⁡ ( a ) operatorname{edt}(a) edt ( a ) 为 a a a 到矩阵中0元素的最短距离。假设现有一矩阵 A = [ 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 ] A = begin{bmatrix} 01111\\\\ 00111\\\\ 01111\\\\ 01110\\\\

    2024年02月06日
    浏览(28)
  • 【非欧几里得域信号的信号处理】使用经典信号处理和图信号处理在一维和二维欧几里得域信号上应用低通滤波器研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 算例1 2.2 算例2 2.3 算例3  2.4 算例4 

    2024年02月13日
    浏览(41)
  • 机器学习中的数学——距离定义(一):欧几里得距离(Euclidean Distance)

    分类目录:《机器学习中的数学》总目录 相关文章: · 距离定义:基础知识 · 距离定义(一):欧几里得距离(Euclidean Distance) · 距离定义(二):曼哈顿距离(Manhattan Distance) · 距离定义(三):闵可夫斯基距离(Minkowski Distance) · 距离定义(四):切比雪夫距离(

    2023年04月11日
    浏览(28)
  • 【抽象代数】素理想、极大理想、唯一析因环、主理想整环、欧几里得环

    设 R R R 是一个环, I I I 是 R R R 的理想,若 a b ∈ I ⇒ a ∈ I abin I Rightarrow a in I a b ∈ I ⇒ a ∈ I 或 b ∈ I b in I b ∈ I ,则称 I I I 是素理想。 例: 整数环 p p p (由元素p生成的主理想), 若p是素数,且 a b ∈   p ab in p a b ∈   p ,则 p ∣ a b p | ab p ∣ a b , p ∣ a 或 p ∣

    2024年02月09日
    浏览(36)
  • 算法修炼之筑基篇——筑基二层后期(初步理解解决贪心算法)

    ✨ 博主: 命运之光 🦄 专栏: 算法修炼之练气篇 🍓 专栏: 算法修炼之筑基篇 ✨ 博主的其他文章: 点击进入博主的主页 前言: 学习了算法修炼之练气篇想必各位蒟蒻们的基础已经非常的扎实了,下来我们进阶到算法修炼之筑基篇的学习。筑基期和练气期难度可谓是天差

    2024年02月11日
    浏览(26)
  • 算法学习笔记-exgcd

    (operatorname {exgcd}) ,顾名思义,是 (gcd) 的一种扩展。 (gcd) 是求最大公因数,所用到的是辗转相除法,基于 (gcd(a,b)=gcd(b,amod b) (ab)) 的原理,在学习 (operatorname{exgcd}) 前,请确保已掌握 (gcd) ,并懂得一点数学归纳法。如果您已掌握这些前置知识,请开始学习。 先看

    2024年02月13日
    浏览(22)
  • 算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理

    互质就是两个数的最大公因数只有1,体现到代码里面就是 a和b互质,则b mod a = 1 mod a (目前我不是很理解,但是可以这样理解:a和b的最大公因数是1,即1作为除数和b作为除数时,对于被除数a来说余数是一样的,即1/a的余数和b/a是一样的,即 b mod a = 1 mod a ) 欧拉函数的作用是

    2024年02月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包