一组68页超赞MES基础知识PPT!

注解和使用

  返回  

2021-07-21 扩展欧几里得(exgcd)

2021/7/21 8:02:11 浏览:

文章目录

  • 扩展欧几里得(exgcd)
    • 1.求特解
      • code
    • 2.求最小值x and 最大值y(非负)
  • ~~NO THANKS~~

扩展欧几里得(exgcd)

1.求特解

扩展gcd要解决的问题:已知ax+by=gcd(a,b),求一组可行的x,y。

​ ①由gcd(a,b)=gcd(b,a%b)ax+by=bx+(a%b)y,继续化下去,化成ax1+by1的形式即为递归转移式,因为递归过程中a,b不能改变,改的是x,y。

bx+(a%b)y = bx+ (a-(a/b)×b) y = bx+a×y-(a/b)×by = ay + b(x-a/by)

exgcd(ax+by)=exgcd( ay + b(x-a/by) )

然后就可以递归求解了,共用相同的x,y,可以全局,下面代码是用引用实现。

​ ②递归终止:当b=0时,式子为ax = gcd(a,b),那么显然a=gcd(a,b),x=1,y=0;

注意:扩展gcd求解x,y同时还把gcd(a,b)求出来了,exgcd的返回值就是gcd(a,b)

code

int exgcd(int a,int b,int &x,int &y)//x,y为全局变量
{
	if(b==0)
	{
		x=1;
		y=0;
		return a;
	}
	int x1,y1;
	int GCD=exgcd(b,a%b,x1,y1);
	x=y1;
	y=x1-(a/b)*y1;
	return GCD;
}

​ 扩展gcd求出一组解(x0,y0)后,那ax+by=d的其他解为x=x0+k×b/d; y=y0-k×a/d(k属于整数集) , 其中d=gcd(a,b)

​ 扩展gcd求出一组解(x0,y0)后,那ax+by=c×d的一组解为x=c×x0,y=c×y0

​ ax+by=c无整数解的情况:c不能被gcd(a,b)整除(也即c不是gcd(a,b)的倍数)。

​ 理由:因为ax与by均是gcd(a,b)的倍数,所以其和ax+by也是gcd(a,b)的倍数。

2.求最小值x and 最大值y(非负)

​ 观察ax+by=c,可转换为a(x-b)+b(y+a)=c,即ax+by=a(x-b)+b(y+a)=c

​ 所以,x减或加多少b都没影响,只需y等量加或减上a。

​ 那么,我们只需x%b(x>0,也就是减去了最大的b)就能求出x的最小值。

​ 但是当x<0时呢?我们发现x%b(x<0),的值是x在负数中最大的值,所以我们就只用再加上个b,就大于0了

结论(x<0 or x>0)
m i n ( x ) = ( x m o d b + b ) m o d b min(x)=(xmodb+b)mod b min(x)=(xmodb+b)modb
​ 为什么最后要再mod b呢?

​ Because如果x>0的话加上b可能就不是最大值了,so再mod b;对x<0的情况没太大影响。

​ 我们发现当x为最小时(x>0),y的值也就最大了

注意:当求的是ax+by=gcd×d=c(d属于整数集),min(x)=((x mod b)×(d mod b)+b) mod b(因为开始c mod 了gcd,再mod b是为了取d的最小值)

理由:y=(ax-c)/b(移项)

​ 当要求两者大于0时的解的方案数时,既是y/a+1(y为最大)(自己think think)

NO THANKS

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号