3 月 14 日,这也是一个特殊的节日,是国际数学家联盟设立的国际数学日,也叫圆周率日、或者π日。原因很简单,π约等于 3.14 嘛!
 
圆周率的概念,在人类文明史上由来已久。一块产于公元前 1900 年到 1600 年前的巴比伦石匾上,记载着圆周率= 25/8 = 3.125;古埃及文物,莱因德数学纸草书(Rhind Mathematical Papyrus)则记载圆周率等于 16/9 的平方,约等于 3.1605。在中国,早在周朝成书的《周髀算经》中,就曾经有过“周三径一”的表述。
 
 
有人好奇,既然圆周率是无限不循环小数,会不会包括这个世界上的任何信息,包含了这个世界?
 
能否包含“任何信息”不好说,但一个冷知识是,圆周率里有每个人的银行卡密码!不信?看看这位来自知乎的程序员朋友是怎么证明的。
 
以下内容来自知乎用户 vortex 的回答:
 
(小编注:略有删节,点击文末阅读原文可跳转知乎查看原答案)
 
这个问题挺有意思,非数学专业,就从计算机的角度分析一下这个问题吧。
 
为了分析这个问题,我先用 y-cruncher 跑出了π的前 10 亿位,感觉应该够用!
 
不够用也没办法了,内存有限,而且跑程序时 CPU 占用率 100%,风扇吹的我心慌。
 
▲让人无奈的占用率
 
计算前 10 亿位共用时 190.515 秒,数据以 txt 的格式保存,大小 976.563MB。
 
下面开始我们的分析工作。
 
先简单的搜索一下,发现自己能想到的几个六位数字都出现了(包括我的银行卡密码)
 
举几个例子:
 
▲000000 出现在小数点后第 1,699,927 位
 
▲111111 出现在小数点后第 255,945 位
 
▲222222 出现在小数点后第 963,024 位
 
▲123456 出现在小数点后第 2,458,885 位
 
 

 

注:每行有 1024 个字符,所以计算公式应为 1024*(行数 -1)+列数 -2,其中 2 为开头的“3.”
 
但是不可能手动把 000000~999999 全验证一遍吧(虽然我今天很闲),还是要写个程序跑一下。
 
不考虑复杂度问题的话,代码很快就写完了,只有短短的 14 行。
 
 
因为我用的是 index,如果密码不存在的话,则会直接抛出异常。但是我的直觉是 000000~999999 是都存在的(其实是我懒得多写代码了)
 
检索的速度大概是 1000 条 / 秒,接下来就是耐心的等待过程。
 
程序跑完了!不出所料,所有的六位银行卡密码在π中都是存在的。
 
最后出现的密码是 569540,位于小数点后 14,118,307 位。(10 亿位有点过剩啊!)
 
▲统计数据截图
 
虽然π是无限不循环的,但是对我来说只截止到小数点后 7,599,477 位。
 
第一次收到这么多的赞。
 
于是我又写了个程序把π前 10 亿位中的生日给跑了出来,生日的范围为 1920~2020 共计 101 年。
 
上代码~供有兴趣的朋友研究,可以一起讨论如何计算的更快。(感觉这个完全可以出一个面试题的!我水平是不太行,下面是我想到的方法。)
 
 
 
大家不要私信给我发银行卡密码了!很危险的!真要查的话,有个朋友分享了在线查询的链接。范围精确到 2 亿位。
 

 

下面的内容非程序员可忽略 ...
 
经评论区的朋友们启发,而且实在受不了别人喷我程序运行的慢了。又写了一个更快的检索 6 位数字(就是所谓的银行卡密码)的算法。
 
感兴趣的程序员可以看一下。我感觉速度还行。十几秒钟就能检索完毕。更快的我暂时也还没想到……毕竟答主还只是一个大二在校生,也没搞过 ACM 竞赛,水平有限。
 
 
 
为程序员的智慧点赞!