拓展欧几里得算法(数论)

拓展欧几里得是用来计算已经知道ab的时候,让你去求a*x+b*y=GCD(a,b)的一组解(x,y)。(首先根据一些相关数论证明,这个解是一定存在的)

GCD(a,b)应该都知道吧,求a和b的最小公约数。

因为GCD(a,b)=GCD(b,a%b),所以a*x+b*y=GCD(b,a%b),也就意味着a*x+b*y=b*x-(a%b)*y,进而可以得出x*a+y*b=y*a+(x-y*a/b)*b;

最后推到最后是当b为0的时候,a为最小公约数,根据第一个式子,a*x+b*y=a;(但是此时的x和y是进过多次替换过的,并不是最开始的那个x,y了)但是我们可以递归回我们需要的那个最开始的x,y。这就是拓展欧几里得。

代码实现:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int x,y;
int ex_gcd(int a,int b)
{
    int ret,tem;
    if(!b)
    {
        x=1;y=0;
        return a;
    }
    ret=ex_gcd(b,a%b);
    tem=x;
    x=y;
    y=tem-a/b*y;
    return ret;
}
int main()
{
    int a,b,z;
    scanf("%d%d",&a,&b);
    z=ex_gcd(a,b);
    printf("%d %d\n",x,y);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/HANGANG/p/11882454.html