扩展欧几里德算法

欧几里德算法戳这


 一、概述

扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。——百度百科

二、代码实现

//摘自《挑战程序设计竞赛 第二版》
int extgcd(int a,int b,int& x,int& y){
int d=a;
if (b!=0){
    d=extgcd(b,a%b,y,x);
    y-=(a/b)*x;
}else{
    x=1;y=0;
}
return d;
}

三、算法分析 (摘自http://blog.csdn.net/acmore_xiong/article/details/47694909)

需要用到的欧几里德表达式

①gcd(a,b)=gcd(b,a%b)

②gcd(a,0)=a

设如下两个方程:

ax+by  =  gcd(a,b)  =  d;

bx’+(a%b)y’  =  gcd(b,a%b);

因为,gcd(a,b)  =  gcd(b,a %b),

所以,ax+by  =  bx’+(a%b)y’  =  bx’ +(a – [a/b]*b)y’  =  ay’ + b(x’ – [a/b]y’),

恒等关系有 x = y’ , y = (x’ – [a/b]y’),[a/b]表示a/b的值向下取整。

所以参数x,y不断的被取代,函数递归下去,但是a%b会等于0,等于0时,gcd(a,0)=a,所以a*x+0*y=a,x=1,y=0。然后返回得到x,y的值。

原文地址:https://www.cnblogs.com/LuRenJiang/p/7445734.html