扩展欧几里得算法---Extended Euclidean algorithm
2013-08-11 11:01
741 查看
概述
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:gcd函数就是用来求(a,b)的最大公约数的。
gcd函数的基本性质:
gcd(a,b)=gcd(b,a)=gcd(-a,b)=gcd(|a|,|b|)
公式表述
gcd(a,b)=gcd(b,a mod b)证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a, d|b,而r = a - kb,因此d|r
因此d是(b,a mod b)的公约数
假设d 是(b,a mod b)的公约数,则
d | b , d |r ,但是a = kb +r
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
扩展的:
用数学语言来表述:求整数x和y使得 ax+by=c.可以发现如果gcd(a,b) | c 不成立,也就是c不是a,b最大公约数的倍数,那么显然无整数解。
所以我们一般求ax+by=gcd(a,b),只要求得一对整数解 (x,y)那么任意的c(整除gcd(a,b))就可以得到,只要在两边同时乘以一个倍数即可。
代码:
#include <iostream> using namespace std; int ext_gcd(int a,int b,int &x,int &y){ if(b==0){ x=1; y=0; return a; } int d=ext_gcd(b,a%b,y,x); y=y-(a/b)*x; // x=_y; return d; // y=_x-(a/b)*_y; } int main() { int x,y,a=99,b=78; cout<<ext_gcd(a,b,x,y)<<endl; cout<<x<<" "<<y<<endl; }说明:
假设我们已经得到了:
_d=gcd(b,a mod b) 和 _d=b*_x+(a mod b)*_y 的(_d,_x,_y)对于递归过程来说,有
d=gcd(a,b)=_d=gcd(b,a mod b),那么为了得到满足 d=ax+by的x和y,利用上述等式d=_d进行变形:
d=b*_x+(a-(a/b))*_y=a*_y+b(_x-(a/b)*_y)
当选择x=_y和y=_x-(a/b)*_y就可以满足等式。这样递归就可以进行下去,当然递归的终止条件是: b==0, return (a,1,0)
相关文章推荐
- 基础数论学习笔记-----------拓展欧几里得算法【Extended Euclidean Algorithm】
- 欧几里得原理及扩展欧几里得原理(Euclidean Theory and Extended Euclidean Theory)学习笔记
- extended euclidean algorithm 双六问题 2018-2-10
- 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm
- Extended Euclidean algorithm
- 欧几里德欧几里德原理和扩展的原则,(Euclidean Theory and Extended Euclidean Theory)学习笔记
- 欧几里得算法扩展(extended gcd)--解不定方程_初入门
- 扩展欧几里得算法
- 欧几里得、扩展的欧几里得算法 .
- 初步了解欧几里得算法与扩展欧几里得
- Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)
- 扩展欧几里得算法
- 扩展欧几里得算法
- poj 1061青蛙的约会 (数论:扩展的欧几里得算法)
- Algorithm: Extended Euclid's Algorithm
- 扩展的欧几里得算法的应用
- Extended Regular Expression 扩展正则的使用
- 用程序动态增加扩展类型(ExtendedDataType)
- Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)
- 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)