中国剩余定理( 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即可。
Pythondef 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为质数
pythondef 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。
-