问题描述

  “今有物不知其数,三三数之余二,五五数之余三,七七数之余二。问物几何?”

  emmm这是。。最开始这个问题被提出来的描述

  其实说白了就是求解一次同余式组

  然后还可以。。解决一些。。需要将模数转化成素数来求解的题目

  

具体内容

  我们还是把这个东西写成数学语言吧,一般化一点的长这样:
\[ \begin{cases} x\equiv a_1(mod\ m_1)\\ x\equiv a_2(mod\ m_2)\\ x\equiv a_3(mod\ m_3)\\ ...\\ x\equiv a_n(mod\ m_n)\\ \end{cases} \]
  其中模数\(m_i\)两两互素,记\(N=\prod\limits_{i=1}^{n}m_i\),中国剩余定理说的是:这个同余方程组在模\(N\)意义下有唯一解,并且给出了一种具体的构造方案(也就是下面的证明)

​  

  证明:我们首先来考虑一个更加特殊一点的同余方程组
\[ \begin{cases} x\equiv 1(mod\ m_1)\\ x\equiv 0(mod\ m_2)\\ x\equiv 0(mod\ m_3)\\ ...\\ x\equiv 0(mod\ m_n)\\ \end{cases} \]
  我们可以大胆令\(x=(N/m_1)*y\),然后就会发现这个方程组就等价于求解同余方程:
\[ (N/m_1)*y \equiv1(mod\ m_1) \]
  然后对于我们改变一下左边等于\(1\)的等式是哪一条,如果是第\(i\)条的话那么就相当于求解:
\[ (N/m_i)*y_i \equiv1(mod\ m_i) \]
  那么我们令\(x_i=(N/m_i)*y_i\),就可以构造出原来的方程组(余数为\(a_i\)的那个方程组)在模\(N\)意义下的唯一解:
\[ x=\sum_{i=1}^n a_ix_i \]
  

具体实现

  那么现在我们只要求出\(y_i\)就好了,观察这个式子:
\[ (N/m_i)*y_i \equiv1(mod\ m_i) \]
​  会发现这个\(y_i\)我们可以用扩展欧几里得求出

  因为可以看成\(y_i(N/m_1)+q\cdot m_1=1\),而因为\(m_i\)是两两互素的所以\(1=gcd(N/m_1,m_1)\)

  那么直接就上扩欧就好啦

  

  代码大概长这个样子

ll ex_gcd(ll a,ll b,ll &x,ll &y){if (b==0){x=1; y=0; return a;}ll gcd=ex_gcd(b,a%b,x,y),tmp=x;x=y; y=tmp-a/b*y;return gcd;
}ll CRT(int *w,int *a,int n){//w数组里面存的是模数,a里面存的是余数ll x,y,ret=0,mod=1,tmp;//这里的mod就是相当于上面讲的N啦for (int i=1;i<=n;++i) mod*=w[i];for (int i=1;i<=n;++i){tmp=mod/w[i];ex_gcd(w[i],tmp,x,y);ret=(ret+y*tmp*a[i])%mod;}return (ret+mod)%mod;
}

  

具体应用

  应用的话。。其实就是像上面提到的那样,解决一些要拆模数的问题

  比如说 -->这题(bzoj3782)

  简单说一下就是,这题需要用到Lucas定理,但是这个定理有一个限制条件就是模数必须是质数,那么解决方法就是将模数分解质因数一下,然后分别用Lucas定理求出在几个质因数下的答案,最后用CRT(中国剩余定理)合并一下得到在模那个非质数的模数下的答案就好了

​  目前了解到的就主要是这样的类型的qwq

  在FFT中也有应用,但是还没有去写。。所以先留着坑吧qwq

  

不互质呢?

​  其实中国剩余定理的条件还是有点苛刻的,模数之间要两两互质

​  如果说不能满足这一点呢?

​​​  其实也是可以做的,虽然说叫是叫扩展CRT但是其实这个感觉跟CRT的思想不太一样嗯qwq

​​​  与前面的构造法不同的是,这里我们可以借助扩欧采用一个两两合并的思想

​  假设我们现在要合并两个方程:
\[ \begin{cases} x\equiv a_1(mod\ m_1)\\ x\equiv a_2(mod\ m_2) \end{cases} \]
​  但是其中\(,m_1,m_2\)是不互质的

​​​  我们可以将上面那个方程组写成
\[ \begin{cases} x=a_1+x_1\cdot m_1&(1)\\ x=a_2+x_2\cdot m_2&(2) \end{cases} \]
​  那么:
\[ \begin{aligned} x_1\cdot m_1-x_2\cdot m_2&=a_2-a_1\\ m_1\cdot x_1&\equiv a_2-a_1(mod\ m_2) \end{aligned} \]
​  然后我们考虑用逆元将系数\(m_1\)消掉,但是因为无法保证\(m_1m_2\)互质,所以我们可以先变一下,记\(d=gcd(m_1,m_2)\),则:
\[ \begin{aligned} \frac{m_1}{d}x_1&\equiv \frac{a_2-a_1}{d}(mod\ \frac{m_2}{d})\\ x_1&\equiv inv(\frac{m_1}{d})\frac{a_2-a_1}{d}(mod\ \frac{m_2}{d})\\ \Updownarrow\\ x_1&=a_1+m_1\cdot inv(\frac{m_1}{d})\cdot \frac{a_2-a_1}{d}+\frac{m_2}{d}\cdot y\\ \end{aligned} \]
​  注意,由扩欧可以知道,只有在满足\(d|(a_2-a_1)\)的情况下有解​

​  然后这个时候我们再将这条\(x_1\)的表达式带回\((1)\)式中,得到:
\[ \begin{aligned} x&=a_1+m_1\cdot inv(\frac{m_1}{d})\cdot \frac{a_2-a_1}{d}+\frac{m_1m_2}{d}\cdot y\\ \Updownarrow\\ x&\equiv (a_1+m_1\cdot inv(\frac{m_1}{d})\cdot \frac{a_2-a_1}{d})\%\frac{m_1m_2}{d}(mod\ \frac{m_1m_2}{d}) \end{aligned} \]
​  也就是说,最后我们合并得到的新的式子\(x\equiv a'(mod\ m')\)中:
\[ \begin{aligned} a'&=(a_1+m_1\cdot inv(\frac{m_1}{d})\cdot \frac{a_2-a_1}{d})\%\frac{m_1m_2}{d}\\ m'&=\frac{m_1m_2}{d} \end{aligned} \]
​  然后多个同余方程的话我们就两个两个一路合并下去就好了

​  

​​  代码大概长这个样子

ll mul(ll x,ll y,ll mod){//这里mul是为了防止模数特别大的情况下爆出去而用的黑科技ll tmp=x*y-(ll)((ld)x/mod*y)*mod;return (tmp+mod)%mod;
}
ll ex_gcd(ll a1,ll b1,ll &x,ll &y){if (!b1){x=1; y=0; return a1;}ll gcd=ex_gcd(b1,a1%b1,x,y),tmp=x;x=y; y=tmp-a1/b1*y;return gcd;
}
ll inv(ll a1,ll mod){ll x,y;ll gcd=ex_gcd(a1,mod,x,y);if (gcd!=1) return -1;return (x%mod+mod)%mod;
}
ll ex_CRT(ll *a,ll *mod,int n){ll Mod=mod[1],A=a[1],d,tmp,t,x,y,tmpMod;for (int i=2;i<=n;++i){d=ex_gcd(Mod,mod[i],x,y);tmp=a[i]-A;if (tmp%d) return -1;//不能整除就无解tmpMod=Mod/d*mod[i];A=(A+mul(mul(Mod,inv(Mod/d,mod[i]/d),tmpMod),tmp/d,tmpMod))%tmpMod;Mod=tmpMod;}return (A%Mod+Mod)%Mod;
}

转载于:https://www.cnblogs.com/yoyoball/p/9236084.html

【learning】中国剩余定理相关推荐

  1. CF338D GCD Table(拓展中国剩余定理,细节处理,2900分)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 CF338D GCD Table(拓展中国剩余定理,细节处理,2900分) Problem 有一张 n ...

  2. 初等数论--同余方程--同余方程组:中国剩余定理

    初等数论--同余方程--同余方程组:中国剩余定理 博主是初学初等数论(整除+同余+原根),本意是想整理一些较难理解的定理.算法,加深记忆也方便日后查找:如果有错,欢迎指正. 我整理成一个系列:初等数论 ...

  3. 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

    打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...

  4. 信奥中的数学:孙子定理 中国剩余定理

    孙子定理 中国剩余定理 孙子定理 中国剩余定理_Dreamer Thinker Doer-CSDN博客 中国剩余问题(简介+详解) 中国剩余问题(简介+详解)_dreamzuora的博客-CSDN博客 ...

  5. 数论 —— 线性同余方程组与中国剩余定理

    [线性同余方程组] 由若干个线性同余方程构成的线性方程组. 例如: 其解法最早由我国<孙子算经>给出,因此解法称为"孙子定理",又叫"中国剩余定理" ...

  6. 通常情况下的中国剩余定理

    这几天学了学中国剩余定理....本来计划是一天学互质版一天学非互质版的,结果非互质版就学了好长时间...不过好在会证明了,考场上大力推一波应该是没问题的吧... 中国剩余定理是求形如x≡a1(mod ...

  7. poj 1006 java_POJ 1006 Java:中国剩余定理

    题目描述: 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏 ...

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

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

  9. 密码学基础算法(二)中国剩余定理

    随便谷歌了一个图片做首图 原图地址: http://www.siwapu.com/etagid41968b0/ 密码学基础系列: (一) 基于整数的欧几里得算法和扩展欧几里得算法 (二) 中国剩余定理 ...

  10. 扩展欧几里得算法、乘法逆元与中国剩余定理

    文章目录 前言 定义.定理和部分证明 整除 定义 定理 定理的证明 同余 定义 同余的性质 同余的运算律 运算律的证明 扩展欧几里得算法 代码模板 算法详解 乘法逆元 求解逆元 乘法逆元的作用 中国剩 ...

最新文章

  1. paddlepaddle安装
  2. 别再无聊地吹捧了,一起来动手实现MAE玩玩吧!
  3. 关于C语言的一些小知识点
  4. 20135337朱荟潼——实验三
  5. 智慧交通day01-算法库01:numba
  6. android 页面计时器,Android中页面添加计时器进行的刷新
  7. 使用 JAVA 中的动态代理实现数据库连接池
  8. js高级编号笔记[新]-访问文档对象
  9. centos7 安装node
  10. SQLite: 注意日期查询中的“前空格”问题将引发错误查询!
  11. jsoup html to text,Jsoup和htmlunit结合使用。
  12. 关于 Kubernetes中集群统一日志管理方案(Elasticsearch+Filebeat+Kibana+Metricbeat)搭建的一些笔记
  13. ae 的动画导出为html,Bodymovin v5.5.5 AE脚本可以导出json格式在Web动画制作工具
  14. ImageAI (四) 使用Python快速简单实现自定义预测模型的训练 Custom Model Training
  15. 小米电视4s android,小米电视系列ROOT教程(含4A,4S,4X等Android6.0.1版机型)
  16. ogre研究之第一个程序
  17. DWT文件怎么转换成html,dwg和dwt文件有什么区别?DWT又可以转换什么格式?-迅捷CAD转换器...
  18. Hive-cli(hive)与Beeline的区别
  19. 详解 input accept属性
  20. 偶数科技为辽宁农信数字化进程添加新动能

热门文章

  1. 【LeetCode】Remove Nth Node From End of List
  2. 递归;杨辉三角;正则表达式
  3. Python 全栈开发 -- 监控篇
  4. 直接在低版本IE6/7/8浏览器中使用HTML5的audio和video标签播放视频音频的办法
  5. HOJ 1157 SCUD Busters
  6. java分层窗格_java 简洁的分层实现
  7. ensp中小型企业网配置_如何构建1000人规模的网络,详细配置?
  8. (19)Xilinx PCIE中断理论(学无止境)
  9. linux系统oracle启动过程,Linux主机下配置Oracle 10G自动启动过程记
  10. ESP8266:(2)获取时间和天气