扩展 CRT
突然发现博客里中国剩余定理的文章少之又少。。。
然后昨天考场上忘了 CRT… 然后就自己 YY 了一个扩展 CRT 发现是对的。。。
(换句话说就是我想了半天想起来了)
于是印象加深了很多,就写篇文章记录一下。。。
首先扩展 CRT 是用来解决模数不互质情况下的模意义一元线性方程组的
思想就是把方程两两合并。
比如:
x≡a1 mod p1
x≡a2 mod p2
其中 x是未知数,p1,p2不互质
我们按套路转化一下式子:
x=p1k1+a1
代入第二个式子:
p1k1+a1≡a2 mod p2
移项:
p1k1≡a2–a1 mod p2
OK,是不是很眼熟?
用扩展欧几里得呀!
设 d=gcd(p1,p2)
由扩展欧几里得定理可知方程有解当且仅当 d∣a2–a1,否则无解
然后等号两边同除一个 d:
p1dk1≡a2–a1d mod p2d
k1≡a2–a1d×(p1d)−1 mod p2d
其中 (p1d)−1表示 p1d在模 p2d意义下的逆元,很显然这个逆元就是前面欧几里得求出的 k1
设 k=a2–a1d×(p1d)−1
则 k1=k+p2d×i
回代:
x=p1k1+a1
=p1(k+p2d×i)+a1
=p1×p2d×i+p1×k+a1
≡p1×k+a1 mod p1×p2d
另外为了方便,我们其实不需要单独计算 k的值,直接用 k1代替即可。
因为:
k≡k1 mod p2d
所以:
p1×k≡p1×k1 mod p1×p2d
因此用 k1和k是等价的
所以合并的式子也可以写成:
x≡x0 mod lcm(p1,p2)
x0是这组方程的解。
例题
【模板】扩展中国剩余定理(EXCRT)—— LUOGU – 4777
代码:
4 条评论
mqh · 2020年1月3日 9:40 下午
为什么 k 恒等 k1mod(p2/d) 呢?
不是 k1 恒等 kmod(p2/d) 吗? 上面有 k1=k+(p2/d)*i 呀
可以解释一下吗,谢谢啦
mqh · 2020年1月3日 8:51 下午
p1k1+a1 恒等 a2modp2
移项后不是
p1k1 恒等 -a1+a2modp2 吗?
mqh · 2020年1月3日 9:33 下午
我懂了 ^_^
Remmina · 2020年1月4日 12:31 下午
(* ̄︶ ̄) 那就好~