扩展欧几里得算法

本文摘自百度百科

如果gcd(a,b)=d,则存在m,n,使得d = ma + nb,称呼这种关系为a、b组合整数d,m,n称为组合系数。当d=1时,有 ma + nb = 1 ,此时可以看出m是a模b的乘法逆元,n是b模a的乘法逆元。
为了证明上面的结论,我们把上述计算中xi、yi看成ti的迭代初始值,考察一组数(t1,t2,t3),用归纳法证明:当通过扩展欧几里德算法计算后,每一行都满足 a×t1+b×t2=t3

1×a+0×b=a
0×a+1×b=b

假设前k行都成立,考察第k+1行
对于k-1行和k行有

t1(k1)t2(k1)t3(k1)
t1(k)t2(k)t3(k)

分别满足:

t1(k1)×a+t2(k1)×b=t3(k1)
t1(k)×a+t2(k)×b=t3(k)

根据扩展欧几里德算法,假设t3(k-1) = j t3(k) + r
则:

t3(k+1)=r
t2(k+1)=t2(k1)j×t2(k)
t1(k+1)=t1(k1)j×t1(k)

则:

t1(k+1)×a+t2(k+1)×b
=t1(k1)×aj×t1(k)×a+t2(k1)×bj×t2(k)×b
=t3(k1)jt3(k)=r
=t3(k+1)

得证
因此,当最终t3迭代计算到1时,有t1× a + t2 × b = 1,显然,t1是a模b的乘法逆元,t2是b模a的乘法逆元。

C语言描述

int gcd(int a,int b,int &ar,int &br)
{
    int x1,x2,x3;
    int y1,y2,y3;
    int t1,t2,t3;
    if(0==a)//有一个数为0,就不存在乘法逆元
    {
        ar=0;br=0;
        return b;
    }
    if(0==b)
    {
        ar=0;br=0;
        return a;
    }
    x1=1;x2=0;x3=a;
    y1=0;y2=1;y3=b;
    int nk;
    for(t3=x3%y3;t3!=0;t3=x3%y3)
    {
        k=x3/y3;
        t2=x2-k*y2;t1=x1-k*y1;
        x1=y1;x2=y2;x3=y3;
        y1=t1;y2=t2;y3=t3;
    }
    if(y3==1)//有乘法逆元
    {
        ar=(y2+b)%b;//对求出来负的乘法逆元进行处理,使之在模b的完全剩余集里
        br=(y1+a)%a;//原来这里是错的
        return 1;
    }
    else//公约数不为1,无乘法逆元
    {
        ar=0;
        br=0;
        return y3;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值