
图像包含了自身的函数——塔珀自指公式
前言
中学时,我们学习了各种各样的函数,比如 , ,如果把这些函数的图像画在平面直角坐标系上,前者将是一个抛物线(红线),而后者会是一个双曲线(绿线)。如下图:
当然我们也可以把 x 和 y 都放在等式的同一边,比如 ,它的图像是一个圆心在原点、半径为 1 的圆圈。甚至不一定非要是等式,比如 ,图像是一个圆饼:
如果我告诉你,有一个函数的图像是它自身,你能相信吗?甚至于,这个函数的图像包含了「苟利国家生死以」这几个汉字,你敢信吗?
函数图像
上面说到的这个神奇的函数就是本篇文章的主题——Tupper’s self-referential formula,中文名「塔珀自指公式」。
在范围 内,其中,
$$ 4858450636189713423582095962494202044581400587983244549483093085061934704708 \\ 8099284506447698655243648499972470249151191104116057391774078569197543265718 \\ 5544205721044573588368182982375413963433822519945219165128434833290513119319 \\ 9953502413758765239264874613394906870130562295813219481113685339535565290850 \\ 0238750928568926945559742815463865107300491067230589335860525440966643512653 \\ 4936364395712556569593681518433485760526694016125126695142155053955451915378 \\ 5457525756590740540157929001765967965480064427829131488548259914721248506352 \\ 686630476300 $$
这个函数在直角坐标系(x 轴从左至右,y 轴从下至上)上的图像如下:

而它的数学公式是:

Un-fucking-believable! 这难道是巧合?
先不论那一大串 k
怎么回事,我知道有些公式恐惧症患者可能已经开始打退堂鼓了……
其实它的原理说白了很简单,厉害点的小学生都能听懂。
公式详解
我们来仔细观察一下这个乍看上去让人头大的公式,先向不熟悉数学公式的读者解释两个符号,一个是向下取整符号
⌊ ⌋,意味着求某个数的整数部分,比如 ⌊3.14⌋ 就等于 3,⌊2.99⌋
还是等于 2。另一个是求余符号 mod, mod(a, b)
意味着求 a 除以 b 所得的余数,比如
就等于
。事实上,对于任意一个整数
,mod(n, 2) > 1/2
等价于 n 为奇数。
至于我们这个复杂的公式,我们把 符号里左边那一大串表达式称为 S,它其实在问: 除以 所得的余数,向下取整后是 还是 ?更进一步,可以理解为:S 的整数部分是不是奇数?这里比较难一眼看穿,建议读者自己举几个例子,比如 S = 2.4/3.2 等等,重点关注 S 的整数部分对结果的影响。
接下来我们分析 ,它的表达式为:
$$ \Large {\left\lfloor {\frac{y}{17}} \right\rfloor {2^{ - 17\left\lfloor x \right\rfloor - \left\lfloor y \right\rfloor \bmod 17}}} $$
考虑幂中负号的作用, 可以看成是 除以
我们先来看分母部分,取整符号太讨厌了,我们假设 都是整数,那么对应到坐标系上就是一个个整数点,考虑向下取整符号的作用,就是把这个整数点右上方 大小的正方形中的点都投射到左下角的整数点;所以,最终我们得到的图像是一个个 大小的正方形小方块,这些小方块的左下角就是使得 S 整数部分为奇数的整数点。
那么分母就化成了 ,这不就是在坐标系上数格子嘛!轴从下至上,轴从左往右,从左下角以 开始数:
我们再来看分子 ⌊y/17⌋,它能保证在数格子的时候分子不变吗?当然可以,只要你能保证 处在某个范围内,比如 , 而且 k 必须是 的整数倍。
那么综合来看 ,它到底在干什么呢?
一个整数除以 2 的 n 次幂,结果的整数部分是不是奇数,等价于,这个整数的二进制表达右数第 n+1 位是不是 1
举几个例子:
- 7/4 = 1.75,整数部分为奇数;从二进制的角度来,7 的二进制表达是 111,7
除以 2 的 2 次幂,即 111 的右数第 3 位,为 1。
- 6/2 = 3,整数部分为奇数;6 的二进制表达为 110,110 的右数第 2 位,为
1。
- 2/1 = 2,整数部分为偶数;2 的二进制表达为 10,10 的右数第 1 位(2 除以
2 的 0 次幂),为 0。
这就是整个公式的关键所在了。
在一块宽为 ,高为 的格子板上作画,对于每个 的小格子,我们要么不涂,要么涂满,涂满的记作 ,没涂的记作 。我们把这些格子涂成公式的模样,按照数格子的顺序把这些 和 连在一起,形成一个长长的二进制数,然后把这个二进制数化为十进制,再乘以 ,最后就得到了我们最开始的 。
读者甚至可以自己验算一番,比如我想画一条长为 的竖线,那么我根据上面数格子的图,把要涂黑的地方打勾(记为 ),为了简便计算,我们把竖线的位置定为左下角,那么竖线对应的二进制数就是 ,转化为十进制就是 , 再乘以 得到 。把这个数字填到这个页面中,点击作画,它会自动生成对应范围内的函数图像。
最后是膜法时间,当
1 | |
时,函数在对应范围内的图像是「苟利国家生死以」,大家可以试试……