中国剩余定理(CRT):求解模线性方程组
来源:互联网 发布:配电计算软件注册 编辑:程序博客网 时间:2024/05/16 18:19
定义
设有同余式组 (S):
(S):⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪x≡a1(modm1)x≡a2(modm2)x≡a3(modm3)⋮x≡ak(modmk)
即
x≡ai(modmi),i=1,2,..,k
其中
解的情况
有唯一解, 证明略。
下面会构造出此解,然后证明其正确性和唯一性。
设
M=∏ki=1mi//即所有m的积
Mi=Mmi//即除mi以外所有m的积
//M−1i为Mi的逆元(对模mi),即MiM−1i≡1(modmi)
则(S)的解为:
x=tM+∑i=1kaiMiM−1i
即
x=(∑i=1kaiMiM−1i)(modM)
下证其正确性:
我们考查任一在[1, k]内的第i项:
aiMiM−1i , 有
aiMiM−1i≡{ai⋅1≡(modmj),j=i0≡(modmj),j≠i
这里不难理解, 第二个为0是因为mj|Mi 。
所以x满足如下条件:
∀i∈{1,2,..,k} , 有
x=aiMiM−1i+∑j≠i(ajMjM−1J)≡ai+∑j≠i0≡ai(modmi)
综上, 此解正确。
下面证明其唯一性
假设
x1 和x2 都是方程组(S)的解,那么:
∀i∈{1,2,..,k} , 有x1−x2≡0(modmi)
即mi|(x1−x2)
那么显然M|(x1−x2)
即x1与x2 之间相差M的整数倍,那么在模M的范围内,只有一解。
更通用的解法
前面说的模线性方程组是k个m互素的情况, 那么更一般的呢?
更一般的模线性方程也能求解,只不过需要从前往后遍历每一个式子, 每一个都与下一个式子合并,作为一个新的式子继续与下一个合并, 最后得出结果。
重点!!!
我们先假设k=2时的情况,然后再慢慢推广。
此时(S)为
(S):{x≡a1(modm1)(1)x≡a2(modm2)(2)
即
{x=k1m1+a1(3)x=k2m2+a2(4)
我们将(3)(4)联立,得
, 即k1m1=k2m2+a2−a1
//这个式子特别重要k1m1≡a2−a1(modm2)(5)
因为(5)式未知数只有
x≡(a1+tm1)(modlcm(m1m2))(6)//lcm为最小公倍数
那么(6)式中的x即为同时满足(1)和(2)的x值,至此k=2的情况讨论完毕。
至于k>2的情况, 我们可以继续将(6)式与(3)式像(1)式和(2)式那样执行上面的操作,这样到最后得到的x就满足所有的条件了。
具体的操作可参考代码理解, 这里简单说一下中间量的维护:
每次对2个式子进行以上操作时, 第二个式子和以前一样,不作讨论,而第一个式了如果要写成
首先来说
m1 的变化 , 从(1)到(6),m1 变成了lcm(m1,m2 ), 如果接着往下走的话,m1 又会变成lcm(m1,m2,m3 ),…, 直到最后, m1变成所有m的最小公倍数。
而对于a1 的变化 ,我们可以这样想,如果k=1的话, 结果ans是等于a1 的,而k = 2的时候, 观察(6)我们会发现,a1 变成了a1+tm1 , 那结果呢, 结果ans(不看模)也变成了a1+tm1 , 如果再往下写你会发现, ans 不是变成了a1+tm1 , 而是变成了ans+t⋅lcm , 其中t 是由我们解(5)得到的。
这里说的有点乱,具体的细节可以结合下面的实现代码去理解。
实现
m[i] 与m[j] 互质:
int CRT(int a[], int m[], int k) { int i, d, x, y, Mi, ans = 0, M = 1; for (i = 0; i < k; i++) M *= m[i]; for (i = 0; i < k; i++) { Mi = M / m[i]; d = extgcd(m[i], Mi, x, y); // y 为逆元 -- Mi*y === 1 (% m[i]) ans = (ans + a[i]*y*Mi) % M; } if (ans > 0) return ans; else return (ans + M);}
m[i] 与m[j] 不一定互质:
LL mod(LL a, LL m) { //处理取模 LL res = a%m; if(res <= 0) res += m; return res;}bool CRT(LL a[], LL m[], LL k, LL& ans) { ans = a[0]; LL lcm = m[0], x, y, d; if(ans == 0) ans = m[0]; for(LL i = 1; i < k; ++i) { d = extgcd(lcm, m[i], x, y); //求t: t = (a[i]-ans)/d*x; if((a[i]-ans)%d) return 0; ans = mod(ans + lcm*mod((a[i]-ans)/d*x, m[i]/d),(lcm/d*m[i])); lcm = lcm/d*m[i]; } return 1;}
例题
POJ - 1006 Biorhythms
HDU - 1573X问题
POJ - 2891 Strange Way to Express Integers
平生写过的最浮夸的博客。。
- 中国剩余定理(CRT):求解模线性方程组
- 模线性方程组(中国剩余定理)
- 中国剩余定理 【CRT】 【记录】
- 中国剩余定理(CRT)
- 中国剩余定理(CRT)
- [CRT][中国剩余定理]膜法
- [数论]中国剩余定理 CRT
- [CRT][中国剩余定理]CRT小结
- Strange Way to Express Integers(扩展欧几里得+乘法逆元+中国剩余定理求解非互质的模线性方程组)
- 扩展欧几里德 中国剩余定理 合并模线性方程组
- HDU 1573 X问题 (中国剩余定理 模线性方程组)
- poj1006 中国剩余定理 + 推理中国剩余定理 CRT
- 中国剩余定理求解同余线性方程组—(互素和非互素的情况)
- 中国剩余定理求解同余线性方程组—(互素和非互素的情况)
- 中国剩余定理求解同余线性方程组(模数互素和非互素的情况)
- CRT(中国剩余定理)总结
- 中国剩余定理CRT (互质)
- 中国剩余定理(CRT)学习小结
- Mybatis-初学
- 论文阅读:Instance-sensitive Fully Convolutional Networks
- poj 3342
- 局域网 FTP建立,搭建一个简易的局域网服务器
- SQL注入关键词大全
- 中国剩余定理(CRT):求解模线性方程组
- Static关键字用法总结
- 五大常用算法之二:动态规划算法
- js中的跨域
- 深入理解计算机操作系统(2.2.2 2.2.3)
- 对const关键字的理解 时间:2017-01-05作者:华清远见
- 8.8训练日记
- HTML 使用表格制作简单的个人简历
- 如何解决datastage创建的工程权限不对的问题