【learning】中国剩余定理
问题描述
“今有物不知其数,三三数之余二,五五数之余三,七七数之余二。问物几何?”
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】中国剩余定理相关推荐
- CF338D GCD Table(拓展中国剩余定理,细节处理,2900分)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 CF338D GCD Table(拓展中国剩余定理,细节处理,2900分) Problem 有一张 n ...
- 初等数论--同余方程--同余方程组:中国剩余定理
初等数论--同余方程--同余方程组:中国剩余定理 博主是初学初等数论(整除+同余+原根),本意是想整理一些较难理解的定理.算法,加深记忆也方便日后查找:如果有错,欢迎指正. 我整理成一个系列:初等数论 ...
- 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法
打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...
- 信奥中的数学:孙子定理 中国剩余定理
孙子定理 中国剩余定理 孙子定理 中国剩余定理_Dreamer Thinker Doer-CSDN博客 中国剩余问题(简介+详解) 中国剩余问题(简介+详解)_dreamzuora的博客-CSDN博客 ...
- 数论 —— 线性同余方程组与中国剩余定理
[线性同余方程组] 由若干个线性同余方程构成的线性方程组. 例如: 其解法最早由我国<孙子算经>给出,因此解法称为"孙子定理",又叫"中国剩余定理" ...
- 通常情况下的中国剩余定理
这几天学了学中国剩余定理....本来计划是一天学互质版一天学非互质版的,结果非互质版就学了好长时间...不过好在会证明了,考场上大力推一波应该是没问题的吧... 中国剩余定理是求形如x≡a1(mod ...
- poj 1006 java_POJ 1006 Java:中国剩余定理
题目描述: 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏 ...
- 从孙子算经到中国剩余定理
中国剩余定理中间涉及一个重要观念:互质: 首先来看<孙子算经>卷下第二十六问:今有物,不知其数.三.三数之,剩二:五.五数之,剩三:七.七数之,剩二.问物几何? 转换为数学语言即是(理解其 ...
- 密码学基础算法(二)中国剩余定理
随便谷歌了一个图片做首图 原图地址: http://www.siwapu.com/etagid41968b0/ 密码学基础系列: (一) 基于整数的欧几里得算法和扩展欧几里得算法 (二) 中国剩余定理 ...
- 扩展欧几里得算法、乘法逆元与中国剩余定理
文章目录 前言 定义.定理和部分证明 整除 定义 定理 定理的证明 同余 定义 同余的性质 同余的运算律 运算律的证明 扩展欧几里得算法 代码模板 算法详解 乘法逆元 求解逆元 乘法逆元的作用 中国剩 ...
最新文章
- paddlepaddle安装
- 别再无聊地吹捧了,一起来动手实现MAE玩玩吧!
- 关于C语言的一些小知识点
- 20135337朱荟潼——实验三
- 智慧交通day01-算法库01:numba
- android 页面计时器,Android中页面添加计时器进行的刷新
- 使用 JAVA 中的动态代理实现数据库连接池
- js高级编号笔记[新]-访问文档对象
- centos7 安装node
- SQLite: 注意日期查询中的“前空格”问题将引发错误查询!
- jsoup html to text,Jsoup和htmlunit结合使用。
- 关于 Kubernetes中集群统一日志管理方案(Elasticsearch+Filebeat+Kibana+Metricbeat)搭建的一些笔记
- ae 的动画导出为html,Bodymovin v5.5.5 AE脚本可以导出json格式在Web动画制作工具
- ImageAI (四) 使用Python快速简单实现自定义预测模型的训练 Custom Model Training
- 小米电视4s android,小米电视系列ROOT教程(含4A,4S,4X等Android6.0.1版机型)
- ogre研究之第一个程序
- DWT文件怎么转换成html,dwg和dwt文件有什么区别?DWT又可以转换什么格式?-迅捷CAD转换器...
- Hive-cli(hive)与Beeline的区别
- 详解 input accept属性
- 偶数科技为辽宁农信数字化进程添加新动能
热门文章
- 【LeetCode】Remove Nth Node From End of List
- 递归;杨辉三角;正则表达式
- Python 全栈开发 -- 监控篇
- 直接在低版本IE6/7/8浏览器中使用HTML5的audio和video标签播放视频音频的办法
- HOJ 1157 SCUD Busters
- java分层窗格_java 简洁的分层实现
- ensp中小型企业网配置_如何构建1000人规模的网络,详细配置?
- (19)Xilinx PCIE中断理论(学无止境)
- linux系统oracle启动过程,Linux主机下配置Oracle 10G自动启动过程记
- ESP8266:(2)获取时间和天气