中国剩余定理和欧几里得定理
来源:互联网 发布:程序员高效使用mac 编辑:程序博客网 时间:2024/05/16 08:05
中国剩余定理和欧几里得定理
中国剩余定理
定理描述:
中国剩余定理:求解同余式组的方法。
例如下面的一元线性同余方程组:
x ≡ a1 (mod m1)
x ≡ a2 (mod m2)
x ≡ a3 (mod m3)
. . . . . .
x ≡ an (mod mn)
中国剩余定理:假设整数m1, m2, m3......, mn两两互质,则对于任意的整数a1, a2, a3...., x有解。
解决问题类型:
在<孙子算经>里有一个问题: 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
计算及推导:
他的计算过程是:
70是能被5和7整除的数字,除以3正好余1。
21是能被3和7整除的数字,除以5正好余1。
15是能被3和5整除的数字,除以7正好余1。
最后结果就为:( 70*2 + 21*3 + 15*2 ) % LCM(3, 5, 7) == 23
就是说对于上面一元组的3个方程要逐级满足,相加之后并不会影响求余的结果,然后modLCM(3, 5,7)就是最小的答案。
先满足第一个一元组 x ≡ 2 (mod 3) ,70能被5和7整除,除以3余1,然后乘上2后得到N1,N1就满足了一元组中的第一个式子。依次类推,对一元组中的每个式子都求出Ni,然后相加所得的X就是最终答案(因为Ni可以整除集合a中的所有元素,除ai之外,故对于第i个一元组来说,X加上Nj (j!=i), 并不会对mod ai有影响)。
那么再看开始时候提到的一元线性同余方程:(先做几个设定:设Ni为能够被m1, m2,......, mi-1, mi+1, .....mn整除,但是除以mi正好余1)
X = N1*a1 + N2*a2 + ....... + Nn*an就是我们要求的一个解,解集为X mod LCM(m1, m2, ...., mn)。
剩下的问题就变成了如何求解N1, N2, ......, Nn,我们继续向下看:
假设m = LCM(m1, m2, ......, mn), x', y'为任意整数。
因为Ni的性质,Ni可以表示为:Ni == m / mi * x' == mi * y' + 1 ==> m / mi * x' + (-mi) * y' == 1.
推到现在有没有感觉很熟悉,对的!这个就是扩展欧几里德:对于gcd(a, b) = d, 存在a*x+b*y == gcd(a, b)
存在gcd(-mi, m/mi) == 1, 对于m / mi * x' + (-mi) * y' == 1, 套用一下扩展欧几里德求出x', 就可以求解出Ni。有了Ni就出X就是分分钟的事情辣!
实现代码:
1 LL CRT (LL m[], LL a[], LL n) 2 {//n 一元同余方程的个数 3 LL M = 1, ans = 0; 4 LL Mi, x, y; 5 6 for (int i=0; i<n; i++) 7 M *= m[i]; 8 9 for (int i=0; i<n; i++)10 {11 Mi = M / m[i];12 LL d = Extended_Euclid (Mi, m[i], x, y);13 //扩展欧几里德14 x = (x % m[i] + m[i]) % m[i];15 //注意这里x有可能为负数,要转化为正数16 17 LL res = quick_add (x, Mi, M);18 //x * Mi * bi 有可能爆LL,用快速加代替乘法就完美维护19 res = quick_add (res, a[i], M);20 ans = (ans + res) % M;21 }22 return (ans + M) % M;23 }
- 中国剩余定理和欧几里得定理
- 【转】欧几里得、中国剩余定理
- 扩展欧几里得、中国剩余定理 入门指南
- poj1006 扩展欧几里得算法+中国剩余定理
- poj1006_Biorhythms_扩展欧几里得_中国剩余定理
- 中国剩余定理及扩展欧几里得算法
- 扩展的欧几里得&中国剩余定理
- 同余式和中国剩余定理
- 中国剩余定理模版【中国剩余定理】
- 孙子定理 中国剩余定理
- 中国剩余定理 /孙子定理
- 中国剩余定理(孙子定理)
- [BZOJ 1951] 古代猪文【Lucas定理/费马小定理/中国剩余定理/扩展欧几里得】
- [BZOJ 1951][Sdoi2010]古代猪文:Lucas定理|中国剩余定理|费马小定理|扩展欧几里得
- POJ 1006 Biorhythms 中国剩余定理/扩展欧几里得
- [BZOJ 1407][NOI 2002]Savage(中国剩余定理+扩展欧几里得)
- 中国剩余定理+扩展欧几里得求逆元 hdu 1006
- BZOJ-1407 Savage 枚举+拓展欧几里得(+中国剩余定理??)
- python list方法
- iOS开发自定义navigationBar上的左右按钮
- Android touch mode和focusableInTouchMode分析
- 文章标题
- ubuntu14.04 maven的安装
- 中国剩余定理和欧几里得定理
- GROUP BY后使用ROLLUP子句总结
- Codeforces Educational Codeforces Round 5
- 使用sync-request和cheerio写爬虫
- 超全!整理常用的iOS第三方资源
- MCAdvertiserAssistant
- ZOJ1049-I Think I Need a Houseboat
- Android 处理滑动冲突的时候遇到的问题Invalid pointerId=-1 in onTouchEvent
- 2016宁波国际文具创意设计大赛——“演绎 Deduce”