数论——线性同余方程

介绍

形如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;
}

 

posted @ 2020-03-16 22:44  Ldler  Views(382)  Comments(0Edit  收藏  举报