扩展欧几里得算法
首先来说 贝祖定理
如果a,b两数是整数,那么一定存在整数x,y 使得
ax+by=bcd(a,b)
欧几里得算法
int bcd(int a,int b)
{
if(b==0)
return a;
bcd(b,a%b);
}
这个算法很好理解,如果实在看不懂,用笔纸带入两个数相信你能懂
扩展欧几里得算法
代入数字加深理解:
求(50,35)
50=1*35+15 =>15=50-1*35
35=15*2+5 =>5=35-15*2
15=3*5+0
可得出
5=3*35-2*50
下面推到扩展欧几里得算法
首先我们可知
bcd(a,b)=bcd(b,a%b)
即可的如下式子
xa+yb=bcd(a,b)=bcd(b,a%b)=x1b+y1(a%b)
又因为在计算机中
a%b=a-(a/b)*b
带入上式中
xa+yb=x1b+y1(a-(a/b)*b)
化简后得到
xa+yb=y1a+(x1-y1(a/b))b
我们可以得出
上一层深度的x=下一层深度的y1
上一层深度的y=下一层深度的(x1-y1(a/b))
而在最后一层 b=0时就返回x=1 , y=0
此时再根据
x=y1,y=(x1-y1(a/b))
求出
上一层的x=0,y=1
再往上一层x=1,y=a/b*1
再在网上x=a/b*1,y=(1-a/b*1*a/b)
…一直到顶层递归结束
写出算法
int ex_bcd(int a,int b,int &x,int &y){
if(b==0)
{
x=1; //最后一层的情况是 x=a
y=0;
return a;
}
int r = ex_bcd(b,a%b,x,y);
int temp = y; //把x和y 都换成上一层的
y=x-y(a/b);
x=temp;
return r;
}
逆元的概念
首先必须是互质的两数才能求逆元
通常说A是B模C的逆元也就是A*B=1 mod c
也就是A与B的乘积与C取模为1
例子
求7 模 11 的逆元:
也就是求?与7的乘积mod 11为1
可知8x7=5x11+1
则逆元为8
利用扩展欧几里得求逆元
求出的x的值就是逆元