中国剩余定理与线性同余方程组求解

  • 线性同余方程组的形式
  • 中国剩余定理

线性同余方程组的形式

实际上一元一次线性同余方程组,形式如下:
{ x ≡ r 0 ( m o d m 0 ) x ≡ r 1 ( m o d m 1 ) ⋯ \begin{cases} x\equiv{r_0}({\rm{mod}}\,m_0) \\ x\equiv{r_1}({\rm{mod}}\,m_1) \\ \cdots \end{cases} ⎩⎪⎨⎪⎧​x≡r0​(modm0​)x≡r1​(modm1​)⋯​
包含有具体数字的线性同余方程组问题最早见于《孙子算经》(成书于约南北朝时期,因此与《孙子兵法》的孙子应该不是同一个孙子),该书也给出了该具体问题的解法。因此求解线性同余方程组有关的定理又称作孙子定理。但实际上《孙子算经》并未给出证明及一般性解法。最早的系统性论述应该是南宋时期秦九韶在《算术九章》中提出的“大衍求一术”。因此最后有关该问题的理论被称作中国剩余定理。

中国剩余定理

如果 m 0 , m 1 , ⋯ m_0,m_1,\cdots m0​,m1​,⋯两两互质,则方程有唯一解,在模 ∏ i m i \prod_{i}{m_i} ∏i​mi​的意义下。解法如下:
令 M = ∏ i m i M=\prod_{i}{m_i} M=∏i​mi​,且 M i = M / m i M_i=M/m_i Mi​=M/mi​
对每一个 M i M_i Mi​求出在模 m i m_i mi​意义下的逆元,记作 x i x_i xi​
即满足 M i ⋅ x i ≡ 1 ( m o d m i ) M_i\cdot{x_i}\equiv1({\rm{mod}}\,m_i) Mi​⋅xi​≡1(modmi​)
则原方程组的解为 x = ∏ i r i ⋅ x i ⋅ M i m o d M x=\prod_{i}{r_i\cdot{x_i}\cdot{M_i}}\,\rm{mod}\,M x=∏i​ri​⋅xi​⋅Mi​modM

#线性同余方程组的一般解法
使用中国剩余定理理论上可以很方便的解出模数两两互质的方程组。对于不互质的情况可以使用下面的一般解法。
##单独的线性同余方程求解
考虑单独的一个线性同余方程,已知 a , b , m a,b,m a,b,m,求 x x x满足如下方程:
a x ≡ b ( m o d m ) ax\equiv{b}({\rm{mod}}\,m) ax≡b(modm)
原方程等价于:
a x + m y = b ax+my=b ax+my=b
根据裴蜀定理,上述方程有解的充要条件是 b b b是 g c d ( a , m ) gcd(a,m) gcd(a,m)的整数倍。利用扩展的扩展的欧几里德算法可以很容易求得 x 0 x_0 x0​使得:
a x 0 + m y 0 = g c d ( a , m ) ax_0+my_0=gcd(a,m) ax0​+my0​=gcd(a,m)
于是很容易得到 x x x的一个特解为:
x = x 0 ⋅ b g c d x=x_0\cdot\frac{b}{gcd} x=x0​⋅gcdb​
显然 x x x有无穷多解,如果考虑在模 m m m的意义下, x x x也有 g c d gcd gcd个不同的解,且成等差数列,公差为 m / g c d m/gcd m/gcd。因此很容易求得最小正整数解为:
x = x 0 ⋅ b g c d m o d m g c d x=x_0\cdot\frac{b}{gcd}\,\rm{mod}\,\frac{m}{gcd} x=x0​⋅gcdb​modgcdm​
考虑方程
9 x ≡ 6 ( m o d 12 ) 9x\equiv6({\rm{mod}}\,12) 9x≡6(mod12)
根据扩展的欧几里德算法有:
9 x 0 + 12 y 0 = 3 9x_0+12y_0=3 9x0​+12y0​=3
得到 x 0 x_0 x0​的一个解为11,所以 x x x的一个解为22,对4取模即可得到最小正整数解2,且在模12的意义下有3个解,分别是2、6、10。
##两个线性同余方程合并
考虑2个线性同余方程构成的方程组:
{ x ≡ r 0 ( m o d m 0 ) x ≡ r 1 ( m o d m 1 ) \begin{cases} x\equiv{r_0}({\rm{mod}}\,m_0) \\ x\equiv{r_1}({\rm{mod}}\,m_1) \end{cases} {x≡r0​(modm0​)x≡r1​(modm1​)​
分别等价于
{ x = r 0 + m 0 z 0 x = r 1 + m 1 z 1 \begin{cases} x=r_0+m_0z_0\\ x=r_1+m_1z_1 \end{cases} {x=r0​+m0​z0​x=r1​+m1​z1​​
因此有
m 0 z 0 = m 1 z 1 + r 1 − r 0 m_0z_0=m_1z_1+r_1-r_0 m0​z0​=m1​z1​+r1​−r0​
两边对 m 2 m_2 m2​取余数即可得到一个单独的关于 z 0 z_0 z0​线性同余方程
m 0 z 0 ≡ r 1 − r 0 ( m o d m 1 ) m_0z_0\equiv{r_1-r_0({\rm{mod}}\,m_1)} m0​z0​≡r1​−r0​(modm1​)
根据之前的结论,很容易判断是否有解并可以解出 z 0 z_0 z0​。如果可解,可以得到一个方程:
x ≡ m 0 z 0 + r 0 ( m o d l c m ( m 0 , m 1 ) ) x\equiv{m_0z_0+r_0({\rm{mod}}\,lcm(m_0,m_1))} x≡m0​z0​+r0​(modlcm(m0​,m1​))
该方程与原方程组等价。其中 l c m lcm lcm为最小公倍数。
如此反复,就可以将线性同余方程组合并为一个方程,并且利用扩展的欧几里德算法求解。在每一步中,均需判断是否有解。

typedef long long int llt;
//to convert two congruence equations to equivalent one
//x = r1 (mod m1)
//x = r2 (mod m2)
//the out put is:  x = r3 (mod m3)
//return true if there is a solution, otherwise false
bool mergeCrt(llt r1,llt m1,llt r2,llt m2,llt&r3,llt&m3){llt x,y;llt g = exEuclid(m1,m2,x,y);llt r = (r2 - r1) % m2;if ( r < 0 ) r += m2;if ( r % g ) return false;//no solutionx = r / g * x % ( m2 / g );//the least positive solutionm3 = m1 / g * m2; //lcmr3 = ( ( x * m1 ) % m3 + r1 ) % m3;return true;
}//Chinese remainder theorem to solve linear congruence equations
//n is the count of equations
//remainder is the array of remainders, index from 0
//mod is the array of modules, index from 0
//return the least positive solution or -1 if there is no solution
llt Crt(int n,llt const remainder[],llt const mod[]){llt r1 = remainder[0],m1 = mod[0];for(int i=1;i<n;++i){if ( !mergeCrt(r1,m1,remainder[i],mod[i],r1,m1) ){return -1;}}r1 %= m1;if ( r1 < 0 ) r1 += m1;return r1;
}

完整的程序可以见POJ2891

中国剩余定理与线性同余方程组求解相关推荐

  1. 模线性同余方程组求解

    问题:模线性同余方程组: x = a1 ( mod n1 ) x = a2 ( mod n2 ) .... x = ak ( mod nk ) 给定 A ( a1, a2 , ... , ak ) , ...

  2. 第二十九章 数论——中国剩余定理与线性同余方程组

    第二十九章 数论--中国剩余定理与线性同余方程组 一.中国剩余定理 1.作用: 2.内容: 3.证明: (1)逆元的存在性 (2)验证定理的正确性 4.代码实现: (1)步骤: (2)问题: (3)代 ...

  3. 【数论】同余(四):一元线性同余方程组(两两相消、中国剩余定理)

    同余问题共7part,我的博客链接: 基本概念与性质 逆元:概念.求解方法与推导 线性同余方程 一元线性同余方程 一元线性同余方程组 多元线性同余方程 高次同余方程:BSGS算法(大小步算法.拔山盖世 ...

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

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

  5. 线性同余方程组-中国剩余定理or合并方程

    线性同余方程组 完整代码见https://github.com/YIWANFENG/Algorithm-github 即若干个线性同余方程的组合. 求解方式可以参考我们普通的方程组,先解式1,将式1的 ...

  6. POJ2891——Strange Way to Express Integers(一元线性同余方程组)

    由若干个一元线性同余方程组构成的方程组,叫做一元线同余方程组. 求解 我们可以将其统一划成a*x ≡ b(mod m)的形式,这样有利于算法的实现. 对于同于方程组的求解,其实质过程就是对于其中的同余 ...

  7. Codeforces 338D 对线性同余方程组的一点理解

    题意有个大小n*m(两个数都不大于10的12次幂)的表格,table[i][j]的值为gcd(i, j).给出k(<=10000)个数 判断这个序列是否在表格中的某一列出现过 考虑解满足的条件 ...

  8. 解一元线性同余方程组(详解+例题)

    问题描述:给出bi,ni的值,且n1, n2, n3,-, ni两两之间不一定互质,求Res的值? 解:采用的是合并方程的做法. 这里将以合并第一第二个方程为例进行说明 由上图前2个方程得(设k1.k ...

  9. 线性同余方程和中国剩余定理学习笔记

    线性同余方程介绍 形如 a x ≡ c ( m o d b ) ax \equiv c \pmod b ax≡c(modb) 的方程被称为 线性同余方程(Congruence Equation). 求 ...

最新文章

  1. vCenter 5.5升级到vCenter 6.0实战指导
  2. 集成信息医院需要什么样的集成平台
  3. java响应事件_Swing中添加事件响应的三种处理方式说明
  4. xadmin获取mysql_Django+Xadmin构建项目的方法步骤
  5. python命令行参数作用_python中命令行参数和os模块常用函数
  6. Android实现录屏直播(一)ScreenRecorder的简单分析
  7. 移动游戏运营必备的数据分析指标
  8. f15_Trading Strategies2_sma_AAPL_Log return_EUR_OLS regress_df highlight_Lagrang_GaussianNB_DNNClass
  9. 无人机飞控 ardupilot Copter-4.0.7 库示例
  10. QsciScintilla等编辑器实现不同区域鼠标右键处理方式不同的方法
  11. 2023最新苹果APP上架App Store流程(超详细)
  12. 华为方舟编译器开源官网正式上线:源代码已开放下载;中兴通讯与北京交通大学、中国移动北京公司签署 “5G战略合作框架协议”……...
  13. 初中计算机考试的题型,教师资格证考试中学信息技术科目题型及分值分布,快看!...
  14. 注意GetMessage()的返回值
  15. 关于一个ISE错误XST:899的错误判断的讨论
  16. 清华源和torch源
  17. InfluxDB CQ时间偏移
  18. Camstar开发常用数据库表及其关联
  19. 基于java的科研项目管理系统
  20. 江苏大学毕业设计TEX排版(二)

热门文章

  1. 微信小程序-收货地址 省市区联动 组件
  2. 国际单位(SI)倍数与分数词头
  3. c语言数字基带实验报告,数字基带传输实验实验报告.doc
  4. 发那科7轴导轨+SCA涂胶与发那科7轴导轨+固定点焊钳现场全备份,可导入Roboguide还原系统
  5. java提示版本过低怎么处理_eclipse提示jdk版本过低怎么办 eclipse提示jdk版本过低解决方法...
  6. 马蜂窝支付中心架构演进
  7. 日期:在原有的时间上加一秒/分钟等
  8. cvte面试经验Java_CVTE Java Web后台开发 一\二面面经
  9. 基于nginx-rtmp-module模块实现的HTTP-FLV直播模块nginx-http-flv-module(二)
  10. 文本匹配相关方向打卡点总结