形如" ≡ \equiv ≡ " 的符号称作同余符号,对于以下式子:
a ≡ b ( m o d n ) a\equiv b\pmod n a ≡ b ( mod n )
其意义为:a a a 除以n n n 的余数等于b b b 除以n n n 的余数。
形如
a x ≡ b ( m o d n ) ax\equiv b\pmod n a x ≡ b ( mod n )
的方程称为 线性同余方程 (Linear Congruence Equation)。其中,a a a 、b b b 和 n n n 为给定整数,x x x 为未知数。需要从区间 [ 0 , n − 1 ] [0, n-1] [ 0 , n − 1 ] 中求解 x x x ,当解不唯一时需要求出全体解。
首先考虑简单的情况,当 a a a 和 n n n 互素(coprime 或 relatively prime)时,即 gcd ( a , n ) = 1 \gcd(a, n) = 1 g cd( a , n ) = 1 。
此时可以计算 a a a 的逆元,并将方程的两边乘以 a a a 的逆元,可以得到唯一解。
x ≡ b a − 1 ( m o d n ) x\equiv ba ^ {- 1} \pmod n x ≡ b a − 1 ( mod n )
接下来考虑 a a a 和 n n n 不互素(not coprime),即 gcd ( a , n ) ≠ 1 \gcd(a, n) \ne 1 g cd( a , n ) = 1 的情况。此时不一定有解。例如,2 x ≡ 1 ( m o d 4 ) 2x\equiv 1\pmod 4 2 x ≡ 1 ( mod 4 ) 没有解。
设 g = gcd ( a , n ) g = \gcd(a, n) g = g cd( a , n ) ,即 a a a 和 n n n 的最大公约数,其中 a a a 和 n n n 在本例中大于 1。
当 b b b 不能被 g g g 整除时无解。此时,对于任意的 x x x ,方程 a x ≡ b ( m o d n ) ax\equiv b\pmod n a x ≡ b ( mod n ) 的左侧始终可被 g g g 整除,而右侧不可被 g g g 整除,因此无解。
如果 g g g 整除 b b b ,则通过将方程两边 a a a 、b b b 和 n n n 除以 g g g ,得到一个新的方程:
a ′ x ≡ b ′ ( m o d n ′ ) a^{'}x\equiv b^{'} \pmod{n^{'}} a ′ x ≡ b ′ ( mod n ′ )
其中 a ′ a^{'} a ′ 和 n ′ n^{'} n ′ 已经互素,这种情形已经解决,于是得到 x ′ x^{'} x ′ 作为 x x x 的解。
很明显,x ′ x^{'} x ′ 也将是原始方程的解。这不是唯一的解。可以看出,原始方程有如下 g g g 个解:
x i ≡ ( x ′ + i ⋅ n ′ ) ( m o d n ) for i = 0 … g − 1 x_i\equiv (x^{'} + i\cdot n^{'}) \pmod n \quad \text{for } i = 0 \ldots g-1 x i ≡ ( x ′ + i ⋅ n ′ ) ( mod n ) for i = 0 … g − 1
总之,线性同余方程的 解的数量 等于 g = gcd ( a , n ) g = \gcd(a, n) g = g cd( a , n ) 或等于 0 0 0 。
根据以下两个定理,可以求出线性同余方程 a x ≡ b ( m o d n ) ax\equiv b \pmod n a x ≡ b ( mod n ) 的解。
定理 1 :线性同余方程 a x ≡ b ( m o d n ) ax\equiv b \pmod n a x ≡ b ( mod n ) 可以改写为如下线性不定方程:
a x + n k = b ax + nk = b a x + nk = b
其中 x x x 和 k k k 是未知数。这两个方程是等价的,有整数解的充要条件为 gcd ( a , n ) ∣ b \gcd(a,n) \mid b g cd( a , n ) ∣ b 。
应用扩展欧几里德算法可以求解该线性不定方程。根据定理 1,对于线性不定方程 a x + n k = b ax+nk=b a x + nk = b ,可以先用扩展欧几里得算法求出一组 x 0 , k 0 x_0,k_0 x 0 , k 0 ,也就是 a x 0 + n k 0 = gcd ( a , n ) ax_0+nk_0=\gcd(a,n) a x 0 + n k 0 = g cd( a , n ) ,然后两边同时除以 gcd ( a , n ) \gcd(a,n) g cd( a , n ) ,再乘 b b b 。就得到了方程
a b gcd ( a , n ) x 0 + n b gcd ( a , n ) k 0 = b a\dfrac{b}{\gcd(a,n)}x_0+n\dfrac{b}{\gcd(a,n)}k_0=b a g cd( a , n ) b x 0 + n g cd( a , n ) b k 0 = b
于是找到方程的一个解。
定理 2 :若 gcd ( a , n ) = 1 \gcd(a,n)=1 g cd( a , n ) = 1 ,且 x 0 x_0 x 0 、k 0 k_0 k 0 为方程 a x + n k = b ax+nk=b a x + nk = b 的一组解,则该方程的任意解可表示为:
x = x 0 + n t x=x_0+nt x = x 0 + n t
k = k 0 − a t k=k_0-at k = k 0 − a t
并且对任意整数 t t t 都成立。
根据定理 2,可以从已求出的一个解,求出方程的所有解。实际问题中,往往要求出一个最小整数解,也就是一个特解
x = ( x m o d t + t ) m o d t x=(x \bmod t+t) \bmod t x = ( x mod t + t ) mod t
其中有
t = n gcd ( a , n ) t=\dfrac{n}{\gcd(a,n)} t = g cd( a , n ) n
如果仔细考虑,用扩展欧几里得算法求解与用逆元求解,两种方法是等价的。
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 false ;
int k = c / d;
x *= k;
y *= k;
return true ;
}