本文摘自百度百科
如果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(k−1)t2(k−1)t3(k−1)
t1(k)t2(k)t3(k)
分别满足:
t1(k−1)×a+t2(k−1)×b=t3(k−1)
t1(k)×a+t2(k)×b=t3(k)
根据扩展欧几里德算法,假设t3(k-1) = j t3(k) + r
则:
t3(k+1)=r
t2(k+1)=t2(k−1)−j×t2(k)
t1(k+1)=t1(k−1)−j×t1(k)
则:
t1(k+1)×a+t2(k+1)×b
=t1(k−1)×a−j×t1(k)×a+t2(k−1)×b−j×t2(k)×b
=t3(k−1)−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;
}
}