扩展欧几里得算法分析详细

扩展欧几里得算法

首先来说 贝祖定理

如果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的值就是逆元

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值