(ACM数论)中国剩余定理(孙子定理)

原创 2016年08月29日 20:41:42

中国剩余定理是一种能求解一次同余方程组的姿势~

首先我们来看看什么是一次同余方程组:

X % a[1] = b[1]

X % a[2] = b[2]

….

X % a[n] = b[n]

这里的 % 是取余数的意思,使用这个姿势的前提是a[1]、a[2]、a[3]、… 、a[n]两两互质。

令 X = X[1] + X[2] + … + X[n],此时只要找到一组 X[i] 满足 X[i] % a[i] = b[i] 且 X[i] % a[1…n(除了i)]= 0 成立即可。

要使 X[i] % a[1…n(除了i)]= 0 成立,只需要让 X[i] 等于他们乘积的倍数即可。令M为他们乘积,于是有 X[i] = k * M(其中k为任意整数)。

将 X[i] = k * M 代入 X[i] % a[i] = b[i] 得到 (k * M) % a[i] = b[i]

即 k * M + o * a[i] = b[i] (其中o为任意整数)

两边同时除以 b[i] 可得到 k’ * M + o’ * a[i] = 1

即 k’ * M % a[i] = 1

此时 k’ 为 M 对 a[i](质数)的 乘法逆元 (关于乘法逆元可以参考我的这篇文章:http://blog.csdn.net/kasumimasami/article/details/52354715

所以对式子 k’ * M + o’ * a[i] = 1 两边同时乘以 b[i] 可得到

k’ * b[i] * M + o’ * b[i] * a[i] = b[i] 即 k’ * b[i] * M % a[i] = b[i]

所以 X[i] = k’ * b[i] * M

所以 X = ni[1] * b[1] * M[1] + ni[2] * b[2] * M[2] + … + ni[n] * b[n] * M[n],其中 ni[i] 为 M[i] 对 a[i](质数)的 乘法逆元

代码如下:

int fastpow(int a,int b,int mod)// a ^ b % mod
{
    int r = 1;
    while(b)
    {
        if(b&1)
            r = r * a % mod;
        a = a * a % mod;
        b = b >> 1;
    }
    return r;
}

int CRT(int a[], int b[], int len)//数组a,b如上定义,len为方程的个数
{
    int m = 1 , X = 0;
    for(int i = 1; i <= len; i++)
    {
        m = m * a[i];
    }
    for(int i = 1; i <= len; i++)
    {
        int M = m / a[i];//除了a[i]的乘积M[i]
        int ni = fastpow(M,(a[i]-2),a[i]);//求M[i]关于a[i]的乘法逆元ni[i]
        X = X + ni * M * b[i];
    }
    //返回满足的最小正整数
    while(X < 0)
        X = X + m;
    return X % m;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ 1006 中国剩余定理(孙子定理) ——数论

(大部分摘抄) 中国剩余定理:         在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”这...

从"孙子算经"到"中国剩余定理"

中国剩余定理中间涉及一个重要观念:互质;首先来看《孙子算经》卷下第二十六问:今有物,不知其数。三、三数之,剩二;五、五数之,剩三;七、七数之,剩二。问物几何?转换为数学语言即是:...

同余方程组,中国剩余定理,孙子定理(学习)

同余方程组,中国剩余定理(孙子定理)学习从孙子定理介绍起把,其实对于它的由来大家还是很有兴趣了解一下的。 以下是我取于互动百科的内容: 中国南北朝时期(5~6世纪)著名的著作《孙子算经》中“物不知...

数论常用内容——中国剩余定理

中国剩余定理中国剩余定理是中国古代求解一次同余式组(见同余)的方法。是数论中一个重要定理。又称孙子定理。用现代数学的语言来说明的话,中国剩余定理给出了下图所示的一元线性同余方程组有解的判定条件,并用构...

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门,  所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) 一、同余定理 简单粗暴的说就是:若 a-b ...

20140714 「初等数论 - 中国剩余定理」 POJ 1006 Biorhythms

数论:拓展欧几里得 + 同余模方程模板一份。 题解嘛,有空再补。。。(其实就是模板题。) #include #include using namespace std; type...

【中国剩余定理】【容斥原理】【快速乘法】【数论】HDU 5768 Lucky7

题目链接:   http://acm.hdu.edu.cn/showproblem.php?pid=5768 题目大意:   T组数据,求L~R中满足:1.是7的倍数,2.对n个素数有 %pi!=ai...

fzu 1402(数论:中国剩余定理)

典型的中国剩余定理题,我用自己写的剩余定理跪掉了 原因是我在套用

数论基础题目八题【欧几里得】【筛法素数】【中国剩余定理】

数论前期基础题目八道。

孙子剩余定理的C语言实现

  • 2011年04月27日 13:29
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(ACM数论)中国剩余定理(孙子定理)
举报原因:
原因补充:

(最多只允许输入30个字)