欧几里得算法(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 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的乘法逆元。
相关文章推荐
- GCD/扩展欧几里得
- ACM_欧几里得(GCD) 扩展欧几里得(EXGCD)
- 初步了解欧几里得算法与扩展欧几里得
- 欧几里得算法和扩展欧几里得算法
- gcd,扩展欧几里得,中国剩余定理
- 欧几里得gcd+扩展欧几里得exgcd模板
- 扩展欧几里得(extgcd)
- SGU 106 The equation (GCD·我所理解的扩展欧几里得)
- 欧几里得-GCD及扩展
- 扩展欧几里得求方程 ax+by=gcd(a,b) 的解
- 欧几里得-GCD及扩展
- 欧几里得算法及扩展欧几里得
- gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)
- 欧几里得算法扩展(extended gcd)--解不定方程_初入门
- 欧几里得+扩展的欧几里得算法+线性同余方程+中国剩余定理
- 欧几里得算法(辗转相除)&扩展欧几里得
- hdu_1222_欧几里得_gcd简单应用_欧几里得扩展性质
- 欧几里得、扩展的欧几里得算法
- 欧几里得、扩展的欧几里得算法 .
- HDU 2669 Romantic (扩展欧几里得定理)