中国剩余定理
「物不知数」问题
有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
即求满足以下条件的整数:除以
该问题最早见于《孙子算经》中,并有该问题的具体解法。宋朝数学家秦九韶于 1247 年《数书九章》卷一、二《大衍类》对「物不知数」问题做出了完整系统的解答。上面具体问题的解答口诀由明朝数学家程大位在《算法统宗》中给出:
三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五便得知。
算法简介及过程
中国剩余定理 (Chinese Remainder Theorem, CRT) 可求解如下形式的一元线性同余方程组(其中
上面的「物不知数」问题就是一元线性同余方程组的一个实例。
算法流程
- 计算所有模数的积
; - 对于第
个方程:- 计算
; - 计算
在模 意义下的逆元
; - 计算
( 不要对 取模 )。
- 计算
- 方程组的唯一解为:
。
伪代码
1 → n
0 → ans
for i = 1 to k
n * n[i] → n
for i = 1 to k
n / n[i] → m
inv(m, n[i]) → b // b * m mod n[i] = 1
(ans + a[i] * m * b) mod n → ans
return ans
算法的证明
我们需要证明上面算法计算所得的
当
即对于任意
因为我们没有对输入的
另外,若
故系数列表
例
下面演示 CRT 如何解「物不知数」问题。
;- 三人同行 七十 希:
,故 ; - 五树梅花 廿一 支:
,故 ; - 七子团圆正 半月 :
,故 ; - 所以方程组的唯一解为
。(除 百零五 便得知)
应用
某些计数问题或数论问题出于加长代码、增加难度、或者是一些其他不可告人的原因,给出的模数: 不是质数 !
但是对其质因数分解会发现它没有平方因子,也就是该模数是由一些不重复的质数相乘得到。
那么我们可以分别对这些模数进行计算,最后用 CRT 合并答案。
推荐练习:BZOJ 1951
比较两 CRT 下整数
考虑 CRT, 不妨假设
与 PMR(Primorial Mixed Radix) 表示
将数字转化到 PMR 下,逐位比较即可
转化方法考虑依次对 PMR 取模
其中
扩展:模数不互质的情况
两个方程
设两个方程分别是
将它们转化为不定方程:
由裴蜀定理,当
其他情况下,可以通过扩展欧几里得算法解出来一组可行解
则原来的两方程组成的模方程组的解为
多个方程
用上面的方法两两合并就可以了……
推荐练习:POJ 2891
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)