【专题】欧几里得&扩展欧几里得算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cdy1206473601/article/details/80906667

朴素的欧几里得算法大家应该知道

g c d ( a , b ) 表示a,b的最大公约数
朴素的欧几里得算法其实就是所谓的辗转相除法

  • 辗转相除法
    g c d ( a , b ) = g c d ( b , a m o d b )
    证明如下:
    r = a m o d b = a a b b , p = g c d ( a , b ) ;
    a = x p , b = y p

    代入可得
    r = x p x p y p y p

    提公因式得
    r = p ( x x p y p y )

    所以
    p | r

    a , b r

    p = g c d ( b , r )
    b = x p , r = y p

    a = r + a b b

    代入得
    a = y p + a b x p

    提公因式
    a = p ( y + a b x )

    所以
    p | a

    得出结论:a,b与b,a mod b的公约数相同,所以最大公约数也相同
    得证;

Code:

int gcd(int a,int b) 
{
    if(!b) return a; 
    else return gcd(b,a%b);
}

扩展欧几里得算法

扩展欧几里得算法就是在朴素的欧几里得算法上求一组未知数(x,y)的解,满足贝祖定理: a x + b y = g c d ( a , b )

  • 公式的推导
    当且仅当 a > b
    b = 0 x = 1 , y = 0
    a > b > 0
    a x 1 + b y 1 = g c d ( a , b ) ; b x 2 + ( a m o d b ) y 2 = g c d ( b , a m o d b )
    由朴素欧几里得算法得: g c d ( a , b ) = g c d ( b , a m o d b )
    所以 a x 1 + b y 1 = b x 2 + ( a m o d b ) y 2
    a x 1 + b y 1 = b x 2 + ( a a b b ) y 2
    化简得: a x 1 + b y 1 = b x 2 + a y 2 a b b y 2
    由贝祖等式得 { x 1 = y 2 y 1 = x 2 a b b
    ##Code:
int exgcd(int a,int b,int &x,int &y) 
{
    if(b==0) 
    {
        x=1;y=0;
        return a;
    }
    int r=exgcd(b,a%b,x,y);
    int z=x;
    x=y;y=z-a/b*y;
    return r;
}

扩展欧几里得应用

①解不定方程
②解线性同余方程
③求模的逆元

1.解形如ax+by=c的不定方程

用扩展欧几里得算法求出解 a x + b y = g c d ( a , b )
再分别乘上 c g c d ( a , b )
c m o d g c d ( a , b ) 0 时无解

2.解形如 a x b ( m o d m ) 的线性同余方程

a x m y = b

a x + m ( y ) = b

得出:
a x + m y = b

同上解除即可。

3.求 a x 1 ( m o d m )

由上式子可得 x 1 a ( m o d m )
所以 x是a的逆元
同②得: a x + m y = 1
解出x即可.

猜你喜欢

转载自blog.csdn.net/cdy1206473601/article/details/80906667