经典算法(5)- 用二进制方法实现扩展的最大公约数(Extended GCD)

二进制方法中,只需要移位(<<和>>)和加减操作(+和-),不像欧几里德算法中需要乘法和除法运算。虽然算法效率更高,但是程序的可读性和可维护性差一些。

 

如果设d=gcd(u,v) = u.x + v.y, 本算法涉及到六种操作:

1)已知ext_gcd(u,v)如何求ext_gcd(u,2v)=u'.x' + v'.y',其中u为奇数,v可奇可偶,d=gcd(u,v)为奇数;

2)已知ext_gcd(u,v)如何求ext_gcd(2u,v)=u'.x' + v'.y',其中v为奇数,u可奇可偶,d=gcd(u,v)为奇数;

3)已知ext_gcd(u-v,v)如何求ext_gcd(u,v)=u'.x' + v'.y';

4)已知ext_gcd(u,u-v)如何求ext_gcd(u,v)=u'.x' + v'.y';

5)已知u/2^c = v = d(c为大于0的整数),如何求ext_gcd(u,v)=u.x' + v.y';

6)已知u= v/2^c = d(c为大于0的整数),如何求ext_gcd(u,v)=u.x' + v.y'.

 

其中第1)种操作比较麻烦,第2)种操作只需要在第1)种操作的基础上将u和v交换一下。下面介绍一下第1)种操作的原理:

在第1)操作中,因为d=gcd(u,2v)=gcd(u-v,v)=(u-v)x+v(x+y),设u1=u-v,x1=x,v1=v,y1=x+y,即问题转化为已知d=u1.x1+u1.y1,求ext_gcd(u,2v)=u.x' + (2v)y'=d;

如果y为偶数,显然可以采用这样一组值:x'=x,y'=y/2;但是如果y为奇数,则需要将d表示为d=u1(x1+v1.k) + v1(y1-u1.k),其中k为正奇数1,3,5....,找到这样的k,满足x' = x +v.k和y'=(y-u.k)/2都不为0。

 

 

第3)种操作比较简单,因为d=gcd(u-v,v) = (u-v)x + vt = ux + v(y-x),即x'=x,y'=y-x;

第4)种操作类似,因为d=gcd(u,u-v) = ux + (u-v)t = u(x+y) - vy,即x'=x+y,y'=-y;

 

第5)种操作,可以得到d=v=u + (1-2^c).v,即x'=1,y'=1-2^c;

第6)种操作只需要在第5)种操作的基础上将u和v交换一下。

 

 

 

在下面的实现中,只有上面第2)和6)种操作需要改变v和y的符号。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值