扩展欧几里得

#include 
#include <string.h>
#include 
using namespace std;

//扩展欧几里得算法
//返回a、b的最大公约数
//求得的x、y是 a*x+b*y=gcd(a,b) 的一个特解

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;
}

int main()
{
    int a,b;
    int x=0;
    int y=0;
    cin>>a>>b;
    int r = exgcd(a,b,x,y);
    cout << a << "*" << x << "+" << b << "*" << y << "=" << r << endl;
    return 0;
}
设 X,Y 是 a*x+b*y=gcd(a,b)的通解则
X = x + b/gcd(a,b)*t;
Y = y - a/gcd(a,b)*t;
其中 x,y 是方程的一个特解,gcd(a,b)为a、b的最大公约数
证明:

扩展欧几里得_第1张图片

推广:
对于方程 a*x + b*y = c
可以先求 a*x = b*y = gcd(a,b)的特解 x0,y0
然后可推出 a*x + b*y = c 的一个特解(x,y)为: x = x0*c/gcd(a,b) y = y0*c/gcd(a,b)
进一步可推出方程 a*x + b*y = c 的通解(X,Y)如下

扩展欧几里得_第2张图片

代码:

#include 
#include <string.h>
#include 
using namespace std;

//扩展欧几里得算法
//返回a、b的最大公约数
//求得的x、y是 a*x+b*y=gcd(a,b) 的一个特解

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;
}

int main()
{
    int a,b,c,x,y;
    cin>>a>>b>>c;
    //求出a*x+b*y=gcd(a,b)的一个特解并赋值给x,y;
    int r = exgcd(a,b,x,y); // r 为 a、b的最大公约数
    //求出a*x+b*y=c的一个特解并赋值给x,y;
    x = x*c/r; //从这里可以看出 a*x + b*y = c 有解的条件是 c能被gcd(a,b)整除
    y = y*c/r;

    //根据通解公式输出100个解
    for(int t = 1;t<=100;t++){
        int X,Y;
        X = x + b/r*t;
        Y = y - a/r*t;
        cout << a << "*" << X << "+" << b << "*" << Y << "=" << c << endl;
    }

    return 0;
}
 

你可能感兴趣的:(扩展欧几里得)