中国剩余定理学习

中国剩余定理( C R T CRT CRT)及其扩展( E X C R T EXCRT EXCRT)详解

基本形式

  • 中国剩余定理给出了以下的一元线性同余方程组的解:
    { x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) ⋮ x ≡ a n ( m o d m n ) \begin{cases} x \equiv a_1 \pmod{m_1} \\ x \equiv a_2 \pmod{m_2} \\ \qquad \vdots \\ x \equiv a_n \pmod{m_n} \end{cases} ⎩ ⎨ ⎧x≡a1(modm1)x≡a2(modm2)⋮x≡an(modmn)
    在中国剩余定理中: a 1 , a 2 , ... , a n a_1, a_2, \ldots, a_n a1,a2,...,an 是给定的余数, m 1 , m 2 , ... , m n m_1,m_2,\ldots,m_n m1,m2,...,mn两两互质,如果两两不互质则是扩展中国剩余定理。

前馈知识

  • 裴蜀定理

    • a x + b y = g c d ( a , b ) \ ax +by =gcd(a,b) ax+by=gcd(a,b)
    • 关于未知数的 x x x和 y y y的线性二元不等式一定存在整数 x x x, y y y使其成立
    • 裴蜀定理的求解采用扩展欧里定理 e x g c d ( a , b , x , y ) exgcd(a,b,x,y) exgcd(a,b,x,y)
  • 扩展欧几里算法

    • 核心是 g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b) 思路如下:

    • 第一层: a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b) ,递归到下一层, g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\% b) gcd(a,b)=gcd(b,a%b),同时向下传 x x x和 y y y,设为 x ′ x' x′和 y ′ y' y′

    • 第二层: b x ′ + a % b ∗ y ′ = g c d ( b , a % b ) bx'+a\%b*y'=gcd(b,a\%b) bx′+a%b∗y′=gcd(b,a%b),我们可以把 a % b a\%b a%b表示为 a − ⌊ a b ⌋ b a-\lfloor\frac{a}{b}\rfloor b a−⌊ba⌋b ,代入整理可得:
      a y ′ + b ( x ′ − a b y ′ ) = g c d ( b , a % b ) = g c d ( a , b ) = a x + b y ay'+b(x'-\frac{a}{b}y')=gcd(b,a\%b)=gcd(a,b)=ax+by ay′+b(x′−bay′)=gcd(b,a%b)=gcd(a,b)=ax+by

      比较可以得到第一层的 x x x和 y y y和第二层的 x ′ x' x′和 y ′ y' y′的关系为:
      x = y ′ , y = x ′ − a b y ′ x=y', y=x'-\frac{a}{b}y' x=y′,y=x′−bay′

    • 第二层的 x ′ x' x′和 y ′ y' y′由可以由第三层的 x ′ ′ x'' x′′和 y ′ ′ y'' y′′代入同样的求得,在递归终点时,我们只需要让 x = 1 , y = 0 x=1,y=0 x=1,y=0即可。

      Python 复制代码
      def exgcd(a,b,x,y):
          if b==0:
              return a,1,0
          d,x,y=exgcd(b,a%b,x,y)
          x,y=y,x-a//b*y
          return d,x,y
  • 逆元求解方法

    • 费马小定理

      • 费马小定理也就是用快速幂求解 q m i ( a , p − 2 , p ) qmi(a,p-2,p) qmi(a,p−2,p),其中 p p p为质数

        python 复制代码
        def qmi(a,b,p):
        	res=1%p
            while b:
                if b&1:res=res*a%p
                a=a*a%p
                b>>=1
            return res
    • 扩展欧几里得

      • 当 p p p不为质数时不能用费马小定理
      • 扩展欧几里得求逆元也就是 e x g c d ( a , p , x , y ) exgcd(a,p,x,y) exgcd(a,p,x,y),得到最小的 x x x后 x % p x\%p x%p就是逆元

同余方程求解过程

  • 同余方程 a x ≡ c ( m o d b ) ax \equiv c\pmod{b} ax≡c(modb) 可以化成一个二元一次不等式: a x + b y = c ax+by=c ax+by=c ,由整数解的充要条件是: g c d ( a , b ) ∣ c gcd(a,b)|c gcd(a,b)∣c ,假设 g c d ( a , b ) = d gcd(a,b)=d gcd(a,b)=d 可以用扩展欧几里得算法解出裴蜀等式 a x + b y = d ax+by=d ax+by=d的解,再乘上 c / d c/d c/d即可得到同余方程的一个特解(设为 x 0 x_0 x0和 y 0 y_0 y0)。可以得到通解如下:

{ x = x 0 + b 1 t y = y 0 − a 1 t \begin{cases} x = x_0 + b_1t \\ y = y_0 - a_1t \end{cases} {x=x0+b1ty=y0−a1t

​ 其中, a 1 = a g c d ( a , b ) , b 1 = b g c d ( a , b ) a_1 = \frac{a}{gcd(a,b)},b_1=\frac{b}{gcd(a,b)} a1=gcd(a,b)a,b1=gcd(a,b)b 。证明:将 x , y x,y x,y 代入 a x + b y = g c d ( a , b ) ax+by=gcd(a, b) ax+by=gcd(a,b) 可以发现还等于这个式子。

C R T CRT CRT问题的解决方法

  • CRT主要利用 m 1 , m 2 , ... , m n m_1,m_2,\dots,m_n m1,m2,...,mn 为两两互质的整数的性质。我们可以令:
    M = m 1 × m 2 × ⋯ × m n = ∏ i = 1 n m i M i = M / m i M=m_1 \times m_2 \times \dots \times m_n = \begin{equation} \prod_{i=1}^{n}m_i \end{equation}\\ M_i = M/m_i M=m1×m2×⋯×mn=i=1∏nmiMi=M/mi

    明显这里的 M i M_i Mi是和 m i m_i mi互质的。

  • 接着我们定义逆元:
    t i = M i − 1 t_i = M_i^{-1} ti=Mi−1

  • 所以我们可以构造出一个解 x 0 x_0 x0
    x 0 = ∑ i = 1 n a i M i t i x_0 = \sum_{i=1}^{n}a_iM_it_i x0=i=1∑naiMiti

  • 解释 ∀ j ∈ [ 1 , n ] \forall j \in [1,n] ∀j∈[1,n]:
    { a j M j t j % m i = 0 j ≠ i a j M j t j % m i = a i j = i \begin{cases} a_jM_jt_j \% m_i = 0 \ \ \ \ \ \ j\neq i \\ a_jM_jt_j \% m_i = a_i \ \ \ \ \ j=i \end{cases} {ajMjtj%mi=0 j=iajMjtj%mi=ai j=i

  • 通解就是 x = x 0 + k M x = x_0 + kM x=x0+kM,而CRT问题所求的最小整数解其实就是 a n s = x % M ans = x \% M ans=x%M

E X C R T EXCRT EXCRT问题的解决方法

  • 当 m 1 , m 2 , ... , m n m_1,m_2,\dots ,m_n m1,m2,...,mn没有两两互质时就不能使用CRT了。

  • 观察下面的同余方程式子

    \\begin{cases} x \\equiv 2 \\pmod{4} \\ x \\equiv 4 \\pmod{6} \\end{cases} \\Rightarrow x \\equiv 10\\pmod{12}

    { x ≡ 2 ( m o d 4 ) x ≡ 3 ( m o d 6 ) ⇒ ∅ \begin{cases} x \equiv 2 \pmod{4} \\ x \equiv 3 \pmod{6} \end{cases} \Rightarrow \emptyset {x≡2(mod4)x≡3(mod6)⇒∅

    可以发现合同余方程在一定条件下是可以合并的,并且模数是原来模数的最小公倍数,当然也会出现无解的情况。

  • 合并流程

    • 假设前 k − 1 k-1 k−1个同余方程合并得到新的方程为: x = r 1 ( m o d M ) x = r_1 \pmod{M} x=r1(modM) , M M M是前 k − 1 k-1 k−1个同余方程模数的最小公倍数,现在需要考虑合并第 k k k个方程: x = r 2 ( m o d m k ) x = r_2 \pmod{m_k} x=r2(modmk)。

    • 对于前 k − 1 k-1 k−1个同余方程,其通解为 x = r 1 + i ∗ M , i ∈ Z x=r_1+i*M,i \in Z x=r1+i∗M,i∈Z,接着在通解里面找到一个 t t t,使得 ( r 1 + t ∗ M ) % m k = r 2 (r_1+t*M) \%m_k=r_2 (r1+t∗M)%mk=r2,即可满足第 k k k个方程。那么合并后前 k k k个同余方程的通解就是
      x = r 1 + t ∗ M + i ∗ l c m ( M , m k ) , i ∈ Z x = r_1 + t*M + i* lcm(M,m_k), \ i \in Z x=r1+t∗M+i∗lcm(M,mk), i∈Z

      再对通解模 l c m ( M , m k ) lcm(M,m_k) lcm(M,mk) 即可得到新的 a n s ans ans作为前 k k k个同余方程的最小整数解。

    • 其中找 t t t的过程: M ∗ t + m k ∗ y = r 2 − r 1 M*t + m_k*y=r_2-r_1 M∗t+mk∗y=r2−r1,其中 M M M就是裴蜀等式的 a , t a,t a,t就是裴蜀等式的 x x x,其中 r 2 − r 1 r_2-r_1 r2−r1要满足 g c d ( M , m k ) ∣ ( r 2 − r 1 ) gcd(M,m_k)|(r_2-r_1) gcd(M,mk)∣(r2−r1),否则无解。

    • 我们先用扩展欧几里得求解出 M ∗ t + m k ∗ y = g c d ( M , m k ) M*t + m_k*y=gcd(M,m_k) M∗t+mk∗y=gcd(M,mk),顺便求出 g c d ( M , m k ) gcd(M,m_k) gcd(M,mk),再将得到的解 t = t ∗ r 2 − r 1 g c d ( M , m k ) t = t* \frac{r_2-r_1}{gcd(M,m_k)} t=t∗gcd(M,mk)r2−r1,即可求得 t t t。

相关推荐
OTWOL6 分钟前
两道数组有关的OJ练习题
c语言·开发语言·数据结构·c++·算法
qq_4335545433 分钟前
C++ 面向对象编程:递增重载
开发语言·c++·算法
带多刺的玫瑰1 小时前
Leecode刷题C语言之切蛋糕的最小总开销①
java·数据结构·算法
巫师不要去魔法部乱说1 小时前
PyCharm专项训练5 最短路径算法
python·算法·pycharm
qystca2 小时前
洛谷 P11242 碧树 C语言
数据结构·算法
汤姆和佩琦2 小时前
2024-12-25-sklearn学习(20)无监督学习-双聚类 料峭春风吹酒醒,微冷,山头斜照却相迎。
学习·聚类·sklearn
冠位观测者2 小时前
【Leetcode 热题 100】124. 二叉树中的最大路径和
数据结构·算法·leetcode
悲伤小伞2 小时前
C++_数据结构_详解二叉搜索树
c语言·数据结构·c++·笔记·算法
好学近乎知o2 小时前
正则表达式(学习Django过程中可能涉及的)
学习·正则表达式·django
雨中奔跑的小孩2 小时前
爬虫学习案例8
爬虫·学习