La formule auto-référente de Tupper
Tags : #calc #commonlisp #elisp #math
La formule auto-référente de Tupper se représente elle-même. Sur un écran de taille 106×17, en noircissant les pixels (x,y) vérifiant l’inéquation ci-dessous, on trace… la même inéquation.


Le tour de passe-passe se cache dans la borne inférieure de y — un entier k de 540 chiffres qui encode l’image.
La seule vraie difficulté d’une implémentation de Tupper est donc la manipulation d’un entier de 540 chiffres. Tout langage disposant de bignums natifs ramène le programme à une transcription directe de l’inéquation. C’est ce qui a été fait en Common Lisp, Emacs Lisp et GNU Emacs Calc.
cl-problem-solving — les bignums natifs de SBCL réduisent la formule à une douzaine de lignes de loop :
(defun tupper ()
(loop with n = 96093937991895888... ; 540 chiffres
for y from n below (+ n 17)
do (loop for x from (- 106 1) downto 0
do (if (< 0.5 (floor (mod (/ (floor y 17)
(expt 2 (+ (* 17 x) (mod y 17))))
2)))
(write-char #\#)
(write-char #\Space)))
(write-char #\Newline)))Cette version est également publiée sur Rosetta Code.
elisp-problem-solving — Emacs dispose de bignums natifs depuis la version 27, si bien que la version Elisp est presque identique. M-x tupper dessine la figure dans le buffer courant, à la position du point, avec insert à la place de write-char.
calc-problem-solving — Emacs Calc gère aussi les entiers à précision arbitraire, mais dans un modèle de programmation très différent. Pas de defun, pas de variable nommée — la formule devient une macro de raccourcis-clavier opérant sur une pile, avec Z{ ... Z} pour les boucles. La même inéquation en ressort, simplement écrite dans une notation qu’une calculatrice RPN des années 80 reconnaîtrait.