版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cdy1206473601/article/details/80906667
朴素的欧几里得算法大家应该知道
gcd(a,b)
表示a,b的最大公约数
朴素的欧几里得算法其实就是所谓的辗转相除法
- 辗转相除法
gcd(a,b)=gcd(b,a
mod
b)
证明如下:
设r=a
mod
b
=a−⌊ab⌋∗b
,
p=gcd(a,b)
;
则
a=xp,b=yp
代入可得
r=xp−⌊xpyp⌋∗yp
提公因式得
r=p(x−⌊xpyp⌋∗y)
所以
p|r
即
a,b的最大公约数也是r的约数
设
p‘=gcd(b,r)
则
b=x‘p‘,r=y‘p‘
a=r+⌊ab⌋∗b
代入得
a=y‘p‘+⌊ab⌋∗x‘p‘
提公因式
a=p‘(y‘+⌊ab⌋∗x‘)
所以
p‘|a
得出结论:a,b与b,a mod b的公约数相同,所以最大公约数也相同
得证;
Code:
int gcd(int a,int b)
{
if(!b) return a;
else return gcd(b,a%b);
}
扩展欧几里得算法
扩展欧几里得算法就是在朴素的欧几里得算法上求一组未知数(x,y)的解,满足贝祖定理:
ax+by=gcd(a,b)
- 公式的推导
当且仅当
a>b
①
b=0
则
x=1,y=0
②
a>b>0
设
ax1+by1=gcd(a,b);bx2+(a
mod
b)y2=gcd(b,a
mod
b)
由朴素欧几里得算法得:
gcd(a,b)=gcd(b,a
mod
b)
所以
ax1+by1=bx2+(a
mod
b)y2
即
ax1+by1=bx2+(a−⌊ab⌋∗b)y2
化简得:
ax1+by1=bx2+ay2−⌊ab⌋∗b∗y2
由贝祖等式得
{x1=y2y1=x2−⌊ab⌋∗b
##Code:
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
int r=exgcd(b,a%b,x,y);
int z=x;
x=y;y=z-a/b*y;
return r;
}
扩展欧几里得应用
①解不定方程
②解线性同余方程
③求模的逆元
1.解形如ax+by=c的不定方程
用扩展欧几里得算法求出解
ax‘+by‘=gcd(a,b)
再分别乘上
cgcd(a,b)
当
c
mod
gcd(a,b)≠0
时无解
2.解形如
ax≡b(mod
m)
的线性同余方程
即
ax−my=b
ax+m(−y)=b
得出:
ax+my=b
同上解除即可。
3.求
ax≡1(mod
m)
由上式子可得
x≡1a(mod
m)
所以 x是a的逆元
同②得:
ax+my=1
解出x即可.