经典算法(5)- 用二进制方法实现扩展的最大公约数(Extended GCD)
来源:互联网 发布:desktop streamer mac 编辑:程序博客网 时间:2024/06/06 17:44
二进制方法中,只需要移位(<<和>>)和加减操作(+和-),不像欧几里德算法中需要乘法和除法运算。虽然算法效率更高,但是程序的可读性和可维护性差一些。
如果设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的符号。
- 经典算法(5)- 用二进制方法实现扩展的最大公约数(Extended GCD)
- 经典算法(4)- 用欧几里得算法实现扩展的最大公约数(Extended GCD)
- 经典算法(3)- 用二进制方法求两个整数的最大公约数(GCD)
- 经典算法(2)- 用欧几里得算法求两个整数的最大公约数(GCD)
- 最大公约数gcd算法及其扩展
- 扩展欧几里得(Extended Euclid)算法求最大公约数和乘法逆元
- 最大公约数(GCD)的Euclid算法
- 求GCD(最大公约数)的算法
- gcd算法整合(最大公约数)
- 最大公约数(gcd) Java实现
- 拓展欧几里得算法(Extended Gcd)
- 扩展的欧几里得算法求最大公约数的C/C++ 实现
- GCD算法(最大公约数算法)解析
- 算法学习---求最大公约数(Gcd算法)
- 最大公约数求解,GCD算法的通俗解释
- 最大公约数GCD的三种算法程序
- GCD(最大公约数)的函数
- C语言经典算法(一)——求最大公约数的四种方法
- Win32下两种用于C++的线程同步类(多线程实现加锁解锁)
- SQL数据库查询实现行转列与列转行结果SQL语句
- SQL数据库查询实现行转列与列转行结果SQL语句
- perl的特殊变量
- Android开发——Android搜索框架
- 经典算法(5)- 用二进制方法实现扩展的最大公约数(Extended GCD)
- asp函数之一Replace()
- 字符编码笔记:ASCII,Unicode和UTF-8
- Raw Socket源代码(C#)
- android 3D 游戏实现之简单碰撞检测
- python date的strftime的时间格式
- 在企业级开发中使用Try...Catch...会影响效率吗?
- 判断树的两个节点的公共ancestor
- 面向对象和面向过程到底的本质区别?