同余
定义
数论讲义上给的定义是
给定一个正整数 m m m ,如果用 m m m 去除两个整数 a a a 和 b b b 所得到的余数相同,我们就说 a , b a,b a,b 对模数 m m m 同余,记作 a ≡ b ( m o d m ) a \equiv b(\mod m) a≡b(modm).
同时给出 a , b a,b a,b 对模数 m m m 同余的充要条件是
m ∣ ( a − b ) m \vert (a - b) m∣(a−b)
欧几里得算法
欧几里得算法,即辗转相除法,用于计算两个数的最大公约数 gcd \gcd gcd。
公式 gcd ( a , b ) = gcd ( b , a m o d b ) , b ≠ 0 \gcd(a,b) = \gcd(b, a \mod b), b \neq 0 gcd(a,b)=gcd(b,amodb),b=0
同时,若 a m o d b = 0 a \mod b = 0 amodb=0 , b b b 即为最大公约数
int gcd(int a, int b){
return b ? gcd(b, a % b) : b;
}
裴蜀定理
百度百科的定义如下
若 a , b a,b a,b 是整数,且 gcd ( a , b ) = d \gcd(a,b) = d gcd(a,b)=d,那对任意的整数 x , y , a x + b y x,y,ax+by x,y,ax+by 都一定是 d d d 的倍数,特别地,一定存在整数 x , y x,y x,y, 使得 a x + b y = gcd ( a , b ) ax+by=\gcd(a, b) ax+by=gcd(a,b)
也就是说二元一次不定方程 a x + b y = c ax+by = c ax+by=c 有解的充要条件是 gcd ( a , b ) ∣ c \gcd(a,b) | c gcd(a,b)∣c
扩展欧几里得算法
根据裴蜀定理有
a
x
+
b
y
=
gcd
(
a
,
b
)
b
x
0
+
(
a
m
o
d
b
)
y
0
=
gcd
(
b
,
a
m
o
d
b
)
ax+by = \gcd(a,b)\\ bx_0 + (a \mod b)y_0=\gcd(b, a \mod b)
ax+by=gcd(a,b)bx0+(amodb)y0=gcd(b,amodb)
同时根据欧几里得算法有
gcd
(
a
,
b
)
=
gcd
(
b
,
a
m
o
d
b
)
a
x
+
b
y
=
b
x
0
+
(
a
m
o
d
b
)
y
0
a
x
+
b
y
=
b
x
0
+
(
a
−
⌊
a
b
⌋
∗
b
)
y
0
a
x
+
b
y
=
a
y
0
+
b
∗
(
x
0
−
⌊
a
b
⌋
∗
y
0
)
\gcd(a,b) = \gcd(b, a \mod b) \\ ax+by =bx_0 + (a \mod b)y_0\\ ax+by =bx_0 + (a - \lfloor \frac a b \rfloor * b) y_0 \\ ax + by = ay_0 + b* (x_0 -\lfloor \frac a b \rfloor * y_0 )
gcd(a,b)=gcd(b,amodb)ax+by=bx0+(amodb)y0ax+by=bx0+(a−⌊ba⌋∗b)y0ax+by=ay0+b∗(x0−⌊ba⌋∗y0)
因此我们得到了
x
,
y
x,y
x,y 的一组解
{
x
=
y
0
y
=
x
0
−
⌊
a
b
⌋
∗
y
0
\left\{ \begin{array}{rcl} x = y_0\\ y = x_0 -\lfloor \frac a b \rfloor * y_0 \end{array}\right.
{x=y0y=x0−⌊ba⌋∗y0
特别地,当 b = 0 b = 0 b=0 ,显然有 x 0 = 1 , y 0 = 0 x_0 = 1, y_0 = 0 x0=1,y0=0
因此我们可以在 gcd \gcd gcd 的同时递归更新 x , y x,y x,y
int ecgcd(int a, int b,int &x, int &y){
if (b == 0){
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, x, y);
int tmp = x;
x = y;
y = tmp - a / b * y;
return d;
}
以上程序给出了二元一次不定方程
a
x
+
b
y
=
gcd
(
a
,
b
)
ax+by = \gcd(a,b)
ax+by=gcd(a,b) 的一组解。但实际应用中一般是给你
a
,
b
,
c
a,b,c
a,b,c,让你求
a
x
+
b
y
=
c
ax+by=c
ax+by=c
的最小整数解
x
x
x
根据裴蜀定理,我们知道二元一次不定方程 a x + b y = c ax+by = c ax+by=c 有解的充要条件是 gcd ( a , b ) ∣ c \gcd(a,b) | c gcd(a,b)∣c
对于 gcd ( a , b ) ∤ c \gcd(a,b) \nmid c gcd(a,b)∤c,显然是无解。
设
d
=
gcd
(
a
,
b
)
d = \gcd(a,b)
d=gcd(a,b),假设我们已经求出
a
x
+
b
y
=
d
ax+by = d
ax+by=d 的一组解
x
0
,
y
0
x_0, y_0
x0,y0,两边同乘
c
d
\frac c d
dc,得
a
x
0
∗
c
d
+
b
y
0
∗
c
d
=
d
∗
c
d
=
c
ax_0 *\frac c d + by_0 * \frac c d = d * \frac c d = c
ax0∗dc+by0∗dc=d∗dc=c
因此我们得到一组解
{
x
′
=
x
0
∗
c
d
y
′
=
y
0
∗
c
d
\left\{ \begin{array}{rcl} x' = x_0 *\frac c d \\ y' = y_0 * \frac c d \end{array}\right.
{x′=x0∗dcy′=y0∗dc
当然这个 x ′ x' x′ 显然不是最小整数解,考虑将 x ′ x' x′ 减 k ∗ b d k*\frac b d k∗db 。为保证等式成立, y ′ y' y′ 应该加上 k ∗ a d k * \frac a d k∗da
因此我们得到了方程的一般解
{
x
=
x
0
∗
c
d
−
k
∗
b
d
y
=
y
0
∗
c
d
+
k
∗
a
d
\left\{ \begin{array}{rcl} x = x_0 *\frac c d - k*\frac b d\\ y = y_0 * \frac c d + k * \frac a d \end{array}\right.
{x=x0∗dc−k∗dby=y0∗dc+k∗da
而对于的最小整数解
x
x
x ,我们可以通过取模运算来得到
x *= abs(c / d);
x = (x % abs(b / d) + abs(b / d)) % abs(b / d);
扩展欧几里得算法解同余方程
给定同余方程
a
x
≡
1
(
m
o
d
b
)
ax \equiv 1 (\mod b)
ax≡1(modb)
求最小整数解
x
x
x
根据同余的充要条件,有
b
∣
(
a
x
−
1
)
b \vert (ax - 1)
b∣(ax−1)
不妨设
a
x
−
1
=
b
y
′
ax - 1 = by'
ax−1=by′
移项得
a
x
−
b
y
′
=
1
ax - by' = 1
ax−by′=1
设
y
=
−
y
′
y = -y'
y=−y′
因此原题就是求二元一次不定方程
a
x
+
b
y
=
1
ax+by = 1
ax+by=1 的解。
逆元
给定正整数 a a a 和 m m m ,如果有 a x ≡ 1 ( m o d m ) ax \equiv 1(\mod m) ax≡1(modm), 那么把这个同余方程中 x x x 的最小整数解叫做 a a a 模 m m m 的逆元,其中这个 x x x 记作 a − 1 a^{-1} a−1 ,其中逆元又被称为数论倒数。
求解逆元的方法即为上述扩展欧几里得算法解同余方程。
特别地,当 m m m 为质数,根据费马小定理有 x = a m − 2 x = a^{m - 2} x=am−2
中国剩余定理(孙子定理)
给定同余方程组
{
x
≡
a
1
(
m
o
d
m
1
)
x
≡
a
2
(
m
o
d
m
2
)
x
≡
a
3
(
m
o
d
m
3
)
⋯
x
≡
a
n
(
m
o
d
m
n
)
\left\{ \begin{array}{rcl} x \equiv a_1 (\mod m_1) \\ x \equiv a_2 (\mod m_2) \\ x \equiv a_3 (\mod m_3) \\ \cdots\qquad\qquad\\ x \equiv a_n (\mod m_n) \\ \end{array}\right.
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x≡a1(modm1)x≡a2(modm2)x≡a3(modm3)⋯x≡an(modmn)
且
m
i
m_i
mi 两两互质,则方程有唯一解。
设
M
=
∏
i
=
1
n
m
i
M
i
=
M
m
i
M
i
t
i
≡
1
(
m
o
d
m
i
)
M =\prod\limits_{i = 1}^n m_i \\ M_i = \frac{M}{m_i}\\ M_it_i \equiv 1(\mod m_i)
M=i=1∏nmiMi=miMMiti≡1(modmi)
则唯一解
x
=
(
∑
i
=
1
n
a
i
M
i
t
i
)
m
o
d
M
x =( \sum \limits_{i = 1}^n a_iM_it_i) \mod M
x=(i=1∑naiMiti)modM
说明一点,这个解是构造出来的,不是求出来的。因此不给出证明,读者可带入自行验证即可领会构造原理。