(扩展)欧几里德算法

转载 2015年07月06日 20:01:02

欧几里德是用来求最大公约数的,可以把它看成是状态转移,

对任意两个数a,b(a>b),d=gcd(a,b),如果b不为零,那么gcd(a,b)=gcd(b,a%b)

        证明: 令 r=a%b,即存在k,使得 a=b*k+r,那么r=a-b*k;显然r>=0,  r%d=((a%d)-(b*k)%d)%d,因为a%d=b%d=0,所以r%d=0;

因此求gcd(a,b)可以转移到求gcd(b,a%b),那么这就是个递归过程了,那什么时候递归结束呢,想一下,a,b不能为零,则可以把当b为零,作为递归的结束(当然还可以以其它结束条件),这就是求最大公约数的方法可以以其它结束条件),这就是求最大公约数的方法


int gcd(int a,int b)
{
    if(b==0)return a;
 
    else return gcd(b,a%b);
 }

是不是很简单呀.

理解了上面,那么扩展欧几里得就能很容易理解了,对任意a,b(a>b),我们列出这样一个式子: a*x+b*y=gcd(a,b);

不要觉得扩展欧几里得很牛逼,它就是一个算x,y的一个方法,只是在上面gcd中多了处理x,y的步骤

我们这样来想:

已知当前的一个状态:a1  b1  x1  y1,    a1*x1+b1*y1=gcd(a1,b1),注意这里的a1,b1是求gcd(a,b)中的一个状态,

假设 (a1,b1)是由(a0,b0)转移过去的

那么:   a1=b0 ;     b1=a0%b0=a0-k*b0 (k=int(a0/b0));gcd(a0,b0)=gcd(a1,b1);

代入a1*x1+b1*y1=gcd(a1,b1),变化成:b0*x1+(a0-k*b0)*y1=gcd(a1,b1)=gcd(a0,b0);

a0*y1+b0*(x1-k*y1)=gcd(a0,b0);

这样可以得到: x0=y1;  y0=x1-k*y1;(理解这个过程了么,由当前状态可以算出上一状态的x,y,即当前状态可以由它的下一个状态的x,y得到)

int exGcd(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1;
		y=0;
		return a;// 此时a是最开始(a,b)的最大公约数,那么  gcd(a,b)*1+ 0*0=gcd(a,b),肯定对的,在这里,我认为,y可以为任何值都对
	}
	
	int d=exGcd(b,a%b,y,x);
	y-=a/b*x;
	return d;//返回最大公约数
}

需要注意一点的就是方程得到的解不止一个是一个通解!


关于求解二元一次不定方程ax+by=c

    首先,如果c不是gcd(a,b)的倍数,方程显然无解。

扩展欧几里得求解的是ax+by=gcd(a,b)=1的可行解,但是题目中并没有说ca,b互质之类的条件,所以需要在开始时两边同时除以gcd(a,b)

d=gcd(a,b)

a'=a/d,b'=b/d,c'=c/d,

则下面需要求解a'x+b'y=c'的整数解,而gcd(a',b')=1

则我们只需求a'x+b'y=1的可行解

直接使用扩展欧几里得,得到(x',y'),则最终解为x'*c',y'*c'设为(x0,y0)

 

现在得到了一组可行解,但是如何得到通解呢?

(x0,y0)代入ax+by=c,则有

a*(x0)+b*(y0)=c

通过拆添项,可有:

a*(x0+1*b)+b*(y0-1*a)=c

a*(x0+2*b)+b*(y0-2*a)=c

a*(x0+3*b)+b*(y0-3*a)=c

……

a*(x0+k*b)+b*(y0-k*a)=c  (kZ)

至此,我们得到了通解的方程

x=x0+k*b

y=y0-k*a  (kZ)

这样,所有满足ax+by=c的可行解都可求出。



扩展欧几里德算法(附证明)

扩展欧几里德算法(附证明) 扩展欧几里得算法在acm-icpc中是常用算法,主要用于在已知a,b的情况下求解一组x,y,使它们满足贝祖等式: ax+by=gcd(a,b)=dax+by = gcd(a...
  • lincifer
  • lincifer
  • 2015年10月24日 23:45
  • 4244

扩展欧几里德算法 递归和非递归实现及证明

关于欧几里得算法,贝祖等式,扩展欧几里得算法,Wikipedia的解释非常非常详细了。 另外,看了好多别人优秀的总结,我认为最详尽的就是ACM之家的总结。 这里自己再总结一次…实际上就是把别人...
  • yoer77
  • yoer77
  • 2017年04月07日 16:19
  • 1420

欧几里得 & 拓展欧几里得算法 讲解 (Euclid & Extend- Euclid Algorithm)

欧几里得& 拓展欧几里得(Euclid & Extend-Euclid) 欧几里得算法(Euclid) 背景: 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。 ——百度百科 代码...
  • ACMore_Xiong
  • ACMore_Xiong
  • 2015年08月16日 02:10
  • 7951

扩展欧几里德算法计算乘法逆元详解

乘法逆元的定义:       A * X MOD N == 1则称X为A关于模N的乘法逆元。 注:       只有两个数互素的时候才会有乘法逆元。       两个数不互素是没有乘法逆元的。   费...
  • Wind_white
  • Wind_white
  • 2017年03月12日 13:41
  • 1243

扩展欧几里得算法及其应用

可公度线段与欧几里得(Euclid)算法 扩展欧几里得算法是欧几里得算法(又叫辗转相除法)的扩展。已知整数 a,ba,b,扩展欧几里得算法可以在求得 a,ba,b 的最大公约数(gcd(a,b)gcd...
  • lanchunhui
  • lanchunhui
  • 2016年01月27日 11:36
  • 1223

对于拓展欧几里德算法的理解

对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整 数对 x,y ,使得 gcd(a,b)=ax+by。 c++语言的实现: int exgcd(l...
  • yeweiyang16
  • yeweiyang16
  • 2015年08月02日 08:15
  • 472

Ural 1141. RSA Attack 扩展欧几里得算法

1141. RSA Attack Time limit: 1.0 second Memory limit: 64 MB The RSA problem is the following: gi...
  • jyysc2010
  • jyysc2010
  • 2013年08月03日 15:53
  • 1187

扩展欧几里得算法模板(希望永远不要搞懂了)

扩展欧几里得 上述谈到的最大公约数算法是数学家欧几里德提出的,同时,他也提出了扩展欧几里德算法来解决整数二元一次不定方程问题。 整数二元一次不定方程 形如a*x+b*y=c(...
  • fanesemyk
  • fanesemyk
  • 2016年08月05日 18:40
  • 938

关于欧几里得算法和拓展欧几里德定理的证明(不定方程求解方法)

---------------------------------欧几里得算法和拓展欧几里得定理----------------------------------------------------...
  • qq_24451605
  • qq_24451605
  • 2015年07月24日 20:06
  • 1020

扩展欧几里德算法详解以及乘法逆元

转载网址:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 有些地方看不懂,但觉得写的很棒,先转载下来,以后慢慢研究…… ...
  • Stray_Lambs
  • Stray_Lambs
  • 2016年08月05日 22:26
  • 6273
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(扩展)欧几里德算法
举报原因:
原因补充:

(最多只允许输入30个字)