29-中国剩余定理CRT

Posted zhumengdexiaobai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了29-中国剩余定理CRT相关的知识,希望对你有一定的参考价值。

https://blog.csdn.net/u010468553/article/details/38346195    

          中国剩余定理【数论】

中国剩余定理的具体描述是这样的:

技术分享图片

给出你n个ai和mi,最后让求出x的最小值是多少。

中国剩余定理说明:假设整数m1m2, ... , mn两两互质,则对任意的整数:a1a2, ... , an,方程组技术分享图片有解,并且通解可以用如下方式构造得到:

 

  1. 技术分享图片是整数m1m2, ... , mn的乘积,并设技术分享图片是除了mi以外的n - 1个整数的乘积。
  2. 技术分享图片技术分享图片技术分享图片的数论倒数:技术分享图片
  3. 方程组技术分享图片的通解形式为:技术分享图片 在模技术分享图片的意义下,方程组技术分享图片只有一个解:技术分享图片
 
           分割线                                                                                                                   
 
下面我们来看一个具体的例子:
 

使用中国剩余定理来求解上面的“物不知数”问题,便可以理解《孙子歌诀》中的数字含义。这里的线性同余方程组是:

技术分享图片

三个模数m1技术分享图片3, m2技术分享图片5, m3技术分享图片7的乘积是M技术分享图片105,对应的M1技术分享图片35, M2技术分享图片21, M3技术分享图片15. 而可以计算出相应的数论倒数:t1技术分享图片2, t2技术分享图片1, t3技术分享图片1. 所以《孙子歌诀》中的70,21和15其实是这个“物不知数”问题的基础解:

技术分享图片

而将原方程组中的余数相应地乘到这三个基础解上,再加起来,其和就是原方程组的解:

技术分享图片

这个和是233,实际上原方程组的通解公式为:

技术分享图片

《孙子算经》中实际上给出了最小正整数解,也就是k技术分享图片-2时的解:x技术分享图片23.

 

附:数论倒数 wiki
 
具体代码参考如下:(应该很明了)
  1.  
    ///n个mi互质
  2.  
    const LL maxn = 20;
  3.  
    LL a[maxn], m[maxn], n;
  4.  
    LL CRT(LL a[], LL m[], LL n)
  5.  
    {
  6.  
    LL M = 1;
  7.  
    for (int i = 0; i < n; i++) M *= m[i];
  8.  
    LL ret = 0;
  9.  
    for (int i = 0; i < n; i++)
  10.  
    {
  11.  
    LL x, y;
  12.  
    LL tm = M / m[i];
  13.  
    ex_gcd(tm, m[i], x, y);
  14.  
    ret = (ret + tm * x * a[i]) % M;
  15.  
    }
  16.  
    return (ret + M) % M;
  17.  
    }

       分割线                                                                                                                       
 
下面也就是关于这个的扩展,前面我们已经说了,中国剩余数定理是适用于n个mi两两互质的情况的,如果不互质呢,下面就是一个转换:

模不两两互质的同余式组可化为模两两互质的同余式组,再用孙子定理直接求解。

84=22×3×7,160=25×5,63=32×7,由推广的孙子定理可得 技术分享图片 与 技术分享图片 同解。

附图:详细讲解,转自传送门

技术分享图片

 

  1.  
    ///n个mi不互质
  2.  
    const LL maxn = 1000;
  3.  
    LL a[maxn], m[maxn], n;
  4.  
    LL CRT(LL a[], LL m[], LL n) {
  5.  
    if (n == 1) {
  6.  
    if (m[0] > a[0]) return a[0];
  7.  
    else return -1;
  8.  
    }
  9.  
    LL x, y, d;
  10.  
    for (int i = 1; i < n; i++) {
  11.  
    if (m[i] <= a[i]) return -1;
  12.  
    d = ex_gcd(m[0], m[i], x, y);
  13.  
    if ((a[i] - a[0]) % d != 0) return -1; //不能整除则无解
  14.  
    LL t = m[i] / d;
  15.  
    x = ((a[i] - a[0]) / d * x % t + t) % t; //第0个与第i个模线性方程的特解
  16.  
    a[0] = x * m[0] + a[0];
  17.  
    m[0] = m[0] * m[i] / d;
  18.  
    a[0] = (a[0] % m[0] + m[0]) % m[0];
  19.  
    }
  20.  
    return a[0];
  21.  
    }

                                                                                                          以上大部分内容来自wiki
下面做几道练手的题目:
poj2891,n个mi不互质的裸题
poj1006,三个互质的裸题
 


以上是关于29-中国剩余定理CRT的主要内容,如果未能解决你的问题,请参考以下文章

使用中国剩余定理CRT对RSA运算进行加速

中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结

CRT&EXCRT(中国剩余定理和扩展中国剩余定理)

中国剩余定理CRT(孙子定理)

CRT中国剩余定理简介

拓展中国剩余定理(ex_crt)