点击上方“AI遇见机器学习”,选择“星标”公众号

重磅干货,第一时间送达

晓查 明敏 发自 凹非寺
量子位 报道 | 公众号 QbitAI

没想到,古代韩信点兵的传说,后来竟然启发了计算机加密算法。

韩信是左边那位,不是右边的

相传,楚汉争霸之时,韩信率1500名将士与楚军交战败退,退往山上,这时候敌军率五百骑杀奔而来,韩信便急速点兵迎敌。

韩信命令士兵3人一排,结果多出2名;接着命令士兵5人一排,结果多出3名;他又命令士兵7人一排,结果又多出2名。

韩信马上算出,军中还剩1073人,而敌人不足五百,而且居高临下、以众击寡,于是率军杀得敌方大败而逃。

韩信是如何算出人数的,背后的算法又是如何影响当今的计算机领域?且往下看。

韩信还是个数学家?

当然,韩信算出士兵人数只是个传说,韩信本人并非数学大师。这个问题最早见于一本1700年前的古籍,已经是韩信死后600多年了。

南北朝时期,《孙子算经》记述了这样一个问题。(注:这位孙子不是写《孙子兵法》的孙武)

原书是这样说的:

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

意思是,一個整数除以三余二,除以五余三,除以七余二,求這個整数。

它就是中国剩余定理,也被叫做“韩信点兵”问题。

在近代数学中,很少有以中国数学家命名的重要定理,然而这样一条数学定理,名字里就有“中国”二字。

南宋时期,我国数学家秦九韶首先给出了这类问题的解法:大衍术

直到500年后,著名数学家高斯才在自己的书中描述类似的结果。

那么问题来了:传说中的“韩信”到底是怎么算出来人数的呢?

“韩信点兵”问题求解

为了更好地理解和表述“韩信点兵”问题,我们引入一个新的数学概念——“同余”。

在数学上,如果a和b除以正整数m后的余数相同,则称a、b对于模m同余,韩信点兵用数学公式来表示就是(X是未知的人数):

X ≡ 2 (mod 3)
X ≡ 3 (mod 5)
X ≡ 2 (mod 7)

为了简化问题,我们先只考虑前两个同余条件,满足除以3余2、除以5余3的整数分别为:

2、5、8、11、14、17、20、23、26……
3、8、13、18、23、28、33、38……

可以看出,同时符合这两个条件的第一个数是8,第二个数是23。后面的每个解与前一个之差都应该是3和5的最小公倍数15,即:

X = 8 + 15K (K是整数)

这样我们就把寻找的整数解缩小了,接着再加入第三个条件,找到分别满足X=8+15K和除以7余2的数:

8、23、38、53、68、83、98、113、128……
2、9、16、23、30、37、44、51……

满足条件的第一个数是23,第二个数是128。后面的每个解与前一个之差都应该是3、5、7的最小公倍数105。

这样寻找解的过程显然太繁琐。后来,明朝数学家程大位把求解方法编成了一首诗:

三人同行七十稀,五树梅花廿一枝。

七子团圆正半月,除百零五便得知。

意思是:

将除以3得到的余数乘以70,将除以5得到的余数乘以21,将除以7得到的余数乘以15,全部加起来后再减去105或者105的整数倍,得到的数就是答案。

70 × 2 + 21 × 3 + 15 × 2 = 233 - 2 × 105 = 23

其他的解只能和23相差105的整数倍,韩信应该是估计出军队大致人数,取了105×10+23=1073这个解。

以上70、21、15几组数到底是怎么来的,有兴趣的读者可以进一步阅读“中国剩余定理”的通解,在此不再赘述。

这道“韩信点兵”问题不仅仅能用于点兵,甚至在天文历法上也有重要应用。

假设有一颗彗星4年出现一次,我们在1991年看到了它、另一颗彗星10年看到一次,我们在1997年看到了它。我们下一次在同一年看到它们是什么时候?

X ≡ 1991 (mod 4)
X ≡ 1997 (mod 10)

经过计算,它们上一次相会是在2007年,而且每隔20年重逢一次,所以下一次应该是2027年。

时至今日,中国剩余定理已经成为了很多计算机加密算法的基础,它的应用范围已经超乎你的想象。

影响当今计算机算法

外媒Quantamagazine在一篇名为《古代战争计策是如何影响当代数学》的文章中也提到:中国剩余定理对现代数学、计算机算法、天文学等领域都有很大的启发意义。

比如非常有名的RSA加密算法,就应用了中国剩余定理。

我们知道在数论中,想要求解出两个大素数比较简单,但是想要对它们的乘积进行因式分解就很困难了。

而RSA加密算法就是把这个乘积作为了自己的加密密钥。

从1977年诞生以来,RSA加密算法已经成为了应用最广泛的公钥算法之一。

此外,在快速傅里叶变换(FFT)中也应用了中国剩余定理,它可以大大减少计算离散傅里叶变换时所需的乘法次数。

这几年,中国剩余定理还被用到了信息加密上。

2018年,哥伦比亚大学的学者们发明了一种可以在文本中加密信息的方法,其中就应用了中国剩余定理来确保信息复原时的准确性。

只要手机对着一段文字扫一扫,算法就能给出加密后的信息。

这种方法名叫FontCode,它是对普通字符进行微小的调整,然后再对调整后的字符重新编码信息,从而实现对信息的加密。

比如以下5种不同颜色的“a”,它们分别代表了1-5的数字信息。

如果不用颜色区分,肉眼很难分辨出它们和常规字体之间有什么不同。

但是机器可以。

只要通过扫描和分析,算法就能推断出哪些字母被特殊处理过,处理后的字母又表示了什么信息。

因此,在一段看似普通的文本中,可以很好隐藏这些特殊的字母,从而传递出一段加密的数字串

然后,再对这些数字进行计算,就能得出真实想要传递的信息。

但是这样的加密方式还不够保险,毕竟字符出现在屏幕或纸面上时,它的格式都有可能发生一些细小的变化。

这时就需要中国剩余定理登场了。

在上面我们已经介绍了,通过线性同余方程组就能计算出数值。

如果想求解3个未知量,那么需要3个线性方程才能做到。

现在为了保险起见,科学家们把线性方程的数量增加了。

比如为了求解出3个未知量,他们会设置5个线性方程,5个方程中只要知道3个,就能求解出想要的答案了。

显然,1000多年过去了,虽然我们不会再像韩信点兵一样隐藏士兵数量,但是现代数学、计算机等领域的研究者们依旧能从中国剩余定理中获得源源不断的启发。

参考链接:
[1]https://www.quantamagazine.org/how-ancient-war-trickery-is-alive-in-math-today-20210914/
[2]https://www.sciencedaily.com/releases/2018/05/180510150231.htm
[3]http://www.xinhuanet.com/science/2018-08/07/c_137372635.htm

欢迎关注我们,看通俗干货

韩信竟是数学大师?中国古代数学启发计算机加密算法相关推荐

  1. python中算法与数学_中国古代数学算法的Python实现

    看了这篇<没有定理的中国古代数学,如何站在世界之巅?>.虽然我觉得题目很标题党,不过里面的内容很有趣啊,讲解了中国古代数学里的几个算法.由于我正在学Python,所以自然就拿来练手了. 可 ...

  2. 古代社会计算机发展,吴国平:为何中国古代数学更能适应计算机的发展

    原标题:吴国平:为何中国古代数学更能适应计算机的发展 中国作为世界文明古国之一,各方面发展源远流长,成就辉煌.数学作为中国古代科学中一门重要学科,自然也为中华五千文明发展作出重要好贡献. 在文明发展过 ...

  3. 吴文俊: 中国古代数学对世界文化的伟大贡献

    公元前221年, 秦始皇灭六国, 建立了中国历史上第一个中央集权的封建国家. 汉承秦制, 自秦至西汉中期这两百来年间, 是新兴地主阶级专政巩固发展与上升的时期, 法家路线占着主导地位. 法家对工农业生 ...

  4. 《中国古代数学思想》读书笔记(15)

    <中国古代数学思想>读书笔记(15) 作者:中科大胡不归 第四章:数学思想的理论奠基--刘徽的数学思想.本篇记录此章第3节的第3部分和第4节的第1.2.3部分. 4.3 极限(无限)思想- ...

  5. 中国古代数学在几何学领域的独特贡献

    中国是世界文明发达最早的国家之一,与古代埃及.印度.巴比伦并称为四大文明古国.在绵延不断的五千年文明史中,中华民族集累了极其丰富的文化遗产. 在这个多姿多彩的历史文化宝库中,数学无疑是其中一颗特别璀璨 ...

  6. 中国古代数学有多牛?

    一键关注

  7. 中国古代数学问题——二鼠打洞

    <九章算术>的"盈不足篇"里有一个很有意思的老鼠打洞问题.原文是这么说的:今有垣厚十尺,两鼠对穿.大鼠日一尺,小鼠亦一尺.大鼠日自倍,小鼠日自半.问:何日相逢?各穿几何 ...

  8. 中国古代数学史上著名的“百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?

    这是一个很简单的for循环查找判断题. 不过注意:三种鸡均为整型,公鸡,母鸡不会出问题,但这鸡雏却会出现问题,在C++中如果a 为int型,那么a/3等等仍然 为int型 假设a为2 则a/3输出的结 ...

  9. python中国古代数学问题——二鼠打洞

    任务描述 <九章算术>的"盈不足篇"里有一个很有意思的老鼠打洞问题.原文是这么说的:今有垣厚十尺,两鼠对穿.大鼠日一尺,小鼠亦一尺.大鼠日自倍,小鼠日自半.问:何日相逢 ...

最新文章

  1. SIEM部署的几条最佳实践
  2. 279. 完全平方数 golang BFS
  3. NVRH.265:鱼与熊掌不兼得?不见得!
  4. 漫步微积分三十一——定积分的直观含义
  5. python勿使用mutable值作为默认参数
  6. windows 2012 r2 can't find kb2919355
  7. Activity not started, its current task has been brought to the front 。
  8. 【Gym - 101848D】XOR【多个数异或的典型问题】【费马小定理】
  9. Windows-局域网文件服务器文件共享软件 FtpServer
  10. D. Bash and a Tough Math Puzzle(区间gcd+思维)
  11. 数学建模——商人过河(Matlab)
  12. SQL Sever 2008 R2安装步骤
  13. RSA加密、解密 JAVA版 lua版 js版
  14. 幅频特性曲线protues_频率响应,幅频特性,增益与相位裕量,波特图
  15. Ubuntu Debian(NGINX/PHP/MYSQL)快速配置工具LNMP云安装
  16. JS十六进制转浮点、字符串转为ArrayBuffer、ArrayBuffer转16进制字符串、16进制转10进制、crc校验位、十六进制转中文字符串(小程序、浏览器)、十六进制字符串转ascall字串
  17. 趣味实验python,Python小实验:疯狂填词
  18. AWS服务器,如何设置成密码登录
  19. 入门GTD时间管理系统必读(链接必读--很完整的一个GTD系统)
  20. HTML5编写格式命令详解

热门文章

  1. DDRx的关键技术介绍(下)
  2. 当年修复Linux启动菜单的笔记
  3. Directx11教程(42) 纹理映射(12)-简单的bump mapping
  4. C#设计模式(8)-Builder Pattern
  5. TensorRT是NVIDIA开发的深度学习推理工具,只支持推理,不支持训练 引
  6. python list的extend (会将被插入的列表的每个元素从列表中拿出添加到列表中)与append方法(若被插入为列表,会将列表插入到源列表中)区别
  7. scikit-learn随机森林调参小结
  8. 守护线程不一定执行finally块
  9. JAVA C++ 左花括号{该另起一行写还是写在行尾的思考
  10. 国外AI教学网红网站