中国剩余定理

孙子定理Chinese remainder theorem(CRT)

参考 : 百度百科-中国剩余定理

有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

x=2mod3
x=3mod5
x=2mod7
// 求解得: x = 23

模算术和数论有相关算法可以解决这个问题,参考资料:《密码学原理与实践第三版》5.2章节 更多数论知识

1. Euclidean欧几里得算法

Euclidean算法的基本形式,可以给出两个正整数a、b的最大公因子Greatest Common Divisor(GCD)

举例计算 : g c d ( 99 , 63 ) gcd(99,63) gcd(99,63)
99 = 1 ⋅ 63 + 36 99 = 1 · 63 + 36 99=1⋅63+36
63 = 1 ⋅ 36 + 27 63 = 1 · 36 + 27 63=1⋅36+27
36 = 1 ⋅ 27 + 9 36 = 1 · 27 + 9 36=1⋅27+9
27 = 3 ⋅ 9 + 0 27 = 3 · 9 + 0 27=3⋅9+0
g c d ( 99 , 63 ) = ( 63 , 36 ) = ( 36 , 27 ) = ( 27 , 9 ) = 9 gcd(99, 63) = (63, 36) = (36, 27) = (27, 9) = 9 gcd(99,63)=(63,36)=(36,27)=(27,9)=9

2. 扩展欧几里得算法,求模乘逆: b − 1 ( m o d a ) b^{-1}\pmod a b−1(moda)

  1. 是否存在整数s,t,使得 s a + t b = ( a , b ) sa+tb=(a,b) sa+tb=(a,b)?
    如果存在, 且 ( a , b ) = 1 (a,b)=1 (a,b)=1,则有 s a + t b = 1 sa+tb=1 sa+tb=1
    两边模a之后,得到 t b ≡ 1 ( m o d a ) tb\equiv 1\pmod a tb≡1(moda),即
    t = b − 1 ( m o d a ) t=b^{-1}\pmod a t=b−1(moda)

  2. 书上例5.1计算 2 8 − 1 ( m o d 75 ) 28^{-1}\pmod{75} 28−1(mod75),如何计算s、t?
    定义 t j = { 0 , if  j = 0 ; 1 , if  j = 1 ; t j − 2 − q i − 1 t j − 1 , if  j ≥ 2 ; t_j = \begin{cases} 0, &\text{if } j=0; \\ 1, &\text{if } j=1; \\ t_{j-2}-q_{i-1}t_{j-1}, &\text{if } j\ge 2; \end{cases} tj​=⎩⎪⎨⎪⎧​0,1,tj−2​−qi−1​tj−1​,​if j=0;if j=1;if j≥2;​

    定义 s j = { 1 , if  j = 0 ; 0 , if  j = 1 ; s j − 2 − q i − 1 s j − 1 , if  j ≥ 2 ; s_j = \begin{cases} 1, &\text{if } j=0; \\ 0, &\text{if } j=1; \\ s_{j-2}-q_{i-1}s_{j-1}, &\text{if } j\ge 2; \end{cases} sj​=⎩⎪⎨⎪⎧​1,0,sj−2​−qi−1​sj−1​,​if j=0;if j=1;if j≥2;​

  3. 书上模乘逆算法

  4. Js版本模乘逆算法

题目:利用求逆算法,计算 104729 8 − 1 ( m o d 15484863 ) = 6926637 1047298^{-1}\pmod{15484863} = 6926637 1047298−1(mod15484863)=6926637

function MultiplicativeInverse(a, b) {let a0 = alet b0 = blet t0 = 0let t = 1let q = Math.floor(a0 / b0)let r = a0 - q * b0let j = 0// console.log("j", "rj", "qj", "tj")// console.log(j, a0, "-", t0)let qtemp = qwhile (r > 0) {const temp = (t0 - q * t) % at0 = tt = tempa0 = b0b0 = rq = Math.floor(a0 / b0)r = a0 - q * b0j++console.log(j, a0, qtemp, t0)qtemp = q}if (b0 !== 1) {return false} else {console.log(j + 1, b0, a0, t)return t}
}
  1. 测试结果
console.log(MultiplicativeInverse(75, 28))
j rj qj tj
0 75 - 0
1 28 2 1
2 19 1 -2
3 9 2 3
4 1 9 -8
-8
console.log(MultiplicativeInverse(15485863, 104729))
j rj qj tj
0 15485863 - 0
1 104729 147 1
2 90700 1 -147
3 14029 6 148
4 6526 2 -1035
5 977 6 2218
6 664 1 -14343
7 313 2 16561
8 38 8 -47465
9 9 4 396281
10 2 4 -1632589
11 1 2 6926637
6926637

3. 求解同余方程组

中国剩余定理,是求解以下的一元线性同余方程组的过程:

x ≡ a 1 ( m o d m 1 ) x\equiv a_1\pmod {m_1} x≡a1​(modm1​)
x ≡ a 2 ( m o d m 2 ) x\equiv a_2\pmod {m_2} x≡a2​(modm2​)
⋮ \vdots ⋮
x ≡ a 1 ( m o d m 1 ) x\equiv a_1\pmod {m_1} x≡a1​(modm1​)

中国剩余定理断言这个方程组有模 M = m 1 × m 2 × . . . × m r M=m_1\times m_2\times ...\times m_r M=m1​×m2​×...×mr​的唯一解, 其解为:
x = ∑ i = 1 r a i M i y i ( m o d M ) x=\displaystyle\sum_{i=1}^ra_iM_iy_i \pmod M x=i=1∑r​ai​Mi​yi​(modM)
其中 M i = M / m i , y i = m i − 1 ( m o d m i ) , 1 ≤ i ≤ r M_i = M/m_i, y_i=m_i^{-1}\pmod{m_i}, 1\le i\le r Mi​=M/mi​,yi​=mi−1​(modmi​),1≤i≤r


现在求解:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

  1. M = 3 ∗ 5 ∗ 7 = 105 , M 1 = 5 ∗ 7 = 35 , M 2 = 3 ∗ 7 = 21 , M 3 = 3 ∗ 5 = 15 M=3*5*7=105,M_1=5*7=35,M_2=3*7=21,M_3=3*5=15 M=3∗5∗7=105,M1​=5∗7=35,M2​=3∗7=21,M3​=3∗5=15
  2. y 1 = M 1 逆 模 m 1 = 35 逆 模 3 = 2 , y 2 = 21 逆 模 5 = 1 , y 3 = 15 逆 模 7 = 1 y_1=M_1逆模m_1=35逆模3=2,y_2=21逆模5=1,y_3=15逆模7=1 y1​=M1​逆模m1​=35逆模3=2,y2​=21逆模5=1,y3​=15逆模7=1
  3. x = ( a 1 M 1 y 1 + a 2 M 2 y 2 + a 3 M 3 y 3 ) m o d M = ( 2 ∗ 35 ∗ 2 + 3 ∗ 21 ∗ 1 + 2 ∗ 15 ∗ 1 ) ( m o d 105 ) = 23 x=( a_1M_1y_1+a_2M_2y_2+a_3M_3y_3 )modM = (2*35*2+3*21*1+2*15*1) \pmod{105} = 23 x=(a1​M1​y1​+a2​M2​y2​+a3​M3​y3​)modM=(2∗35∗2+3∗21∗1+2∗15∗1)(mod105)=23

JS算法:

// 输入:[[2,3],[3,5],[2,7]]
function CRT(array) {let x = 0,M = 1for (let i = 0; i < array.length; i++) {const element = array[i]; // [2,3]M = M * element[1]}for (let i = 0; i < array.length; i++) {const element = array[i]; // [2,3]let Mi = M / element[1]let yi = MultiplicativeInverse(element[1], Mi)if (yi < 0) {yi = element[1] + yi}console.log(element[0], Mi, yi)x = x + element[0] * Mi * yi}console.log(x + "mod" + M + "=" + x % M)return x % M
}

书上习题5.6:求解同余方程组
{ x ≡ 12 ( m o d 25 ) , x ≡ 9 ( m o d 26 ) , x ≡ 23 ( m o d 27 ) , \begin{cases} x\equiv12\pmod{25}, \\ x\equiv 9\pmod{26}, \\ x\equiv 23\pmod{27}, \\ \end{cases} ⎩⎪⎨⎪⎧​x≡12(mod25),x≡9(mod26),x≡23(mod27),​

答案:14387。 测试结果:

console.log(CRT([[2, 3],[3, 5],[2, 7]
]))
result:
2 35 2
3 21 1
2 15 1
233mod105=23
23console.log(CRT([[12, 25],[9, 26],[23, 27]
]))
result:
12 702 13
9 675 25
23 650 14
470687mod17550=14387
14387

——End——

中国剩余定理Chinese remainder theorem(CRT)相关推荐

  1. 中国剩余定理(Chinese remainder theorem, CRT)

    考虑一个问题:一个整数除以3余2.除以5余3.除以7余2,求这个整数 part1 问题1:计算一个整数 x ,使得它满足除以3余2.除以5余3.除以7余2. 如果能够找到三个整数 x_1,x_2,x_ ...

  2. hdu 1788 Chinese remainder theorem again 【crt的具体过程】

    题意: 中国剩余定理:  假设m1,m2,-,mk两两互素,则下面同余方程组:  x≡a1(mod m1)  x≡a2(mod m2)  -  x≡ak(mod mk)  在0<=<m1m ...

  3. 中国剩余定理(Chinese Remainder Theorem)

    中国剩余定理 民间传说着一则故事--"韩信点兵". 秦朝末年,楚汉相争.一次,韩信将1500名将士与楚王大将李锋交战.苦战一场,楚军不敌,败退回营,汉军也死伤四五百人,于是韩信整顿 ...

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

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

  5. 欧几里得、扩展欧几里得和中国剩余定理

    欧几里得算法.扩展欧几里得算法和中国剩余定理 欧几里得算法 求两个数a, b的最大公约数 g c d ( a , b ) gcd(a, b) gcd(a,b) 根据 g c d ( a , b ) = ...

  6. 51Nod1079 中国剩余定理

    中国剩余定理 Chinese remainder theorem 一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K.例如,K % 2 = 1, K % 3 = 2, K % 5 = ...

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

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

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

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

  9. python中国剩余定理公式_《孙子算经》之物不知数题:中国剩余定理

    1.<孙子算经>之"物不知数"题 今有物不知其数,三三数之剩二,五五数之剩七,七七数之剩二,问物几何? 2.中国剩余定理 定义: 设 a,b,m 都是整数.  如果 m ...

最新文章

  1. 《Java并发编程实践》学习笔记之一:基础知识
  2. c++提供的可有效分配对象空间的运算符是_Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
  3. 2018年4月13日_Java的最新发展– 2018年4月下旬
  4. bootstarp js设置列隐藏_bootstrap table getHiddenColumns获取隐藏的列的方法
  5. dataguard 下主备 online redo 与 standby redo log resize 重建
  6. slqite3库查询数据处理方式_SQLite数据库使用 常用命令
  7. Atitit 法学体系树与知识点attilax大总结 法学体系 0301法学类 030101 法学理论 宪法 行政法 民法 商法 婚姻法和继承法 经济法 社会法 刑法 民事诉讼法 行政诉讼法
  8. mysql数据库xp下载64位_navicat premium 64位
  9. c语言一个笼子里关了鸡和兔子,成年后的你是否还质疑 古人为什么把鸡和兔子关在一个笼子里...
  10. [js高手之路]html5 canvas动画教程 - 跟着鼠标移动消失的一堆炫彩小球
  11. 随缘刷题算法学习笔记
  12. 济南职工医保统筹的一些了解
  13. 开发一个APP有多难?APP开发流程、开发成本揭秘
  14. 数字图像处理学习笔记4第四章 图像变换 附实验
  15. 使用switch-case来实现银行存款问题 计算存款利息。有N元,想存M年。有3种方法可选: (1)活期,年利率为r1 0.36% (2)一年期定期,年利率为r2 2.25% 从键盘获取存款年
  16. php 井字棋,Unity3D 井字棋
  17. DevOps教程:DevOps 工具
  18. 史上最强的美名腾智能起名成功发布
  19. 学生交作业,现在都流行用二维码了
  20. 【算法入门到进阶】【学习目录】

热门文章

  1. java - 78. 子集
  2. 计算机医学英语论文,医学英语论文范文
  3. 2020下半年总结:void
  4. 大学四年,如何把自己包装成一个被各大公司竞相争捧的香馍馍
  5. 关于小王同学的前端学习生涯(更新)
  6. Mac彻底删除Python
  7. 一网打尽MWC2019新品手机
  8. BZOJ2331: 地板 题解
  9. win10手动安装英语语言包
  10. Python3网络爬虫开发实战(崔庆才)笔记——ProxyPool的代码问题:AttributeError: 'int' object has no attribute 'item及相关问题的处理