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

数论初步——扩展欧几里得算法

时间:2017-09-10 12:41:41      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:gcd   举例   nbsp   程序   span   div   欧几里得   sub   cpp   

具体内容见紫书p313-p314

一、扩展欧几里得算法

思想:找出一对整数(x,y),使得ax+by=gcd(a,b) 

举例:当“a=6,b=15”时,gcd(6,15)=3,故可以得到解“x=3,y=-1”,当然还有其他解“x=-2,y=1”。

程序:

/*	扩展欧几里得算法	*/ 
void gcd(int a, int b, int& d, int& x, int& y)
{
	if(b == 0){			//边界,因为 a = gcd(a,0) = ax + 0y ,所以 x=1 , y=0 
		d = a;	x = 1;	y = 0;
	}
	else{
		gcd(b, a%b, d, y, x);		//x和y顺序变了 
		y -= x*(a/b); 
	}
}

  

下面方程中的a,b,c为任意整数。

结论1:若方程ax+by=c的一组整数解为(x0,y0),则它的任意整数解都可以写成(x0+kb‘,y0-ka‘),其中a‘ = a/gcd(a,b),b‘ = b/gcd(a,b),k取任意整数。

结论2:设g = gcd(a,b),方程 ax+by=g的一组解是(x0,y0),则当c是g的倍数时ax+by=c的一组解是(x0c/g,y0c/g);当c不是g的倍数时无整数解。

数论初步——扩展欧几里得算法

标签:gcd   举例   nbsp   程序   span   div   欧几里得   sub   cpp   

原文地址:http://www.cnblogs.com/xzxl/p/7500460.html

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