线性同余方程

如何解方程$$ax\equiv b({\rm mod}\ m)​$$呢?因为$ax-b|m​$, 故令$ax-b=-ym​$,即$$ax+my=b​$$。根据Bezout定理,该方程有解当且仅当$\gcd(a,m)|b​$。我们把等式两边同乘以$\frac{\gcd(a,m)}{b}​$,得到$$ax_0+my_0=\gcd(a, m)​$$。这个方程可以用扩展欧几里得算法求得得到$x_0​$。等式是怎么乘的,就再把它除回来,也就是$$x=x_0\cdot \frac{b}{\gcd(a,m)}​$$。关于方程的通解,$$ax+k{\rm lcm}(a,m)+my-k{\rm lcm}(a,m)=b,{\rm lcm}(a,m)=\frac{am}{\gcd(a,m)}​$$,也就是$$a(x+k\frac{m}{\gcd(a,m)})+m(y+k\frac{a}{\gcd(a,m)})=b​$$,所以方程的通解为所有与$x​$同余$\frac{m}{\gcd(a,m)}​$的数。若要求最小正整数解,令$p=\frac{m}{\gcd(a,m)}​$,然后x=(x%p+p)%p即可。 

ll Exgcd(ll a, ll b, ll &x, ll &y)
{
	if (b == 0)
	{
		x = 1;
		y = 0;
		return a;
	}
	ll d = Exgcd(b, a%b, x, y);
	ll tx = x;
	x = y;
	y = tx - (a / b) * y;
	return d;
}

ll Gcd(ll a, ll b)
{
	return b ? Gcd(b, a%b) : a;
}

ll Eq(ll a, ll b, ll m)
{
	ll gcd = Gcd(a, m);
	if (b%gcd)
		return -1;
	ll x, y;
	Exgcd(a, m, x, y);
	x = x * b / gcd;
	ll p = m / gcd;
	return (x%p+p) % p;
}
posted @ 2018-04-22 16:42  headboy2002  阅读(579)  评论(0编辑  收藏  举报