【exgcd】扩展欧几里得

主要介绍扩展欧几里的和总结一些常用性质

首先介绍裴蜀定理

对于任意整数a,b,存在一对整数x,y 满足 ax+by=gcd(a,b)

即存在x0,y0使得ax0+by0=gcd(a,b)

扩展欧几里得可以求出x0,y0

从而当ax+by=c 可以求出其通解

设d=gcd(a,b)

显然当c%d!=0时无整数解

通解可以表示为

x=(c/d)x0+k(b/d)

y=(c/d)y0-k(a/d)

k是同一个整数,取遍整数集合

【】注意,容易记混成x=(c/d)x0+k*b*(c/d)

int exgcd(int a,int b,int &x,int &y){
	if(b==0){
		x=1;
		y=0;
		return a;
	}
	int d=exgcd(b,a%b,x,y);
	int z=x;
	x=y;
	y=z-(a/b)*y;
	return d; 
}

下面介绍几个有关性质和细节

1.k为同一个整数,有这样一题,把x和y限制在一个范围里,通过二分k来获取答案。

2.取任一合法x,可以通过ax+by=c来逆推y

3.可以用来解线性同余方程a*x≡b (mod m) 等价于a*x-b=k*m等价于a*x-k*m=b等价于a*x+m*y=b

4.x最小正整数解 ((c/d)*x0%(b/d)+(b/d))%(b/d)

y的最小正整数解((c/d)*y0%(a/d)+(a/d))%(a/d)

本质上是这样的 a+kp>=0 的最小正整数结果是 a%p

举个例子:

-5加若干个3后第一次大于0时是几  答案是1

因为-5%3=1     (一般情况下取模如果结果是负数,那么就再加上这个模数,-5%3=-2 -2+3=1)  

所以要想取得(c/d)x0+k(b/d)的最小正整数解,只需要(c/d)x0 对(b/d)取模 ;y同理,需要(c/d)*y0对(a/d)取模

放一个手推exgcd的图,代码忘了可以用这个再推出来,最好记住板子吧

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值