扩展欧几里得算法

裴蜀定理

对任何整数 (a)(b) 关于未知数 (x)(y) 的线性不定方程(称为裴蜀等式):(ax+by=c)

方程有整数解(当且仅当 (c)(gcd(a,b)) 的倍数),裴蜀等式有解时必然有无穷多个解

(ax+by=c) 有解的充要条件为 (gcd(a,b)|c)

原方程的解即为(ax+by=gcd(a,b))的解乘上(frac{c}{gcd(a,b)})

扩欧解出的(x)(ax+by=gcd(a,b)),中的(x),若要求(ax+by=c)中的(x),两边还要乘上(frac{c}{gcd(a,b)})

推论:(a)(b) 互素等价于 (ax+by=1) 有解

计算其中整数 (x) 和整数 (y) 的计算方法被称为扩展欧几里得算法

(code :)

int exgcd(int a,int b)
{
	if(!b)
	{
		x=1,y=0;//x,y设为全局变量
		return a;//若为void,此处直接return
	}
	int ans=exgcd(b,a%b),tmp=x;
	x=y,y=tmp-a/b*y;
	return ans;//得到的为gcd(a,b)
}

由欧几里得算法,得

[ax+by=gcd(a,b)=gcd(b,a mod b)=bx^prime+(a mod b)y^prime ]

代入,整理得

[x=y^prime, y=x^prime-lfloorfrac{a}{b} floor y^prime ]

边界情况分析,(ax^prime+by^prime=gcd(a,b)),当 (b=0) 时,(a)(gcd(a,b)),当且仅当 (x^prime=1)时等式成立,(y^prime) 可以为任意值,为方便起见,设(y^prime=0)

根据上边的式子,即可推出多组解

通解为(x=x_0+kb, y=y_0-ka (k∈Z))

同余方程

线性同余方程:

[ax≡b (mod m) ]

其等价于(ax-b)(m)的倍数,不妨设为(-y)倍,其就改写为

[ax+my=b ]

根据裴蜀定理得,线性同余方程有解当且仅当(gcd(a,m)|b)

有解时,先求出(ax_0+my_0=gcd(a,m)),的一组解,(x_0)(y_0),原线性同余方程的一个解即为(x=bx_0/gcd(a,m))

方程的通解就是所有模 (m/gcd(a,m))(x)同余的整数