中国剩余定理【数论】

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

给出你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

具体代码参考如下:(应该很明了)

///n个mi互质
const LL maxn = 20;
LL a[maxn], m[maxn], n;
LL CRT(LL a[], LL m[], LL n)
{
    LL M = 1;
    for (int i = 0; i < n; i++) M *= m[i];
    LL ret = 0;
    for (int i = 0; i < n; i++)
    {
        LL x, y;
        LL tm = M / m[i];
        ex_gcd(tm, m[i], x, y);
        ret = (ret + tm * x * a[i]) % M;
    }
    return (ret + M) % M;
}

分割线

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

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

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

///n个mi不互质
const LL maxn = 1000;
LL a[maxn], m[maxn], n;
LL CRT(LL a[], LL m[], LL n) {
    if (n == 1) {
        if (m[0] > a[0]) return a[0];
        else return -1;
    }
    LL x, y, d;
    for (int i = 1; i < n; i++) {
        if (m[i] <= a[i]) return -1;
        d = ex_gcd(m[0], m[i], x, y);
        if ((a[i] - a[0]) % d != 0) return -1;   //不能整除则无解
        LL t = m[i] / d;
        x = ((a[i] - a[0]) / d * x % t + t) % t; //第0个与第i个模线性方程的特解
        a[0] = x * m[0] + a[0];
        m[0] = m[0] * m[i] / d;
        a[0] = (a[0] % m[0] + m[0]) % m[0];
    }
    return a[0];
}

以上大部分内容来自wiki

下面做几道练手的题目:

poj2891,n个mi不互质的裸题

代码

poj1006,三个互质的裸题

代码

中国剩余定理【数论】

时间: 2024-10-29 19:08:28

中国剩余定理【数论】的相关文章

Lucas定理 中国剩余定理 数论

逆元: 若 a*b=1(%p) 则a是b在%p意义下的逆元.  则在%p意义下  一个数 除以a就等价于乘b 两种求逆元方法:1.若p为质数时,则有性质则a^(p-1)=1(%p) .   即a*a^(p-2)=1(%p).   所以a的逆元就是a^(p-2)  2.exgcd(a,b,x,y) 可求 ax+by=c=gcd(a,b)  若a,b互质 则可求a%b下的逆元 Lucas定理:{ 求C(n,m)在%p下的值    (p是质数)    -- Lucas(n,m,p)=c(n%p,m%p

数论F - Strange Way to Express Integers(不互素的的中国剩余定理)

F - Strange Way to Express Integers Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u Submit Status Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express non-negative integers.

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

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5768 题目大意: T组数据,求L~R中满足:1.是7的倍数,2.对n个素数有 %pi!=ai  的数的个数. 题目思路: [中国剩余定理][容斥原理][快速乘法][数论] 因为都是素数所以两两互素,满足中国剩余定理的条件. 把7加到素数中,a=0,这样就变成解n+1个同余方程的通解(最小解).之后算L~R中有多少解. 但是由于中国剩余定理的条件是同时成立的,而题目是或的关系,所以要用容斥原理叠加删

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

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门, 所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) (PS:文中蓝色字体都可以点进去查看百度原文) 附赠数论入门训练专题:点我打开专题(题目顺序基本正常,用以配套数论入门) 一.同余定理 简单粗暴的说就是:若 a-b == m 那么 a%m == b%m 这个模运算性质一眼看出...直接上入门水题: Reduced ID Numbers 附AC代码(这个也没啥模板....知道就好) #inclu

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

之前看的数论的知识,现在做几道题目找找感觉..... poj 1061 传送门 题目大意,给你x,y,m,n,L.代表青蛙a的坐标x,青蛙b的坐标y,青蛙a一次跳的距离m,青蛙b一次跳的距离n,以及mod的值L,求经过多少次跳相遇.即求:(m-n)*x0=(x-y)(mod L);  模线性方程的解,不过要注意处理,因为(m-n)和(x-y)有可能是负的,如果(m-n)是负的,则直接对俩数取负数,下面就是对 ((x-y)+L)%L. 然后就能用modular_linear_equation(LL

POJ 1006 Biorhythms (数论-中国剩余定理)

Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 111285   Accepted: 34638 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,

poj1006生理周期(中国剩余定理)

1 /* 2 中国剩余定理可以描述为: 3 若某数x分别被d1..….dn除得的余数为r1.r2.….rn,则可表示为下式: 4 x=R1r1+R2r2+…+Rnrn+RD 5 其中R1是d2.d3.….dn的公倍数,而且被d1除,余数为1:(称为R1相对于d1的数论倒数) 6 R1 . 7 R2 . 8 … . 9 Rn是d1.d2.….dn-1的公倍数,而且被dn除,余数为1: 10 D是d1.d2.….的最小公倍数: 11 R是任意整数(代表倍数),可根据实际需要决定: 12 且d1..…

韩信点兵(中国剩余定理)

中国剩余定理是数论中的一个关于一元线性同余方程组的定理,说明了一元线性同余方程组有解的准则以及求解方法.又称为孙子定理,"韩信点兵""求一术""鬼谷算""隔墙算""剪管术""秦王暗点兵""物不知数"等名称. 例如:物不知数原文: 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 宋朝数学家秦九韶对"物不知数"问题作出了完整系统的解

HDU1370(中国剩余定理)

昨天我仔细一想,发现自己之前的分类(用OJ来划分,毫无意义啊!)太失败了,所以我重新划分了一下大分类,在分到数论的时候,我就想起了中国剩余定理了,于是乎今天就刷了一题中国剩余定理的题目了,话说太久没作数学题,导致我连样例都调了好多次(在算逆元时候老是算错-烦恼!),好在提交时候是1A. 题目的意思就是:人有三个周期,记为p,e,i,周期天数分别为23,28,33,现在给定你三个时间a,b,c,和一个天数d,a,b,c分别表示p,e,i出现的天数,问下一次出现的大于d的天数是今年的第几天,即输出天