扩展欧几里得算法

扩展欧几里得算法

算法分析:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。

递归代码

long long extgcd(long long a, long long b, long long &x, long long &y)
{
    long long d, t;
    if (b == 0) { x = 1; y = 0; return a; }
    d = extgcd(b, a % b, x, y);
    t = x - a / b * y; x = y; y = t;
    return d;
}
非递归代码

//非递归代码  
int exgcd(int m,int n,int &x,int &y)    
{    
    int x1,y1,x0,y0;    
    x0=1; y0=0;    
    x1=0; y1=1;    
    x=0; y=1;    
    int r=m%n;    
    int q=(m-r)/n;    
    while(r)    
    {    
        x=x0-q*x1; y=y0-q*y1;    
        x0=x1; y0=y1;    
        x1=x; y1=y;    
        m=n; n=r; r=m%n;    
        q=(m-r)/n;    
    }    
    return n;    
} 

返回的值为ab的最大公约数;
经历extgcd函数X值变为最小解这个解可能为负
可将X的负解变成正解x=x+b/d;y=y-a/r; 直到变成正

应用
扩展欧几里德算法的应用主要有以下三方面:
(1)求解不定方程;
(2)求解模线性方程(线性同余方程);
(3)求解模的逆元;



你可能感兴趣的:(ACM模板)