随笔 - 87  文章 - 279  trackbacks - 0
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

潜心看书研究!

常用链接

留言簿(19)

随笔分类(81)

文章分类(89)

相册

ACM OJ

My friends

搜索

  •  

积分与排名

  • 积分 - 211780
  • 排名 - 116

最新评论

阅读排行榜

评论排行榜

问题简单来说就是 a = ai (mod ni)   求未知数a,
 以下小结略去证明, 只是对定理作了必要的解释, 要了解相关定理,可查阅数论资料.

中国余数定理:
      设 n=n1*n2...nk, 其中因子两两互质.有:  a-----(a1,a2,...,ak), 其中ai = a mod ni, 则 a和(a1,a2,...,ak)关系是一一对应的.就是说可以由 a求出(a1,a2,...,ak), 也可以由(a1,a2,...,ak)求出a

推论1:
      对于 a=ai  (mod ni) 的同余方程,有唯一解

下面说说由(a1, a2, ..., ak)求a的方法:
定义 mi = n1*n2*...nk / ni;   ci = mi(mf  mod ni);   其中 mi*mf  mod ni = 1;
         则 a = (a1*c1+a2*c2+...+ak*ck)      (mod n)      (注:由此等式可求a%n, 当n很大时)

中国剩余定理关键是mf的求法,如果理解了扩展欧几里得 ax+by=d, 就可以想到:
                     mi*mf  mod ni = 1 => mi*mf+ni*y=1;

代码如下:

 

#include <iostream>
#include 
<cmath>
using namespace std;

const int MAXN = 100;
int nn, a[MAXN], n[MAXN];

int egcd(int a, int b, int &x, int &y) {
    
int d;
    
if (b == 0) {
        x 
= 1; y = 0;
        return a;
    } 
else {
        d 
= egcd(b, a%b, y, x);
        y 
-= a/b*x;
        return d;
    }
}

int lmes() {
    
int i, tm=1, mf, y, ret=0, m;
    
for (i=0; i<nn; i++) tm *= n[i];
    
for (i=0; i<nn; i++) {
        m 
= tm/n[i];
        egcd(m, n[i], mf, y);
        ret 
+= (a[i]*m*(mf%n[i]))%tm;
    }
    return (ret
+tm)%tm;
}

int main() {
    a[
0= 4; a[1= 5;
    n[
0= 5; n[1= 11;
    nn 
= 2;
    printf(
"%d\n", lmes());
    return 
0;
}


 

posted on 2007-08-27 16:46 阅读(11543) 评论(2)  编辑 收藏 引用 所属分类: 算法&ACM

FeedBack:
# re: 中国剩余定理(同余方程组)小结 2007-09-18 10:11 drizzlecrj
学习~  回复  更多评论
  
# re: 中国剩余定理(同余方程组)小结 2009-01-09 16:26 zhangyi
http://www1.bookan.com.cn/Search.aspx?keyword=%CA%A3%D3%E0%B1%B6%B7%D6%B7%A8&type=2&x=21&y=13
去学习一下 “剩余倍分法”
重解“中国剩余定理”
摘要:整数整除剩余问题的出现及其一般解法,是人们正在苦苦寻找的数学问题之一。与此类似的剩余问题早已出现在公元4、5世纪左右的《孙子算经》里,人们把剩余问题归类到“中国剩余定理”的名下,出现在《数论》的数学领域中。本文在对“中国剩余定理”分析的基础上,给出一种简便、易学、易懂可普及应用的新方法,覆盖“中国剩余定理”。
关键词:用2,3作除数导出公式、基础数;倍分式、余一、少一、新方法。
  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理