29-中国剩余定理CRT

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,三个互质的裸题

代码

原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/9495496.html

时间: 2024-10-30 10:41:12

29-中国剩余定理CRT的相关文章

洛谷 P1516 青蛙的约会(中国剩余定理CRT)

题目描述 两青蛙会相遇的条件[(x-y)+k(m-n)]%l=0 令a=m-n,b=l,c=x-y,所以(c+k*a)%b=0 -> aX+bY=c 方程有解,当且仅当c%Gcd(a,b)=0 令r=Gcd(a,b) 为什么(X*(c/r)%(b/r)+b/r)%(b/r)为最小解? 目标解aX+bY==c 有解的条件是c%r=0,也就是c=K*r 那么就办成了aX+bY=K*r 那么也就是解a*(X/K)+b(Y/K)=r 然后扩展欧几里得定理就是解a*X+b*Y=r 那么解出来X之后X就要乘

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

题目描述 小C所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M).小C家住在西南角,学校在东北角.现在有T个路口进行施工,小C不能通过这些路口.小C喜欢走最短的路径到达目的地,因此他每天上学时都只会向东或北行走:而小C又喜欢走不同的路径,因此他问你按照他走最短路径的规则,他可以选择的不同的上学路线有多少条.由于答案可能很大,所以小C只需要让你求出路径数mod P的值. 输入 第一行,四个整数N.M.T.P. 接下来的T行,每行两个整数,表示施工的路口的坐标. 输出 一

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

1.gcd: int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } 2.中国剩余定理: 题目:学生A依次给n个整数a[],学生B相应给n个正整数m[]且两两互素,老师提出问题:有一正整数ans,对于每一对数,都有:(ans-a[i])mod m[i]=0.求此数最小为多少. 输入样例: 1 10 2 3 1 2 3 2 3 5 8 1 2 3 4 5 6 7 8 97 89 67 61 59 53 47 88 12 1 2 3 4 5 6 7 8 9

POJ 1006 中国剩余定理

[题意]: 给定p,e,i,d,求解 (x + d) % 23 = p (x + d) % 28 = e(x + d) % 33 = i x最小正整数值 [知识点]: 中国剩余定理 [题解]: 典型的 xmodmi = ai模型,其中mi间两两互素.但该题式子较少,也可以直接自己化简带入值. [代码]: 1 #include <map> 2 #include <set> 3 #include <cmath> 4 #include <ctime> 5 #inc

同余、中国剩余定理

同余:a≡b (mod m),表示a % m==b % m 同余式的运算法则: -------------------------------------------------------------------------------------------------------------- 中国剩余定理出自<孙子算经>中的一个问题: 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何?这道题实际上就是解这么一个同余方程组:x≡2 (mod 3)x≡3 (mod 5)x≡

&quot;孙子算经&quot;之&quot;物不知数&quot;题:中国剩余定理

1 #include<stdio.h> 2 3 // 4 // 作者:吴仟灵 5 // 时间:2016.04.21 6 // 7 // "孙子算经"之"物不知数"题: 8 // 今有物不知其数,三三数之剩二,五五数之剩七,七七数之剩二,问物几何? 9 // 10 // 根据题意我们有如下同于方程组: 11 // x=2%3 ---> x=3*k+2 12 // x=3%5 13 // x=2%7 14 // 15 16 17 // 分析法求解 18

POJ 1006:Biorhythms 中国剩余定理

Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 121194   Accepted: 38157 Description Some people believe that there are three cycles in a person's life that start the day he or she is born. These three cycles are the physical,

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

中国剩余定理,又名孙子定理o(*≧▽≦)ツ 能求解什么问题呢? 问题: 一堆物品 3个3个分剩2个 5个5个分剩3个 7个7个分剩2个 问这个物品有多少个 解这题,我们需要构造一个答案 我们需要构造这个答案 5*7*inv(5*7,  3) % 3  =  1 3*7*inv(3*7,  5) % 5  =  1 3*5*inv(3*5,  7) % 7  =  1 这3个式子对不对,别告诉我逆元你忘了(*′?`*),忘了的人请翻阅前几章复习 然后两边同乘你需要的数 2 * 5*7*inv(5*

【信息安全数学基础】中国剩余定理

算法原理: 设正整数 ????,????,?,???? 两两互素,对任意整数 ????,????,?,????,一次同余方程组 ?? ≡ ???? (?????? ????) ?? ≡ ???? (?????? ????) ? ?? ≡ ???? (?????? ????) 在模??意义下有唯一解,该解可表示为 ?? ≡ ????(????^-1)???? +????(????^−??)???? +?+????(????^−??)????( ?????? ??) 其中?? = ????????

数论E - Biorhythms(中国剩余定理,一水)

E - Biorhythms Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Description Some people believe that there are three cycles in a person's life that start the day he or she is born. These three cycles are the