• 扩展欧几里德算法证明及代码


    定理:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在无数组整
    数对 x,y ,使得 gcd(a,b)=ax+by。
    证明:
    求解 x,y的方法的理解
    设 a>b。
    1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
    2,a>b>0 时
    设 ax1+ by1= gcd(a,b);
    bx2+ (a mod b)y2= gcd(b,a mod b);
    根据朴素的欧几里德原理有 gcd(a,b) = gcd(b,a mod b);
    则:ax1+ by1= bx2+ (a mod b)y2;
    即:ax1+ by1= bx2+ (a - [a / b] * b)y2=ay2+ bx2- [a / b] * by2;
    也就是ax1+ by1 == ay2+ b(x2- [a / b] *y2);
    根据恒等定理得:x1=y2; y1=x2- [a / b] *y2;
    这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.
    上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。
    应用:如果ax1+ by1= d,并且gcd(a,b)|d;求解不定方程;
         通过扩展欧几里德算法求解逆元(不会证明,以后补)
    void extend_Euclid(ll a, ll b, ll &x, ll &y)
    {
        if(b == 0)
        {
            x = 1;
            y = 0;
            return;
        }
        extend_Euclid(b, a % b, x, y);
        ll tmp = x;
        x = y;
        y = tmp - (a / b) * y;
    }
    

      下面是带求gcd的扩展欧几里德

    void exgcd(int a,int b,int &d,long long &x,long long &y){
        if(!b){
            d=a;
            x=1;
            y=0;
            return;
        }
        exgcd(b,a%b,d,y,x);
        y-=a/b*x;
    }
  • 相关阅读:
    《逍遥法外》观后感
    1237. 螺旋折线
    P2196 挖地雷
    787. 归并排序
    466. 回文日期
    P1032 字串变换
    P1825 [USACO11OPEN]Corn Maze S
    P1162 填涂颜色
    P1101 单词方阵
    P1019 单词接龙
  • 原文地址:https://www.cnblogs.com/jhz033/p/5330252.html
Copyright © 2020-2023  润新知