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

          中国剩余定理【数论】

2014年08月02日 12:55:59

阅读数:2351

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

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

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

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

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

三个模数m13, m25, m37的乘积是M105,对应的M135, M221, M315. 而可以计算出相应的数论倒数:t12, t21, t31. 所以《孙子歌诀》中的70,21和15其实是这个“物不知数”问题的基础解:

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

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

《孙子算经》中实际上给出了最小正整数解,也就是k-2时的解:x23.

附:数论倒数 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的更多相关文章

  1. 「中国剩余定理CRT」学习笔记

    设正整数$m_1, m_2, ... , m_r$两两互素,对于同余方程组 $x ≡ a_1 \ (mod \ m_1)$ $x ≡ a_2 \ (mod \ m_2)$ $...$ $x ≡ a_r ...

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

    中国剩余定理 给出以下的一元线性同余方程组: $\Large(s):\left\{\begin{aligned}x\equiv a_1\ (mod\ m_1)\\x\equiv a_2\ (mod\ ...

  3. 【bzoj3782】上学路线 dp+容斥原理+Lucas定理+中国剩余定理

    题目描述 小C所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M).小C家住在西南角,学校在东北角.现在有T个路口进行施工,小C不能通过这些路口.小C喜欢走最短的路径到达目的 ...

  4. acm数论之旅--中国剩余定理

    ACM数论之旅9---中国剩余定理(CRT)(壮哉我大中华╰(*°▽°*)╯)   中国剩余定理,又名孙子定理o(*≧▽≦)ツ 能求解什么问题呢? 问题: 一堆物品 3个3个分剩2个 5个5个分剩3个 ...

  5. 卢卡斯定理&&中国剩余定理

    卢卡斯定理(模数较小,且是质数) 式子C(m,n)=C(m/p,n/p)*C(m%p,n%p)%p 至于证明(我也不会QAQ,只要记住公式也该就好了). 同时卢卡斯定理一般用于组合数取模上 1.首先当 ...

  6. gcd,扩展欧几里得,中国剩余定理

    1.gcd: int gcd(int a,int b){ ?a:gcd(b,a%b); } 2.中国剩余定理: 题目:学生A依次给n个整数a[],学生B相应给n个正整数m[]且两两互素,老师提出问题: ...

  7. NOI 2018 屠龙勇士 (拓展中国剩余定理excrt+拓展欧几里得exgcd)

    题目大意:略 真是一波三折的一道国赛题,先学了中国剩余定理,勉强看懂了模板然后写的这道题 把取出的宝剑攻击力设为T,可得Ti*x=ai(mod pi),这显然是ax=c(mod b)的形式 这部分用e ...

  8. POJ 1006:Biorhythms 中国剩余定理

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 121194   Accepted: 38157 Des ...

  9. RSA遇上中国剩余定理

    1.Introduction 最近读论文刚好用到了这个,之前只是有耳闻,没有仔细研究过,这里就好好捋一下,会逐步完善 不过貌似CRT(中国剩余定理)的实现更容易被攻击 2. RSA: Overview ...

  10. 《孙子算经》之"物不知数"题:中国剩余定理

    1.<孙子算经>之"物不知数"题 今有物不知其数,三三数之剩二,五五数之剩七,七七数之剩二,问物几何? 2.中国剩余定理 定义: 设 a,b,m 都是整数.  如果 m ...

随机推荐

  1. 如何将angular-ui-bootstrap的图片轮播组件封装成一个指令

    在项目开发中我们经常会遇到图片轮播的功能点: 如果我们开发人员自己原生手写,将会花费很多的时间,最终得不偿失. 接下来就详细说说如何使用angular-ui发热图片轮播模块,并且将它写成一个指令(便于 ...

  2. NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构

    本文摘自<用Python做科学计算>,版权归原作者所有. 上一篇讲到:NumPy-快速处理数据--ndarray对象--数组的创建和存取 接下来接着介绍多维数组的存取.结构体数组存取.内存 ...

  3. erlang异常处理备忘

    捕获所有异常得用_:_,看例子 try aa:bb() of Value -> Value catch _:_ -> "" end 如果单表达式不需要有返回值,直接异常 ...

  4. STL容器的resize方法

    刚才写DFS程序,为了加个创建DFS树然后再次遍历的功能,把初始化的代码给封装到init()函数里,然后直接调用之后对同样是邻接表表示的DFS树进行DFS. 然后令人诧异的是竟然没有打印结果,调试发现 ...

  5. spring面试资料

    *  Spring的优点有什么?   1.  Spring是分层的架构,你可以选择使用你需要的层而不用管不需要的部分   2.  Spring是POJO编程,POJO编程使得可持续构建和可测试能力提高 ...

  6. java web 程序--注册页面/HashMap的用法。。要懂啊

    思路:1.一个form表单,用户输入后,提交 2.第二个是注册页面,主要是用Map.先假设往map里面拿东西,然后判断是否为空  若为空,new 一个HashMap它的子类,然后通过map.conta ...

  7. MapReduce项目中的一个JVM错误问题分析和解决

    最近一周都在查项目的各种问题,由于对原有的一个MapReduce分析数据的项目进行重构,减少了运行时的使用资源,但是重构完成后,在Reduce端总是不定时地抛出JVM的相关错误,非常随机,没有发现有什 ...

  8. hadoop集群调优-hadoop settings and MapReduce

    Hadoop Settings 由于Hadoop节点的系统配置,一些hadoop的设置可以减少运行系统中的瓶颈.首先,提高Java运行时的堆内存容量,也要和系统中的整体内存容量相关:其次,保持hado ...

  9. node中express的中间件之basicAuth

    basicAuth中间件为网站添加身份认证功能.在使用了该中间件后, 用户访问网站时必须输入用户名与密码,在用户输入了用户名与密码并通过验证之后才能访问网站. 当用户输入的用户名和密码符合条件,中间件 ...

  10. ERROR无法从静态上下文中引用非静态变量

    ERROR无法从静态上下文中引用非静态变量 2012-06-16 20:58:52 分类: Java 什么是“static”? 学习过java.C++或C的人都应该认识这个关键字.用这个关键字修饰的变 ...