无意中记起来之前一次CTF中遇到一个很有趣的不等式——Tupper's Self-Referential Formula(塔珀自指公式)

塔珀自指公式是杰夫·塔珀(Jeff Tupper)发现的自指公式:此公式的二维图像与公式本身外观一样。
该公式是一种对存储在常量k 中的位图信息进行解码的通用方法 ,它实际上可以用来绘制任何其他图像。

该不等式的定义为:

其中 ⌊ ⌋ 表示楼层函数, mod 是模运算。

当给k赋值:

4858450636189713423582095962494202044581400587983244549483093085061934704708809928450644769865524364849997247024915119110411605739177407856919754326571855442057210445735883681829823754139634338225199452191651284348332905131193199953502413758765239264874613394906870130562295813219481113685339535565290850023875092856892694555974281546386510730049106723058933586052544096664351265349363643957125565695936815184334857605266940161251266951421550539554519153785457525756590740540157929001765967965480064427829131488548259914721248506352686630476300

作图,在 0 ≤ x < 106 和k ≤ y < k + 17 范围内的图像:

可以发现,图像即为不等式本身。

因此,根据k值不同,可以做出“任意”图像。

特意在Google上找到一个极为方便的网站:Tuppers-Formula-Tools
你可以在此网站上:
(1)手动构建图像,求得k值;
(2)根据已有k值画出对应图像。

例如:手动创建包含Coonaa的图像,得到对应的k值:


本文给出一个简易的Python作图脚本,对Tupper’s Self-Referential Formula作图加以验证。

from functools import reduce


def Tuppers_Self_Referential_Formula():
    k = 4858450636189713423582095962494202044581400587983244549483093085061934704708809928450644769865524364849997247024915119110411605739177407856919754326571855442057210445735883681829823754139634338225199452191651284348332905131193199953502413758765239264874613394906870130562295813219481113685339535565290850023875092856892694555974281546386510730049106723058933586052544096664351265349363643957125565695936815184334857605266940161251266951421550539554519153785457525756590740540157929001765967965480064427829131488548259914721248506352686630476300
    # 这里替换为你自己的K值

    def f(x, y):
        d = ((-17 * x) - (y % 17))
        e = reduce(lambda x, y: x * y, [2 for x in range(-d)]) if d else 1
        g = ((y // 17) // e) % 2
        return 0.5 < g

    for y in range(k + 16, k - 1, -1):
        line = ""
        for x in range(0, 107):
            if f(x, y):
                line += " ■"
            else:
                line += "  "
        print(line)


if __name__ == '__main__':
    Tuppers_Self_Referential_Formula()


运行脚本,可以在控制台得到图像:

将k值替换为我自己的k值

32835058729866203892723578897825242430219377821705829199254986348055145924203657208471357261453916522538180856257041969971033107196364985898555526183573928467412048664377344813507245749517758881064820245428861729497402713483970839540513768761175616657434877746262829753083000835830308459336673655071893898503426833241401747647397207543751172332926526049282312281851963766568880132700794901718647560288909884623269306796837625164622773354496


得到我自己的图像:

看到这里,你可以去大展身手搞你想搞的东西了!

数学的东西,摸不着头脑,这里简单做个记录。
网上有很多现成的针对Tupper’s Self-Referential Formula的脚本,大家可以直接到Github等平台查找即可。
附上Tupper’s Self-Referential Formula在维基百科上的介绍




• 本文中所提及的所有工具、资料、信息等各类内容,仅供学习参考,严禁用于非法用途。
• 请严格遵守相关法律法规,因不正当使用造成的后果由使用者自行承担,本站概不负责。


• 本站原创内容版权归作者所有,转载内容版权及解释权归原作者所有。
• 本站内容如需商业转载请联系作者获得授权,非商业转载请注明出处。
• 最终解释权归本站所有。

• 本文作者:Coonaa(转载文章除外)
• 本文链接:https://coonaa.cn/index.php/archives/153/

最后修改:2021 年 08 月 23 日 03 : 58 PM
如果你觉得我的文章有用,给我赏口饭叭 ~༼ つ ◕_◕ ༽つ