数论——线性同余方程
介绍
形如ax≡b(mod c)的方程被称为 线性同余方程 (Congruence Equation)。
求解方法
定理1:
方程ax+by=c与方程ax≡b(mod c)是等价的,因为ax-b是m的整数倍,设-y倍可得式1。且有整数解当且仅当gcd(a,b)|c。
根据定理1,我们可以用扩展欧几里得算法来求出一组特解x0,y0,使得ax0+by0=gcd(a,b)。两边同时除以gcd(a,b)然后乘以c就得出一个解为
x=x0*c/gcd(a,b)。
定理2:
若gcd(a,b)=1,且x0,y0为方程ax+by=c的一组解,则该方程的任意解可表示为:x=x0+bt,y=y0-at , 且对任意整数t都成立。
根据定理2,我们可以求出所有解,但往往我们要求最小的整数解,t=b/gcd(a,b),x=(x mod t + t)mod t。
代码
int ex_gcd(int a, int b, int& x, int& y) { if (b == 0) { x = 1; y = 0; return a; } int d = ex_gcd(b, a % b, x, y); int temp = x; x = y; y = temp - a / b * y; return d; } bool liEu(int a, int b, int c, int& x, int& y) { int d = ex_gcd(a, b, x, y); if (c % d != 0) return 0; int k = c / d; x *= k; y *= k; return 1; }