码迷,mamicode.com
首页 > 编程语言 > 详细

扩展欧几里得算法

时间:2016-05-04 10:16:36      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:

欧几里德算法

转载:http://blog.sina.com.cn/u/1885661061

原文章地址:http://blog.sina.com.cn/s/blog_7064e7850100yeu1.html

欧几里德算法又称辗转相除法,用于计算两个整数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)的公约数是一样的,其最大公约数也必然相等,得证。

 

利用性质二可得

 1 //求GCD的循环方法
 2 int Gcd(int a,int b)
 3 {
 4   for(int c=a%b;c;a=b,b=c,c=a%b);
 5   return b;
 6 }
 7 
 8 //求GCD的递归方法
 9 int Gcd(int a,int b)
10 {
11     return b?MGcd(b,a%b):a;
12 }
13 
14 //时间复杂度O(lgn)

 

 

扩展欧几里德算法
定理一:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整 数对 x,y ,

使得gcd(a,b)=ax+by。

解:设a、b不全为0,令a>b,

当b=0时,gcd(a,b)=a,解的情况为x=1,y=0

当ab!=0,令

a*x1+b*y1 = gcd(a,b)
b*x2+(a%b)*y2 = gcd(b,a-a/b*b)
又gcd(a,b) = gcd(b,a-a/b*b)
故有a*x1+b*y1 = b*x2+(a%b)*y2
a*x1+b*y1 = b*x2+(a-a/b*b)*y2
= b*x2+a*y2-a/b*by2
= a*y2+b*(x2-a/b*y2)
即有,x1=y2,  y1=x2-a/b*y2
由上推导可知,x1与y1的值可由x2、y2推知,拓展欧几里得算法就是不断地的将b放小,直至b等于0,最后反推求回x和y。

 

1 //算法,解方程ax+by=gcd(a,b),其中d=gcd(a,b)
2 
3 void MEuclid(int a,int b,int &d,int &x,int &y)
4 {
5  if(b==0){d=a;x=1;y=0;return;}
6  MEuclid(b,a%b,d,y,x);
7  y-=x*(a/b);
8 }

 

 

解不定方程ax+by=c 

定理二:对于不定整数方程ax+by=c ,若 c mod gcd(a,b)=0,则该方程存在整数解,否则不存在整数解。 

故当c mod gcd(a,b)=0,先用扩展欧几里得算法求出ax+by=gcd(a,b)的一组解x1,y1。

则x2=x1*c/gcd(a,b),y2=y1*c/gcd(a,b)为ax+by=c的一组解。

x=x2+b/gcd(a,b)*t,y=y2-a/gcd(a,b)*t,(t为整数),即为ax+by=c的所有解。

扩展欧几里得算法

标签:

原文地址:http://www.cnblogs.com/yfs123456/p/5457296.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!