中国剩余定理
前言
今天把数学一本通往后看了一页,发现是中国剩余定理。看完之后,一窍不通,于是自己在 奇妙的网络 上搜索资源,缓慢地学会了。
不会LATEX(
思路
一般来说中国剩余定理需要求满足条件的最小值,很容易想到这样的值不止一个,所以就像求线性同余方程(实际上,中国剩余定理就是求特殊的线性同余方程组)的解一样,先找特殊解,然后利用通解公式找到最小正整数解。
声明
中国剩余定理可以简化为求一个 x,使得
x % a[ 1 ] == b[ 1 ]
x % a[ 2 ] == b[ 2 ]
......
x % a[ n ] == b[ n ]
设所有 a[ 1->n ] 的积为 a
设m[ i ] = tot / a[i]
m[ i ]-1 为 m[ i ] 在 (mod a[ i ]) 意义下的逆元
通解
看完第一篇题解之后,我对于通解为什么是 x + kb 产生了疑问。很多题解开篇就声明,没有给出解释,被我直接跳过了。但是这东西其实非常简单(所以正经题解不会解释)。
我们设当前已经得到了一个解 x,另外还有一个解是 y。
那么
x ≡ b[ i ] (mod a[ i ])
y ≡ b[ i ] (mod a[ i ])
所以
x ≡ y (mod a[ i ])
所以
(y - x) | a[ i ]
同理
(y - x) | a[ j ]
而因为对于所有的 a[ i ] a[ j ],i ≠ j,a[ i ] a[ j ] 互质
所以
(y - x) | a
也就是说
y = x + ka
构造特殊解
对于一个单独的方程来看
x ≡ b[ i ] (mod a[ i ])
我们可以用 一个 a[ i ] 的倍数加上一个 ≡ b[ i ] (mod a[ i ]) 的数字
考虑这个数字
b[ i ] ≡ b[ i ] * 1 ≡ b[ i ] * (m[ i ] * m[ i ]-1) (mod a[ i ])
而我们惊奇的发现,这个数字 b[ i ] * m[ i ] * m[ i ]-1 在不 mod a[ i ] 的情况下(毕竟如果 mod a[i] 就成 1 了)是所有的 a[ j ],j ≠ i 的倍数。
也就是说,对于所有的方程组我们取出这样一个 b[ i ] * m[ i ] * m[ i ]-1 并且相加,就可以得到一个特殊解 x。
为什么呢?我们挨个检查每个方程式。
对于方程式 i, 把 x 分解成 b[ i ] * m[ i ] * m[ i ]-1 和 b[ j ] * m[ j ] * m[ j ]-1,j ≠ i 的和。
对于这个和
我们发现每一项的 m[ j ] 中必然会包含一个因子 a[ i ],因为 m[ j ] 是 a 剥离出了 a[ j ],而没有剥离出 a[ i ]。所以,这个和为 a[ i ] 的倍数。
对于这个数
b[ i ] * m[ i ] * m[ i ]-1,已经提到过,在 (mod a[ i ]) 的意义下 ≡ b[ i ]。
两者结合,这正是我们一开始考虑的一个倍数和一个数字。
显然对于每个方程式 i,都可以像上述过程一样满足条件。故 x 可作为特殊解。
求最小正整数解
x % a
结语
学会了中国剩余定理,以及加强了对于同余知识的掌握。
题外话
数学苦手应该好好学数学。
从洛谷上搬运过来,为了自己的审美改格式,改了半个多小时,头要掉了......
同时也发现了一些博客园的功能,以后的格式应该会更用可读性的。