欧几里得扩展算法

来源:互联网 发布:网络安全教育考试 编辑:程序博客网 时间:2024/06/05 20:58
对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整
数对 x,y ,使得 gcd(a,b)=ax+by。
void extendGcd(__int64 a,__int64 b,__int64 &x,__int64 &y)
{
if(b==0)
{
x = 1;
y = 0;
return;
}
extendGcd(b,a%b,x,y);
__int64 temp;
temp = x;
x = y;
y = temp - a/b*y;
}


void main()
{
__int64 a,b,x,y;
while(scanf("%I64d %I64d",&a,&b)!=EOF)
{
extendGcd(a,b,x,y);
printf("%I64d %I64d\n",x,y);
}
}

通解x = x0 + b,y = y0 -a;
设 ax1+by1=gcd(a,b);
bx2+(a mod b)y2=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;
根据恒等定理得:x1=y2; y1=x2-[a/b]*y2;
这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.

原创粉丝点击