小议中国剩余定理兼怀金庸

        本是几个月前整理完备hash构造时打算写的,不意拖到了金庸先生去世。《射雕英雄传》中那一次精彩绝伦的数学启蒙,不亚于光明顶上张无忌出尽风头的擂台秀。瑛姑与黄蓉的几轮口头交锋,涵盖了n阶幻方,多元方程,级数以及数论等多个方面的经典问题。童稚时也许你和我一样背过“二四为肩,六八为足……”,是不是钦佩金庸先生一丝不苟的装逼与博学,中学时候你有没有觉得黄蓉说她和老爹能解地元到天元19次的方程有点吹牛逼。大学学计算机的同学不知道有没有人与我一样惊喜,黄蓉口中的“一道老题”又一次进了课本,在信息领域仍有广泛的应用,例如完备hash构造。

        瑛姑顿了顿,说道:“这第三道题呢,说易是十分容易,说难却又难到极处。今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?我知道这是二十三,不过那是硬凑出来的,要列一个每数皆可通用的算式,却是想破了脑袋也想不出。”

        黄蓉笑道:“这容易得紧。以三三数之,馀数乘以七十;五五数之,馀数乘以二十一;七七数之,馀数乘十五。三者相加,如不大于一百零五,即为答数;否则须减去一百零五或其倍数。”瑛姑在心中盘算了一遍,果然丝毫不错,低声记诵道:“三三数之,馀数乘以七十;五五数之……”黄蓉道:“也不用这般硬记,我念一首诗给你听,那就容易记了:三人同行七十稀,五树梅花一枝,七子团圆正半月,馀百零五便得知。”

这个题在不同地方用的题面不一样,有用韩信点兵为题面的,也有如上这样直接问有物不知其数……

涉及到的一条数论定理也有不同叫法,有的叫“孙子定理”的也有叫“中国剩余定理”的

我们先把原问题明确一遍

求x使得:

\\ x\mod 3 = 2\\ x\mod 5 = 3\\ x\mod 7 = 2\\

写成同余方程组的形式就是

\\ x\equiv2(mod\ 3)\\ x\equiv3(mod\ 5)\\ x\equiv2(mod\ 7)\\

瑛姑的方法很暴力,谓之“硬凑”,虽然效率不高却是最容易编程实现的,暴力循环即可。

再来看一下黄蓉的答案是怎么操作的

三三数之,馀数乘以七十;

五五数之,馀数乘以二十一;

七七数之,馀数乘十五;

三者相加,如不大于一百零五,即为答数;否则须减去一百零五或其倍数。

用式子表示就是

x=(2*70+3*21+2*15)\mod 105

那么这样操作为什么有效呢,虽然会背“三人同行七十稀”,这首诗为啥能行呢。

        我们知道1053,57的公倍数,如果x符合要求,那么x加上若干个105也是问题的解,对105取模只是为了得到最小的解。那么我们来看一下y=2*70+3*21+2*15是不是问题的解。

考虑第一个除项3,我们发现2*70 mod 3 = 2,而(3*21+2*15)可以看成一个整体,是被3整除的,无疑2*70+(3*21+2*15)mod 3 = 2,符合要求。对于第二个除项5,3*21 mod 5 = 3,而(2*70+2*15)5整除,3*21+(2*70+2*15)mod 5 = 2,也是符合要求的。对于第三个除项7也是同理。

        通过分析黄蓉给出的操作流程,我们可以总结出一个构造一元线性同余方程组的解的套路。就是已知m1,m2,m3是两两互质的正整数,求最小的正整数x,使它被m1,m2,m3除所得的余数分别为c1,c2,c3。求解思路就是我构造一个

x = (M1+M2+M3) \mod lcm(m1,m2,m3)

其中M1应该是一个能被m2和m3整除的数,并且满足

M1\mod m1 = c1

我们发现第一句诗“三三数之,馀数乘以七十”得到的2*70=140显然不是最小的M1,更小的M1是35,可以通过拿最小公倍数105辗转相除观察余数得到,即

\\ 105\div3=35\\ 35\div33=11\cdots 2

如果辗转相除最后余数不等于c1,那就把被除数扩大一下使它符合要求。例如黄蓉用70,被3除余1,那就把70扩大2倍用140。

中国剩余定理的完整表述可以在百科看到

小议中国剩余定理兼怀金庸_第1张图片

        而将中国剩余定理引入信息领域,用来构造完备hash,比较早的有台湾的张真诚,他在1984年写了一篇《The study of an ordered minimal perfect hashing scheme》。他与金庸一样能将老祖宗的智慧在新的领域以新的形式激活,作为华人深为之圈粉。

你可能感兴趣的:(算法,数学)