当前位置: 首页 > news >正文

中国剩余定理

中国剩余定理(Chinese Remainder Theorem)详解:从原理到代码实现

在数论和计算机科学中,中国剩余定理(CRT)是一种处理多个模运算方程组的强大工具,它不仅用于解线性同余方程组,还广泛应用于密码学、RSA算法、信号处理等领域。本文将从原理讲起,结合例子逐步深入,并提供可运行的代码实现。


一、什么是中国剩余定理?

中国剩余定理是关于整数同余方程组求解的一条基本定理,它的基本形式如下:

定理表述:

设有 k k k 个整数模数 m 1 , m 2 , … , m k m_1, m_2, \dots, m_k m1,m2,,mk,它们两两互素,即 gcd ⁡ ( m i , m j ) = 1 , ∀ i ≠ j \gcd(m_i, m_j) = 1, \forall i \neq j gcd(mi,mj)=1,i=j,给定如下方程组:

{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) ⋮ x ≡ a k ( m o d m k ) \begin{cases} x \equiv a_1 \pmod{m_1} \\ x \equiv a_2 \pmod{m_2} \\ \vdots \\ x \equiv a_k \pmod{m_k} \end{cases} xa1(modm1)xa2(modm2)xak(modmk)

则该方程组有唯一解 ( m o d M ) \pmod{M} (modM),其中 M = m 1 ⋅ m 2 ⋯ m k M = m_1 \cdot m_2 \cdots m_k M=m1m2mk


二、逆元

对于整数 a a a m m m,如果存在一个整数 x x x,使得:

a ⋅ x ≡ 1 ( m o d m ) a \cdot x \equiv 1 \pmod{m} ax1(modm)

那么我们称 x x x a a a 在模 m m m 意义下的乘法逆元(modular inverse),记作:

x = a − 1 ( m o d m ) x = a^{-1} \pmod{m} x=a1(modm)

2.1 存在条件:

当且仅当 gcd ⁡ ( a , m ) = 1 \gcd(a, m) = 1 gcd(a,m)=1,也就是 a a a m m m 互素时, a a a 才有模 m m m 下的逆元。

2.2 逆元的计算:(扩展欧几里得)

欧几里得算法用于求最大公约数 g c d ( a , b ) gcd(a, b) gcd(a,b),扩展版本则还能找到整数解 ( x , y ) (x, y) (x,y),满足:

a x + b y = gcd ⁡ ( a , b ) a x + b y = \gcd(a, b) ax+by=gcd(a,b)

g c d ( a , m ) = 1 gcd(a, m) = 1 gcd(a,m)=1 时,我们可以得到一组 x , y x, y x,y 使:

a x + m y = 1 ⇒ a x ≡ 1 ( m o d m ) a x + m y = 1 \Rightarrow a x \equiv 1 \pmod{m} ax+my=1ax1(modm)

所以 x x x 就是 a a a 的模 m m m 逆元。

2.3 代码求解逆元的实现(python为例)

def extended_gcd(a, b):
    if b == 0:
        return a, 1, 0
    d, x1, y1 = extended_gcd(b, a % b)
    x, y = y1, x1 - (a // b) * y1
    return d, x, y

# 逆元求解
def mod_inverse(a, m):
    d, x, _ = extended_gcd(a, m)
    if d != 1:
        raise Exception("逆元不存在")
    return x % m

三、基本思想

M = m 1 m 2 ⋯ m k M = m_1 m_2 \cdots m_k M=m1m2mk,令 M i = M m i M_i = \dfrac{M}{m_i} Mi=miM,然后我们找到 y i y_i yi,使得:

M i ⋅ y i ≡ 1 ( m o d m i ) M_i \cdot y_i \equiv 1 \pmod{m_i} Miyi1(modmi)

y i y_i yi M i M_i Mi m i m_i mi乘法逆元

最终解为:

x ≡ ∑ i = 1 k a i ⋅ M i ⋅ y i ( m o d M ) x \equiv \sum_{i=1}^k a_i \cdot M_i \cdot y_i \pmod{M} xi=1kaiMiyi(modM)


三、通俗例子

🌰 例子 1:

解如下方程组:

{ x ≡ 2 ( m o d 3 ) x ≡ 3 ( m o d 5 ) x ≡ 2 ( m o d 7 ) \begin{cases} x \equiv 2 \pmod{3} \\ x \equiv 3 \pmod{5} \\ x \equiv 2 \pmod{7} \end{cases} x2(mod3)x3(mod5)x2(mod7)

  • M = 3 ⋅ 5 ⋅ 7 = 105 M = 3 \cdot 5 \cdot 7 = 105 M=357=105
  • M 1 = 105 / 3 = 35 M_1 = 105/3 = 35 M1=105/3=35,求 y 1 y_1 y1 使 35 y 1 ≡ 1 ( m o d 3 ) ⇒ y 1 = 2 35y_1 \equiv 1 \pmod{3} \Rightarrow y_1 = 2 35y11(mod3)y1=2
  • M 2 = 105 / 5 = 21 M_2 = 105/5 = 21 M2=105/5=21 21 y 2 ≡ 1 ( m o d 5 ) ⇒ y 2 = 1 21y_2 \equiv 1 \pmod{5} \Rightarrow y_2 = 1 21y21(mod5)y2=1
  • M 3 = 105 / 7 = 15 M_3 = 105/7 = 15 M3=105/7=15 15 y 3 ≡ 1 ( m o d 7 ) ⇒ y 3 = 1 15y_3 \equiv 1 \pmod{7} \Rightarrow y_3 = 1 15y31(mod7)y3=1

带入公式:
x = 2 ⋅ 35 ⋅ 2 + 3 ⋅ 21 ⋅ 1 + 2 ⋅ 15 ⋅ 1 = 140 + 63 + 30 = 233 ⇒ x ≡ 233 ( m o d 105 ) ⇒ x = 233   m o d   105 = 23 x = 2 \cdot 35 \cdot 2 + 3 \cdot 21 \cdot 1 + 2 \cdot 15 \cdot 1 = 140 + 63 + 30 = 233 \Rightarrow x \equiv 233 \pmod{105} \Rightarrow \boxed{x = 233 \bmod{105} = 23} x=2352+3211+2151=140+63+30=233x233(mod105)x=233mod105=23


四、Python代码实现

def extended_gcd(a, b):
    if b == 0:
        return a, 1, 0
    d, x, y = extended_gcd(b, a % b)
    return d, y, x - (a // b) * y

def mod_inverse(a, m):
    d, x, _ = extended_gcd(a, m)
    if d != 1:
        raise Exception("逆元不存在")
    return x % m

def chinese_remainder(a_list, m_list):
    assert len(a_list) == len(m_list)
    M = 1
    for m in m_list:
        M *= m
    result = 0
    for ai, mi in zip(a_list, m_list):
        Mi = M // mi
        yi = mod_inverse(Mi, mi)
        result += ai * Mi * yi
    return result % M

✅ 使用示例:

a = [2, 3, 2]
m = [3, 5, 7]
x = chinese_remainder(a, m)
print(f"x = {x}")  # 输出 x = 23

五、应用场景

  • 密码学:RSA解密加速
  • 并行计算:多个核分别处理模运算再合并
  • 编码理论:错误检测与纠正
  • 图灵奖得主姚期智的多方安全计算中也广泛用到CRT

六、常见注意点

  1. 所有模数必须两两互素
  2. 若不互素也可以用扩展版本的中国剩余定理,但解不唯一;
  3. 逆元必须存在,即 gcd ⁡ ( M i , m i ) = 1 \gcd(M_i, m_i) = 1 gcd(Mi,mi)=1
  4. 计算量大时注意整数溢出,可以用 Python 的大整数或语言自带库。

七、练习题推荐

练手编程题:洛谷P1495 中国剩余定理


相关文章:

  • AI重构SEO关键词智能布局
  • TS中is关键字详解
  • Day51 | 3. 无重复字符的最长子串、12. 整数转罗马数字、49. 字母异位词分组、73. 矩阵置零
  • Class<?> 和Class<T >有什么区别
  • 设计模式简述(一)设计原则
  • 1.0 软件测试全流程解析:从计划到总结的完整指南
  • C++浅谈转型操作符
  • 看爬山虎学本领 软爬机器人来创新 各种场景能适应
  • @reduxjs/toolkit 报错,解决
  • CF每日5题(1300-1500)
  • M-CTC-T: 面向大规模多语言语音识别的伪标签技术
  • 前后端分离下,Spring Boot 请求从发起到响应的完整执行流程
  • wordpress可视化数据采集Scrapes插件,WP博客网站自动采集发布
  • Python 匿名函数(Lambda函数)
  • kmpmanacher
  • 001 vue
  • 从零开始:在Qt中使用OpenGL绘制指南
  • 前向传播、反向传播
  • PDF处理控件Aspose.PDF教程:在Python、Java 和 C# 中旋转 PDF 文档
  • 无限滚动(Infinite Scroll)页面谷歌不收录!必须改回分页吗?