码迷,mamicode.com
首页 > 其他好文 > 详细

中国剩余定理

时间:2015-09-04 08:43:18      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:

1 中国剩余定理:

设正整数m1, m2, m3 …… mk两两互素,则一次同余方程组 x ≡ ai (mod mi) i = 1, 2, 3, ……, k有整数解,且在mod m = m1* m2 * m3 …… mk下解是唯一的,即任意两个解都是mod m同余的

设Mi = m / mi; 那么

技术分享

因为Mi(i = 1, 2, 3, …… , i != k) 是mk的倍数,可以约去,

技术分享中 

其中技术分享技术分享的逆,所以技术分享  ≡  1 (mod mk)

技术分享mod mk等于 1 ,所以技术分享mod mk 等于ak

所以所求x是满足所有条件的解

#include <iostream>
#include <stdio.h>
#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;
}

 

中国剩余定理

标签:

原文地址:http://www.cnblogs.com/rain-1/p/4781216.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!