同余与剩余系#
设有整数 n 1 , n 2 , m n 1 , n 2 , m 满足 ∃ q 1 , q 2 , r ∈ Z , n 1 = m q 1 + r , n 2 = m q 2 + r ∃ q 1 , q 2 , r ∈ Z , n 1 = m q 1 + r , n 2 = m q 2 + r ,则称 n 1 , n 2 n 1 , n 2 模 m m 同余,记作 n 1 ≡ n 2 ( mod m ) n 1 ≡ n 2 ( mod m ) 。
称所有模 m m 同余(设为 r r )的 n n 组成的集合为模 m m 的一个剩余类,记作 C r C r 。
设有 m m 个整数构成的集合 A A 满足 a 1 , … , a m a 1 , … , a m 模 m m 互不同余(即从每个剩余类中各取一个数),则称 A A 为模 m m 的一个完全剩余系。
容易证明一个满足上面条件的集合至多有 m m 个数。
我们可以再化简一下,只取与 m m 互质的数,这样就得到了模 m m 的一个简化剩余系。简化剩余系的大小为 φ ( m ) φ ( m ) 。
欧几里得算法与裴蜀定理#
欧几里得算法(辗转相除法):gcd ( a , b ) = gcd ( b , a mod b ) ( a , b ∈ Z ) gcd ( a , b ) = gcd ( b , a mod b ) ( a , b ∈ Z ) 。
证:设 a = q b + r , gcd ( b , r ) = d a = q b + r , gcd ( b , r ) = d 。
由于 gcd ( b , a mod b ) = gcd ( b , r ) gcd ( b , a mod b ) = gcd ( b , r ) ,则有 d | r , d | b d | r , d | b ,则可以推出 d | a d | a ,则有 d | gcd ( a , b ) d | gcd ( a , b ) 。
设 k = gcd ( a , b ) k = gcd ( a , b ) ,则 k | a − q b = r k | a − q b = r ,说明 k | gcd ( b , r ) k | gcd ( b , r )
因此,gcd ( a , b ) | gcd ( b , a mod b ) , gcd ( b , a mod b ) | gcd ( a , b ) ⇒ gcd ( a , b ) = gcd ( b , a mod b ) gcd ( a , b ) | gcd ( b , a mod b ) , gcd ( b , a mod b ) | gcd ( a , b ) ⇒ gcd ( a , b ) = gcd ( b , a mod b ) 。
裴蜀定理:若有 a , b , m ∈ Z a , b , m ∈ Z (a , b a , b 不全为 0),则存在一组解 x , y ∈ Z x , y ∈ Z 使得 a x + b y = m a x + b y = m 的充要条件是 gcd ( a , b ) | m gcd ( a , b ) | m ,且若有解则必有无穷多组解。
证(拓展欧几里得算法):
必要性显然,下证充分性:
不妨假设 a , b ≥ 0 a , b ≥ 0 ,因为正负号的不同可以简单地通过 x , y x , y 的正负性来改变。
同时,只要证明 a x + b y = gcd ( a , b ) a x + b y = gcd ( a , b ) 即可,因为对 x , y x , y 扩大若干倍即可得到 m m 。
那么两边同时除以 gcd ( a , b ) gcd ( a , b ) ,即 a ′ x + b ′ y = 1 a ′ x + b ′ y = 1 。
我们在求 gcd ( a ′ , b ′ ) gcd ( a ′ , b ′ ) 的时候是怎么做的?后几步单独拿出来看(不妨设此时的两个求公约数的数分别为 u , v u , v ):
gcd ( a ′ , b ′ ) = gcd ( u , v ) = gcd ( v , 1 ) = gcd ( 1 , 0 ) = 1 gcd ( a ′ , b ′ ) = gcd ( u , v ) = gcd ( v , 1 ) = gcd ( 1 , 0 ) = 1
发现出现了一个 u = q v + 1 u = q v + 1 ,移项得到 u − q v = 1 u − q v = 1 。那么现在就得到了一组对于 u , v u , v 的解。
能不能从 u , v u , v 推到 a ′ , b ′ a ′ , b ′ 呢?答案是可以的。
假设我们上一级求的是 gcd ( λ u + v , u ) = gcd ( u , v ) gcd ( λ u + v , u ) = gcd ( u , v ) ,已知 u x 0 + v y 0 = 1 u x 0 + v y 0 = 1 ,要求 ( λ u + v ) x 1 + u y 1 ( λ u + v ) x 1 + u y 1 的解。
构造:取 x 1 = y 0 , y 1 = x 0 − λ y 0 x 1 = y 0 , y 1 = x 0 − λ y 0 ,得到
( λ u + v ) x 1 + u y 1 = ( λ u + v ) y 0 + u ( x 0 − λ y 0 ) = λ u y 0 + v y 0 + u x 0 − λ u y 0 = u x 0 + v y 0 = 1 ( λ u + v ) x 1 + u y 1 = ( λ u + v ) y 0 + u ( x 0 − λ y 0 ) = λ u y 0 + v y 0 + u x 0 − λ u y 0 = u x 0 + v y 0 = 1
逐层推上去即可,这样不仅证明了该定理,还求出了一组解。
有了特解后,其通解为小学奥数内容,这里不再赘述。
int exgcd (int a, int b, int &x, int &y, int z = 1 ) {
if (!b) {
if (z % a) x = 0 , y = 0 ;
else x = z / a, y = 0 ;
return a;
}
int d = exgcd (b, a % b, x, y, z);
int xx = y, yy = x - y * (a / b);
x = xx, y = yy;
return d;
}
利用数学归纳法也容易将裴蜀定理推广到 n n 个数的情况:
∑ a i x i = m ∑ a i x i = m 有整数解当且仅当 gcd ( a 1 , a 2 , … , a n ) | m gcd ( a 1 , a 2 , … , a n ) | m 。
证:
当 n = 2 n = 2 时显然成立。
假设 2 ≤ n ≤ k 2 ≤ n ≤ k 时成立,下证 n = k + 1 n = k + 1 时成立。
因为 ≤ k ≤ k 时成立,因此 ∑ k i = 1 a i x i = λ gcd ( a 1 , … , a k ) ∑ i = 1 k a i x i = λ gcd ( a 1 , … , a k ) 。
原式变为 λ gcd ( a 1 , … , a k ) + a k + 1 x k + 1 = m λ gcd ( a 1 , … , a k ) + a k + 1 x k + 1 = m 有解,由 n = 2 n = 2 时知有解当且仅当 gcd ( gcd ( a 1 , … , a k ) , a k + 1 ) = gcd ( a 1 , … , a k + 1 ) | m gcd ( gcd ( a 1 , … , a k ) , a k + 1 ) = gcd ( a 1 , … , a k + 1 ) | m 。
证毕。
欧拉定理与费马小定理#
欧拉定理(数论):若 gcd ( a , m ) = 1 gcd ( a , m ) = 1 ,则 a φ ( m ) ≡ 1 ( mod m ) a φ ( m ) ≡ 1 ( mod m ) 。
证:
设模 m m 的一个简化剩余系为 r 1 , … , r φ ( m ) r 1 , … , r φ ( m ) ,则由简化剩余系的性质 a r 1 , … , a r φ ( m ) a r 1 , … , a r φ ( m ) 同样为模 m m 的简化剩余系。
那么就有
∏ r ≡ ∏ a r ≡ a φ ( m ) ∏ r ( mod m ) a φ ( m ) ≡ 1 ( mod m ) ∏ r ≡ ∏ a r ≡ a φ ( m ) ∏ r ( mod m ) a φ ( m ) ≡ 1 ( mod m )
当 m m 为一个质数 p p 时,就得到了费马小定理。
费马小定理: a p ≡ a ( mod p ) a p ≡ a ( mod p ) ,p p 是质数。
具体到 OI 上,可以总结出一个 拓展欧拉定理 ,用来处理模意义下的指数:
a b ≡ ⎧ ⎪ ⎨ ⎪ ⎩ a b mod φ ( m ) gcd ( a , m ) = 1 ; a b gcd ( a , m ) ≠ 1 , b < φ ( m ) ; a b mod φ ( m ) + φ ( m ) gcd ( a , m ) ≠ 1 , b ≥ φ ( m ) . ( mod m ) a b ≡ { a b mod φ ( m ) gcd ( a , m ) = 1 ; a b gcd ( a , m ) ≠ 1 , b < φ ( m ) ; a b mod φ ( m ) + φ ( m ) gcd ( a , m ) ≠ 1 , b ≥ φ ( m ) . ( mod m )
仅证第三条:
我们对 m m 分解质因数,设为 p α 1 1 … p α k k p 1 α 1 … p k α k 。考虑对每一个 p α p α 分别证明:若每一个都成立,那么这几个互质的模数乘起来必然成立。
当 gcd ( a , p α ) = 1 gcd ( a , p α ) = 1 时:
a b ≡ a φ ( m ) ⋅ ⌊ b φ ( m ) ⌋ + b mod φ ( m ) ≡ [ a φ ( m ) ] ⌊ b φ ( m ) ⌋ ⋅ a b mod φ ( m ) ( mod p α ) a b ≡ a φ ( m ) ⋅ ⌊ b φ ( m ) ⌋ + b mod φ ( m ) ≡ [ a φ ( m ) ] ⌊ b φ ( m ) ⌋ ⋅ a b mod φ ( m ) ( mod p α )
注意到 φ φ 是积性函数,因此 φ ( p α ) | φ ( m ) φ ( p α ) | φ ( m ) 。
所以
a b ≡ a b mod φ ( m ) ≡ a b mod φ ( m ) + φ ( m ) ( mod p α ) a b ≡ a b mod φ ( m ) ≡ a b mod φ ( m ) + φ ( m ) ( mod p α )
当 gcd ( a , p α ) ≠ 1 gcd ( a , p α ) ≠ 1 时:
因为 p p 是质数,所以 p | a p | a 。又由前提有 b ≥ φ ( m ) b ≥ φ ( m ) ,因此 b ≥ φ ( m ) ≥ φ ( p α ) = p α − p α − 1 = p α − 1 ( p − 1 ) ≥ α b ≥ φ ( m ) ≥ φ ( p α ) = p α − p α − 1 = p α − 1 ( p − 1 ) ≥ α 。
那么有
a b ≡ a b mod φ ( m ) + φ ( m ) ≡ 0 ( mod p α ) a b ≡ a b mod φ ( m ) + φ ( m ) ≡ 0 ( mod p α )
最终合并即可。
或者参考 OI Wiki 上的证法:欧拉定理 & 费马小定理 - OI Wiki 。
乘法逆元#
是否可以将模拓展到有理数域上呢?答案是可以的。
考虑下面一个问题:
设有正整数 a , m a , m ,求满足 a ⋅ b ≡ 1 ( mod m ) a ⋅ b ≡ 1 ( mod m ) 的解 b b 。
我们称 b b 为 a a 模 m m 意义下的乘法逆元,记作 a − 1 ( mod m ) a − 1 ( mod m ) (或者说环 Z m Z m 上的乘法逆元)。
其实就是相当于求解 a x − m y = 1 a x − m y = 1 的 x x 。
由裴蜀定理,当 gcd ( a , m ) > 1 gcd ( a , m ) > 1 时无解,即不存在逆元。
否则就可以用拓展欧几里得求出 x x 。
从另一个角度想,如果存在逆元,由欧拉定理,有
a φ ( m ) ≡ 1 ( mod m ) a φ ( m ) − 1 ⋅ a ≡ 1 ( mod m ) b ≡ a φ ( m ) − 1 ( mod m ) a φ ( m ) ≡ 1 ( mod m ) a φ ( m ) − 1 ⋅ a ≡ 1 ( mod m ) b ≡ a φ ( m ) − 1 ( mod m )
快速幂即可求出。
如果要求 n n 个数的逆元呢?
求前 n n 个数的那个做法多少有点麻烦,个人更喜欢这种:
考虑求任意 n n 个数的逆元,先随便给个顺序,然后求个前缀积 s 1 , … , s n s 1 , … , s n 。
之后利用上述方法求 s n s n 的逆元。
紧接着倒序一个一个乘回去,s − 1 n ⋅ a n = s − 1 n − 1 s n − 1 ⋅ a n = s n − 1 − 1 ,这样线性求出了每个前缀积的逆元。
之后再顺序乘过去,s − 1 n ⋅ s n − 1 = a − 1 n s n − 1 ⋅ s n − 1 = a n − 1 。
时间复杂度 O ( n ) O ( n ) ,相比直接线性扫的多了点常数,但是好想。
这里也直接给出传统做法:
inv[1 ] = 1 ;
for (int i = 2 ; i <= n; i++) {
inv[i] = (p - p / i) * inv[p % i] % p;
}
中国剩余定理#
求解同余方程 x ≡ a i ( mod m i ) x ≡ a i ( mod m i ) ,其中 m i , m j m i , m j 两两互质。
令 M = ∏ m , M i = M m i M = ∏ m , M i = M m i ,再求出 M i M i 在模 m i m i 意义下的乘法逆元 M − 1 i M i − 1 则该同余方程模 M M 下的唯一解为
x ≡ n ∑ i = 1 a i M i M − 1 i ( mod M ) x ≡ ∑ i = 1 n a i M i M i − 1 ( mod M )
证:
先证存在性:
首先由于 m m 两两互质,因此 M i = M m i M i = M m i 与 m i m i 互质,因此必定存在逆元 M − 1 i M i − 1 。
而在 mod m i mod m i 意义下 M i M − 1 i ≡ 1 ( mod m i ) M i M i − 1 ≡ 1 ( mod m i ) ,因此 a i M i M − 1 i ≡ a i ( mod m i ) a i M i M i − 1 ≡ a i ( mod m i ) 。
又因为 m j | M i , i ≠ j m j | M i , i ≠ j ,所以 a i M i M − 1 i ≡ 0 ( mod m j ) a i M i M i − 1 ≡ 0 ( mod m j ) 。
唯一性利用数学归纳法不难证明。
如果模数不两两互质呢?这个时候就要使用拓展中国剩余定理 :
考虑取出其中一对不互质的方程,假设为
{ x ≡ a ( mod m ) x ≡ b ( mod n ) { x ≡ a ( mod m ) x ≡ b ( mod n )
其中 gcd ( m , n ) > 1 gcd ( m , n ) > 1 。考虑写成等式的形式:
{ x = λ m + a x = μ n + b ⇒ λ m − μ n = b − a { x = λ m + a x = μ n + b ⇒ λ m − μ n = b − a
即求一个不定方程的解,使用裴蜀定理即可判定是否有解,并求出一组特解。
然后将两个方程合并:
x = λ m + a λ = λ 0 + k ⋅ n gcd ( m , n ) x = m ( λ 0 + k ⋅ n gcd ( m , n ) ) + a = m λ 0 + k ⋅ lcm ( m , n ) + a ⇔ x ≡ m λ 0 + a ( mod lcm ( m , n ) ) x = λ m + a λ = λ 0 + k ⋅ n gcd ( m , n ) x = m ( λ 0 + k ⋅ n gcd ( m , n ) ) + a = m λ 0 + k ⋅ lcm ( m , n ) + a ⇔ x ≡ m λ 0 + a ( mod lcm ( m , n ) )
其中 k ∈ Z k ∈ Z ,λ 0 λ 0 是通过 exgcd
求出的通解。
两两合并方程组即可。
威尔逊定理#
对于任意质数 p p ,有 ( p − 1 ) ! ≡ − 1 ( mod p ) ( p − 1 ) ! ≡ − 1 ( mod p ) 。
证:
不难发现 1 , … , p − 1 1 , … , p − 1 里每一个数都与 p p 互质。
引理:若 a , p a , p 互质,则 a a 在模 p p 意义下的逆元 a − 1 a − 1 存在且唯一。
存在性显然,下证唯一:
假设有两个整数 b 1 , b 2 b 1 , b 2 满足
a b 1 ≡ 1 ( mod p ) a b 2 ≡ 1 ( mod p ) a b 1 ≡ 1 ( mod p ) a b 2 ≡ 1 ( mod p )
那么
a b 1 − a b 2 ≡ 0 ( mod p ) b 1 − b 2 ≡ 0 ( mod p ) b 1 ≡ b 2 ( mod p ) a b 1 − a b 2 ≡ 0 ( mod p ) b 1 − b 2 ≡ 0 ( mod p ) b 1 ≡ b 2 ( mod p )
回到原问题,由于每个数的逆元在 { 1 , … , p − 1 } { 1 , … , p − 1 } 中唯一确定,因此互为逆元的两个数可以直接消掉,仅需考虑逆元是自己本身的数。
解方程 x 2 ≡ 1 ( mod p ) ( 1 ≤ x ≤ p − 1 ) x 2 ≡ 1 ( mod p ) ( 1 ≤ x ≤ p − 1 ) ,解得 x 1 = 1 , x 2 = p − 1 x 1 = 1 , x 2 = p − 1 。
因此 ( p − 1 ) ! ≡ 1 × ( p − 1 ) ≡ p − 1 ≡ − 1 ( mod p ) ( p − 1 ) ! ≡ 1 × ( p − 1 ) ≡ p − 1 ≡ − 1 ( mod p ) 。
卢卡斯定理#
( n m ) ≡ ( n mod p m mod p ) × ( ⌊ n p ⌋ ⌊ m p ⌋ ) ( mod p ) ( n m ) ≡ ( n mod p m mod p ) × ( ⌊ n p ⌋ ⌊ m p ⌋ ) ( mod p )
人话翻译:原组合数等于将 n , m n , m 表示成 p p 进制后每一位分别求组合数并相乘。
关于证明:感觉可以仿照拓展卢卡斯用 CRT 证,但是我不会。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现