中国剩余定理

「物不知数」问题

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

即求满足以下条件的整数:除以 32 ,除以 53 ,除以 72

该问题最早见于《孙子算经》中,并有该问题的具体解法。宋朝数学家秦九韶于 1247 年《数书九章》卷一、二《大衍类》对「物不知数」问题做出了完整系统的解答。上面具体问题的解答口诀由明朝数学家程大位在《算法统宗》中给出:

三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五便得知。

2×70+3×21+2×15=233=2×105+23 ,故答案为 23

算法简介及过程

中国剩余定理 (Chinese Remainder Theorem, CRT) 可求解如下形式的一元线性同余方程组(其中 n1,n2,,nk 两两互质):

{xa1(modn1)xa2(modn2)xak(modnk)

上面的「物不知数」问题就是一元线性同余方程组的一个实例。

算法流程

  1. 计算所有模数的积 n
  2. 对于第 i 个方程:
    1. 计算 mi=nni
    2. 计算 mi 在模 ni 意义下的 逆元 mi1
    3. 计算 ci=mimi1不要对 ni 取模 )。
  3. 方程组的唯一解为: a=i=1kaici(modn)

伪代码

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

算法的证明

我们需要证明上面算法计算所得的 a 对于任意 i=1,2,,k 满足 aai(modni)

ij 时,有 mj0(modni) ,故 cjmj0(modni) 。又有 cimi(mi1modni)1(modni) ,所以我们有:

aj=1kajcj(modni)aici(modni)aimi(mi1modni)(modni)ai(modni)

即对于任意 i=1,2,,k ,上面算法得到的 a 总是满足 aai(modni) ,即证明了解同余方程组的算法的正确性。

因为我们没有对输入的 ai 作特殊限制,所以任何一组输入 {ai} 都对应一个解 a

另外,若 xy ,则总存在 i 使得 xy 在模 ni 下不同余。

故系数列表 {ai} 与解 a 之间是一一映射关系,方程组总是有唯一解。

下面演示 CRT 如何解「物不知数」问题。

  1. n=3×5×7=105
  2. 三人同行 七十 希: n1=3,m1=n/n1=35,m112(mod3) ,故 c1=35×2=70
  3. 五树梅花 廿一 支: n2=5,m2=n/n2=21,m211(mod5) ,故 c2=21×1=21
  4. 七子团圆正 半月n3=7,m3=n/n3=15,m311(mod7) ,故 c3=15×1=15
  5. 所以方程组的唯一解为 a2×70+3×21+2×1523323(mod105) 。(除 百零五 便得知)

应用

某些计数问题或数论问题出于加长代码、增加难度、或者是一些其他不可告人的原因,给出的模数: 不是质数

但是对其质因数分解会发现它没有平方因子,也就是该模数是由一些不重复的质数相乘得到。

那么我们可以分别对这些模数进行计算,最后用 CRT 合并答案。

推荐练习:BZOJ 1951

比较两 CRT 下整数

考虑 CRT, 不妨假设 n1n2...nk

{xa1(modn1)xa2(modn2)xak(modnk)

与 PMR(Primorial Mixed Radix) 表示

x=b1+b2n1+b3n1n2...+bkn1n2...nk1,bi[0,ni)

将数字转化到 PMR 下,逐位比较即可

转化方法考虑依次对 PMR 取模

b1=a1modn1b2=(a2b1)c1,2modn2b3=((a3b1)c1,3x2)c2,3modn3...bk=(...((akb1)c1,kb2)c2,k)...)ck1,kmodnk

其中 ci,j 表示 ninj 的逆元, ci,jni1(modnj)

扩展:模数不互质的情况

两个方程

设两个方程分别是 xa1(modm1)xa2(modm2)

将它们转化为不定方程: x=m1p+a1=m2q+a2 ,其中 p,q 是整数,则有 m1pm2q=a2a1

由裴蜀定理,当 a2a1 不能被 gcd(m1,m2) 整除时,无解;

其他情况下,可以通过扩展欧几里得算法解出来一组可行解 (p,q)

则原来的两方程组成的模方程组的解为 xb(modM) ,其中 b=m1p+a1M=lcm(m1,m2)

多个方程

用上面的方法两两合并就可以了……

推荐练习:POJ 2891

【模板】扩展中国剩余定理

「NOI2018」屠龙勇士

「TJOI2009」猜数字

「SDOI2010」古代猪文

李永乐老师视频讲解

posted @   RioTian  阅读(996)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
点击右上角即可分享
微信分享提示

📖目录