拓展欧几里得算法
2016-03-03 21:52
134 查看
最近学习了拓展欧几里得算法,写下来,加深理解,备忘;
在讲拓展欧几里得算法前,先要了解一下裴蜀定理(贝祖定理);
这个定理讲的是
1、若a,b为整数,gcd(a,b)=d;那么对于任意x,y,ax+by一定是d的倍数,即(ax+by)%d=0;
2、一定存在x,y,使得ax+by=d;
拓展欧几里得算法正是求解其中x,y的一种算法;
拓展欧几里得算法:
目的:给定两个不同时为零的整数a,b,计算gcd(a,b),以及整数x和y,使得ax+by=gcd(a,b);
typedef long long int64;
int64 gcd_ex(int64 a, int64 b,int64& x, int64& y)
其中返回的是gcd(a,b);
程序代码:
原因如下:
a>b>0 时
设 ax1+ by1= gcd(a,b);
bx2+ (a mod b)y2= gcd(b,a mod b);
根据朴素的欧几里得公式有 gcd(a,b) = gcd(b,a mod b);
则:ax1+ by1= bx2+ (a mod b)y2;
即:ax1+ by1= bx2+ (a - [a / b] * b)y2=ay2+
bx2- [a / b] * by2;
也就是ax1+ by1 == ay2+ b(x2- [a / b] *y2);
根据恒等定理得:x1=y2; y1=x2- [a / b] *y2;
在讲拓展欧几里得算法前,先要了解一下裴蜀定理(贝祖定理);
这个定理讲的是
1、若a,b为整数,gcd(a,b)=d;那么对于任意x,y,ax+by一定是d的倍数,即(ax+by)%d=0;
2、一定存在x,y,使得ax+by=d;
拓展欧几里得算法正是求解其中x,y的一种算法;
拓展欧几里得算法:
目的:给定两个不同时为零的整数a,b,计算gcd(a,b),以及整数x和y,使得ax+by=gcd(a,b);
typedef long long int64;
int64 gcd_ex(int64 a, int64 b,int64& x, int64& y)
其中返回的是gcd(a,b);
程序代码:
typedef long long int64; int64 gcd_ex(int64 a, int64 b,int64& x, int64& y) { if (b == 0) { x = 1; y = 0; return a; } int64 d = gcd_ex(b, a % b, y, x););//前半部分和欧几里得算法是一样的; y = y - a / b * x;//这边赋值和上面交换x,y的原因,百度百科讲的挺好的 return d; }
原因如下:
a>b>0 时
设 ax1+ by1= gcd(a,b);
bx2+ (a mod b)y2= gcd(b,a mod b);
根据朴素的欧几里得公式有 gcd(a,b) = gcd(b,a mod b);
则:ax1+ by1= bx2+ (a mod b)y2;
即:ax1+ by1= bx2+ (a - [a / b] * b)y2=ay2+
bx2- [a / b] * by2;
也就是ax1+ by1 == ay2+ b(x2- [a / b] *y2);
根据恒等定理得:x1=y2; y1=x2- [a / b] *y2;
相关文章推荐
- 我眼中的未来计算机和互联网–读《文明之光》第三冊有感
- c++ 基类已经存在virtual修饰的同名成员函数,派生类加不加无所谓,都是virtual的
- easyui datagrid设置fit: true后,页面显示不全的情况
- Linux入门:如何安装Linux
- Problem B: 使用指针访问数组元素--程序填空
- 被需要的元素被埋起来的方法
- Rare Event Analysis
- 83款 网络爬虫开源软件
- swap函数的高效实现:右值引用和move
- 二叉树的先序,中序,后序遍历实现
- 对肺结节几何矩的特征提取
- 【C/C++学院】0907-象棋五子棋代码分析/寻找算法以及排序算法
- 机器学习之路——多重共线性
- Scala中class和object的区别
- c#接口与抽象类的区别
- 第一次作业 邱鹏 2013551628
- bzoj 1492 [NOI2007]货币兑换Cash(斜率dp+cdq分治)
- linux中将可执行程序做成一个服务
- TCP/IP基础(四)
- Android和Js交互