同余问题学习笔记
1.同余符号
若任意两个整数
a
,
b
a,b
a,b 模
m
m
m 的值是相同的,那么我们可以表示成以下形式
a
≡
b
(
m
o
d
m
)
a\equiv b \pmod m
a≡b(modm)
读作:
a
a
a 同余于
b
b
b 模
m
m
m ,或读作
a
a
a 与
b
b
b 对模
m
m
m 同余
2.同余符号的性质
1.反身性: a ≡ a ( m o d m ) a \equiv a \pmod m a≡a(modm);
证明: a a a 模 m m m 一定等于 a a a 模 m m m
2.对称性:若 a ≡ b ( m o d m ) a \equiv b \pmod m a≡b(modm),则 b ≡ a ( m o d m ) b \equiv a \pmod m b≡a(modm);
证明: a a a 与 b b b 同余, b b b 一定和 a a a 同余。
3.传递性:若 a ≡ b ( m o d m ) a \equiv b \pmod m a≡b(modm), b ≡ c ( m o d m ) b \equiv c \pmod m b≡c(modm),则 a ≡ c ( m o d m ) a \equiv c \pmod m a≡c(modm);
证明:设 a , b , c a,b,c a,b,c 对 m m m 取余分别为 x , y , z x,y,z x,y,z ,那么 x = y , y = z , x = z x=y,y=z,x=z x=y,y=z,x=z。
4.同余式相加:若 a ≡ b ( m o d m ) a \equiv b \pmod m a≡b(modm), c ≡ d ( m o d m ) c \equiv d \pmod m c≡d(modm),则 , a ± c ≡ b ± d ( m o d m ) a \pm c \equiv b \pm d \pmod m a±c≡b±d(modm)
5.同余式相乘:若 a ≡ b ( m o d m ) a \equiv b \pmod m a≡b(modm), c ≡ d ( m o d m ) c \equiv d \pmod m c≡d(modm),则 a c ≡ b d ( m o d m ) ac \equiv bd \pmod m ac≡bd(modm)。
然后当 a , b a,b a,b 模 m m m 同余的时候,那么 m ∣ ( a − b ) m|(a-b) m∣(a−b)
那么我们 a a a 看成 k m + r km+r km+r ,这里 k k k 为 a / m a/m a/m 的商, r r r 为 a m o d m a \mod m amodm ,同理,我们将 b b b 看成 l m + r lm+r lm+r
那么我们将 m m m 提出来,两数相减即为 ( k − l ) m (k-l)m (k−l)m 所以 a − b a-b a−b 即为 m m m 的倍数。
3.相关定理
1.裴蜀定理
若
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
=
d
ax+by=d
ax+by=d 成立
证明:
既然是求 gcd \gcd gcd ,我们就可以模拟一下欧几里得算法(可以先看后面)
我们设 a ≤ b a \leq b a≤b ,由辗转相除法的过程 gcd ( x , y ) = gcd ( y , x m o d y ) \gcd(x,y)=\gcd(y,x \mod y) gcd(x,y)=gcd(y,xmody),可以得到
b = a x 1 + r 1 b=ax_1+r_1 b=ax1+r1,那么 b m o d a b \mod a bmoda 后 b = r 1 b=r_1 b=r1
重复过程,得到以下式子:
b
=
a
x
1
+
r
1
a
=
a
x
2
+
r
2
r
1
=
r
2
x
3
+
r
3
.
.
.
.
.
.
r
k
−
3
=
r
k
−
2
x
k
−
1
+
r
k
−
1
(
1
)
r
k
−
2
=
r
k
−
1
x
k
+
r
k
(
2
)
r
k
−
1
=
r
k
x
k
+
1
+
r
k
+
1
b=ax_1+r_1\\ a=ax_2+r_2\\ r_1=r_2x_3+r_3\\ ......\\ r_{k-3}=r_{k-2}x_{k-1}+r_{k-1}(1)\\ r_{k-2}=r_{k-1}x_k+r_{k}(2)\\ r_{k-1}=r_{k}x_{k+1}+r_{k+1}
b=ax1+r1a=ax2+r2r1=r2x3+r3......rk−3=rk−2xk−1+rk−1(1)rk−2=rk−1xk+rk(2)rk−1=rkxk+1+rk+1
因为辗转相除法最后得到的余数为
0
0
0,在这里,我们不妨设
r
k
+
1
=
0
r_{k+1}=0
rk+1=0 ,那么,
r
k
r_k
rk 就是
a
,
b
a,b
a,b 的最大公约数,即
r
k
=
d
r_k=d
rk=d ,将这个东西带入
(
2
)
(2)
(2) 式子,那么这个时候我们得到以下式子
r
k
−
2
=
r
k
−
1
x
k
+
d
r_{k-2}=r_{k-1}x_k+d
rk−2=rk−1xk+d
移项得到
d
=
r
k
−
2
−
r
k
−
1
x
k
(
3
)
d=r_{k-2}-r_{k-1}x_k(3)
d=rk−2−rk−1xk(3)
将
(
1
)
(1)
(1) 式子移项
r
k
−
1
=
r
k
−
3
−
r
k
−
2
x
k
(
4
)
r_{k-1}=r_{k-3}-r_{k-2}x_{k}(4)
rk−1=rk−3−rk−2xk(4)
(
4
)
(4)
(4) 式带入
(
3
)
(3)
(3)
d = r k − 2 − ( r k − 3 − r k − 2 x k ) x k d=r_{k-2}-(r_{k-3}-r_{k-2}x_{k})x_{k} d=rk−2−(rk−3−rk−2xk)xk
把式子展开
d = m 1 r k − 2 + n 1 r k − 3 d=m_1r_{k-2}+n_1r_{k-3} d=m1rk−2+n1rk−3
很明显,我们上面用的都是整数,所以 m 1 , n 1 m_1,n_1 m1,n1 肯定也都是整数,那如果我们把原来的 ( 3 ) (3) (3) 式子转化成这种形式 d = m r k − 1 + n r k − 2 d=mr_{k-1}+nr_{k-2} d=mrk−1+nrk−2。
我们将这个式子跟上面的一对比,是不是发现了什么规律?
d = m k a + n k b d = m_ka+n_kb d=mka+nkb
我们知道, m k m_k mk 和 n k n_k nk 都是整数,故 a x + b y = d ax+by=d ax+by=d 一定有整数解。
推论1:对于方程 a x + b y = 1 ax + by = 1 ax+by=1 , 只有当整数 a , b a,b a,b 互质时,方程才有整数解.
反证法:
这
a
,
b
a,b
a,b 不是互质的,那么
a
,
b
a,b
a,b 可以表示成
a
=
q
∗
gcd
(
a
,
b
)
a=q*\gcd(a,b)
a=q∗gcd(a,b) ,
b
=
p
∗
gcd
(
a
,
b
)
b=p*\gcd(a,b)
b=p∗gcd(a,b), 带入上面的式子,易得
q
∗
gcd
(
a
,
b
)
∗
x
+
p
∗
gcd
(
a
,
b
)
∗
y
=
1
q*\gcd(a,b)*x+p*\gcd(a,b)*y=1
q∗gcd(a,b)∗x+p∗gcd(a,b)∗y=1
如果两边同时除以一个
gcd
(
a
,
b
)
\gcd(a,b)
gcd(a,b),得到:
q
x
+
p
y
=
1
gcd
(
a
,
b
)
qx+py=\frac{1}{\gcd(a,b)}
qx+py=gcd(a,b)1
显然,如果
a
,
b
a,b
a,b 不是互质的话,那么等式右边就是一个小数,所以该方程不存在整数解,得证。
另外,可以得到 a , b a,b a,b 互质的充要条件就是 a x + b y = 1 ax+by=1 ax+by=1 要有整数解
推论2: 对于方程 a x + b y = z ax+by=z ax+by=z , 只有满足 gcd ( a , b ) ∣ z \gcd(a,b)|z gcd(a,b)∣z ,方程才有整数解
证明:
设 d = gcd ( a , b ) d=\gcd(a,b) d=gcd(a,b) , z = d ∗ q z=d*q z=d∗q
对于方程
a
x
+
b
y
=
d
ax+by=d
ax+by=d ,我们有一组解
x
1
,
y
1
x_1,y_1
x1,y1,那么就有:
a
x
1
+
b
y
1
=
d
ax_1+by_1=d
ax1+by1=d
两边同时乘上
q
q
q ,易得:
a
x
1
∗
q
+
b
y
1
∗
q
=
d
∗
q
ax_1*q+by_1*q=d*q
ax1∗q+by1∗q=d∗q
因为
z
=
d
∗
q
z=d*q
z=d∗q
所以方程 a x + b y = z ax+by=z ax+by=z ,一定存在一组整数解 x = x 1 ∗ q , y = y 1 ∗ q x=x_1*q,y=y_1*q x=x1∗q,y=y1∗q,得证。
2.欧几里得算法
欧几里得算法的目的是简单的求出两个正整数的最大公因数。
那么我们证明一下这个算法:
令
c
=
gcd
(
a
,
b
)
c=\gcd(a,b)
c=gcd(a,b),设
a
=
m
c
,
b
=
n
c
a=mc,b=nc
a=mc,b=nc;
由
a
÷
b
=
k
.
.
.
.
.
.
r
a÷b=k......r
a÷b=k......r可得
r
=
a
−
k
b
=
m
c
−
k
n
c
=
(
m
−
k
n
)
c
r=a-kb=mc-knc=(m-kn)c
r=a−kb=mc−knc=(m−kn)c;
第二步不难看出,
c
c
c 也是
r
r
r 的因数;
列出
b
=
n
c
b=nc
b=nc 和
r
=
(
m
−
k
n
)
c
r=(m-kn)c
r=(m−kn)c ,如果
n
n
n 和
m
−
k
n
m-kn
m−kn 互质,即两者公约数只有
1
1
1 ,则表明
c
c
c 是
b
b
b 和
r
r
r 的最大公约数,后续证明
n
n
n 和
m
−
k
n
m-kn
m−kn 互质;
假设
m
−
k
n
m-kn
m−kn 和
n
n
n 不是互质,两者有一非零的最大公约数
d
d
d ,且
d
>
1
d>1
d>1 ;
则有 $m-kn=xd
,
,
,n=yd$,得
m
=
k
n
+
x
d
=
k
y
d
+
x
d
=
(
k
y
+
x
)
d
m=kn+xd=kyd+xd=(ky+x)d
m=kn+xd=kyd+xd=(ky+x)d ,则
a
=
m
c
=
(
k
y
+
x
)
d
c
a=mc=(ky+x)dc
a=mc=(ky+x)dc ,
b
=
n
c
=
y
c
d
b=nc=ycd
b=nc=ycd,则
a
a
a 与
b
b
b 的一个公约数
c
d
>
c
cd>c
cd>c,故
c
c
c 不是
a
a
a 与
b
b
b 的最大公约数,这与前面提到的
c
c
c 是
a
a
a 与
b
b
b 的最大公约数假设矛盾;
故
m
−
k
n
m-kn
m−kn 和
n
n
n 为互质,即
c
c
c 是
b
b
b 和
r
r
r 的最大公约数,且是
a
a
a 和
b
b
b 的最大公约数,得证。
此算法实现流程图:
](https://imgtu.com/i/vK4hkD)
3.扩展欧几里得算法
对于求解方程 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)
先考虑特殊情况,如果 b = 0 b=0 b=0 ,那么 gcd ( a , b ) = a \gcd(a,b)=a gcd(a,b)=a,显然存在一组解 x = 1 , y = 0 x=1,y=0 x=1,y=0
设之前的方程为 a x 1 + b y 1 = gcd ( a , b ) ax_1+by_1=\gcd(a,b) ax1+by1=gcd(a,b) ,肯定存在式子 b x 2 + ( a m o d b ) y 2 = gcd ( b , a m o d b ) bx_2 +(a\mod b)y_2=\gcd(b,a \mod b) bx2+(amodb)y2=gcd(b,amodb)
根据刚刚讲的欧几里得算法, gcd ( a , b ) = gcd ( b , a m o d b ) \gcd(a,b)=\gcd(b,a \mod b) gcd(a,b)=gcd(b,amodb)
所以 a x 1 + b y 1 = b x 2 + ( a m o d b ) ax_1+by_1=bx_2+(a \mod b) ax1+by1=bx2+(amodb)
因为 a m o d b = a − a / b ∗ b a \mod b=a-a/b*b amodb=a−a/b∗b
所以 a x 1 + b y 1 = b x 2 + ( a − a / b ∗ b ) ∗ y 2 ax_1+by_1=bx_2+(a-a/b*b)*y_2 ax1+by1=bx2+(a−a/b∗b)∗y2
a x 1 + b y 1 = b x 2 + a − a / b ∗ b ∗ y 2 ax_1+by_1=bx_2+a-a/b*b*y_2 ax1+by1=bx2+a−a/b∗b∗y2
a x 1 + b y 1 = a y 2 + b ( x 2 − a / b ∗ y 2 ) ax_1+by_1=ay_2+b(x_2-a/b*y_2) ax1+by1=ay2+b(x2−a/b∗y2)
所以 x 1 = y 2 , y 1 = x 2 − a / b ∗ y 2 x_1=y_2,y_1=x_2-a/b*y_2 x1=y2,y1=x2−a/b∗y2
code:
void exgcd(ll a, ll b)
{
if(b == 0)
{
x = 1, y = 0;
return;
}
exgcd(b, a % b);
ll t = x;
x = y;
y = t - a / b * y;
}
然后我们这个东西还能求逆元,怎么求呢?
设 x x x 为 a a a 模 p p p 意义下的逆元,那么满足式子:
a x ≡ 1 ( m o d m ) ax \equiv 1 \pmod m ax≡1(modm)
那么有 a x + m y = 1 ax + my=1 ax+my=1, 接着用扩展欧几里得定理来做即可。