扩展欧几里德

矩阵变换在扩展EUCLID算法中的应用

 

摘要:对于给定的两个正整数a,b, 如何确定两个整数u,v, 使得 au+bv=gcd(a,b), 这里gcd(a,b)表示a,b的最大公约数?本文利用矩阵变换给出两个算法用于求解u,v.

 

众所周知,对于给定的两个正整数a,b, a,b的最大公约数可使用EUCLID算法,其依据是下面的引理。 为了表述方便, 下面均用 a/ba 除以b的商, a%ba 除以b的余数.

引理1:  a,b是两个给定的正整数, a>b. gcd(a, b)=gcd(b, a%b).

引理1的证明可参见文献[1], 这里略去.

我们称 为关于正整数a,b 的变换矩阵。注意到

=

  a1=b, b1=a%b. b10, 则继续对 进行变换,

= =

  a2= b1, b2=a1%b1. b20, 则继续对 进行变换,

… …

=              1

直到 ak%bk=0为止。

    如此便可得到  gcd(a,b)=bk。记矩阵 。由等式(1)可得  = , 即ua+vb=bk=gcd(a,b) 。因此只需计算出矩阵 的乘积,便可求出u, v

初始化 u0=0,v0=1,p0=1, q0=-a/b。若已求出 的积为 , 则 = =   = , uk=pk-1,vk=qk-1,pk=uk-1+(-ak/bk)pk-1, qk= vk-1+(-ak/bk)qk-1

对于给定的两个正整数a,b, 从上面的讨论,我们可给出一个非递归的算法来求出两个整数u,v, 使得 au+bv=gcd(a,b)

int gcd(int a, int b, int *u, int *v )

/* 不妨设  a>b>0, *u, *v返回所求的两个整数, 函数将返回 gcd(a,b)  */

{int tempu, tempv, tempa, p,q;

*u=0,*v=1,p=1, q=-a/b; /*初始化 *u,*v,p, q的值*/

while(1)

{ tempa=a; a=b; b= tempa%b;  if (b==0)break;

 tempu=*u, tempv=*v; 

*u=p,*v=q,p= tempu +(-a/b)*p, q= tempv+(-a/b)*q;

}

return a;

}

 

 

 

这个扩展欧几里德在剩余定理里计算M的逆时有所运用。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值