您的位置:首页 > 其它

欧几里得算法(gcd)和扩展欧几里得

2017-03-22 13:41 197 查看
int gcd(int a,int b) 求解a和b的最大公约数

int gcd(int a,int b)
{
if(b==0) return a;
return gcd(b,a%b);
}

这也是俗称的欧几里得算法。
如果a和b的最大公约数是gcd,那么一定存在x和y使得a*x + b*y = gcd,

int e_gcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int ans=e_gcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return ans;
}函数返回值是a,b的最大公约数,x和y就是通解。

扩展欧几里德有什么用处呢?

    求解形如 a*x +b*y = c 的通解,但是一般没有谁会无聊到让你写出一串通解出来,都是让你在通解中选出一些特殊的解,比如一个数对于另一个数的乘法逆元

    什么叫乘法逆元?

    


    这里,我们称 x 是 a 关于 m 的乘法逆元

    这怎么求?可以等价于这样的表达式: a*x + m*y = 1

    看出什么来了吗?没错,当gcd(a , m) != 1 的时候是没有解的这也是 a*x + b*y = c 有解的充要条件: c % gcd(a , b) == 0

int cal(int a,int m)
{
int x,y;
int gcd=e_gcd(a,m,x,y);
if(1%gcd!=0) return -1;
x*=1/gcd;
m=abs(m);
int ans=x%m;
if(ans<=0) ans+=m;
return ans;
}
这个函数就是用来求解a关于m的乘法逆元。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: