关于exgcd及其通解

欧几里得算法:

两个数x和y的最大公约数gcd(x,y)=gcd(y,x%y).这个就不解释了。

关于Exgcd:

用法:

exgcd用于求解不定方程ax+by=c的一组解。准确的说,它是用来求解ax+by=gcd(a,b),的x和y。

求解过程:

采用递归方式,我们对a,b不断的求解gcd过程,并从中推出x和y.

我们假设有ax+by=gcd(a,b).

令a=b,b=a%b,则有

      bx+(a\%b)y=gcd(b,a\%b)=gcd(a,b)

由于a%b=a-(a/b)*b,(此处为整除)

      bx+(a-a/b)y=gcd(a,b)

将整数化开,有

      bx+ay-a/b*by=gcd(a,b)

      ay+b(x-a/b*y)=gcd(a,b)

于是,令x=y,y=x-a/b*y;我们从b,a%b转移到了a,b。

考虑边界,当b=0时,有gcd(a,0)=a

于是1*a+0*b =a

我们令x=1,y=0,则求出了ax+by=gcd(a,b)中当辗转相除到最后时的一组解,然后将之往后递推

求ax+by=k的解时,如果gcd(a,b)|k,在ax+by=gcd(a,b)两边同时乘上k/gcd(a,b),得到x,y.

否则,该方程无解。有兴趣可以看看贝祖定理.

inline int exgcd(int a, int b, int &x, int &y)
{
	if(! b){x = 1;y = 0;}
	else
	{
		exgcd(b, a % b, x, y);
		int t = x;
		x = y;y = t - (a / b) * y;
	}
	return 0;
} 

 

关于通解:

设我们已经找到了一组x,y满足ax+by=gcd(a,b);

由于x,y\in Z,我们有

       y=(gcd(a,b)-ax)/b\in Z  (*)

假设存在另一解x_{0}=x+i,则存在

       ax_{0}+by_{0}=gcd(a,b)

分离出y0得

       y_{0}=(gcd(a,b)-ax_{0})/b

            =(gcd(a,b)-ax-ai)/b

            =(gcd(a,b)-ax)/b+ai/b

我们要保证y_{0}\in Z

由(*)得 (gcd(a,b)-ax)/b\in Z

则有ai/b\in Z.即a/b*i\in Z.

显然,若a,b互质,则有i_{min}=b.

若a,b不互质,则\exists d=gcd(a,b),

使得 a=a^{'}*d,b=b^{'}*d

a^{'}/b^{'}*i\in Z

其中,a^{'},b^{'}互质。

由此,x的通解为x_{i}=x+ki,k\in Z.其中i=b^{'}=b/gcd(a,b)

x的最小正整数解x_{min}=(x-x/(b/gcd(a,b))*(b/gcd(a,b)))=x\%(b/gcd(a,b)).

k=\frac{b}{gcd(a,b)};由于x可能为负,所以事实上x_{min} = (x\%k+k)%k

同样的,求解ax+by=0也可以这么写。

emmmmmmm.

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值