EIG007 Selbstplottende Formeln

avatar
Thomas Kahle

Jeff Tupper fand Anfang der 2000er eine Formel, deren Auswertung alle 17×106 großen Bitmaps enthält und damit auch ein solches Bitmap der Formel selbst. Hinter dem folgenden Link ist ein kurzes Numberphile Video zur Tupper Formel und hier könnt ihr selbst Zahlen in Bitmaps übesetzen.

Tuppers Formel ist aber nicht vollständig selbstplottend, da die Information, wo die Formel in der unendlichen Grafik zu finden ist, nicht selbst enthalten ist. Außerdem sieht die Formel nicht gut aus — total pixelig. 2019 veröffentlichte Jakub Trávník eine Variante, die sich selbst als Vektorgrafik rendert.

 

Feedback gerne auf Mastodon @Eigenraum@podcasts.social, an feedback (bei) eigenpod.de oder in die Kommentarspalte auf der Episodenseite.

Automatisch generiertes Transkript (nicht geprüft)
Hallo an den Empfangsgeräten. Hier ist Thomas. Ihr hört richtig, denn ihr hört
Eigenraum. Ich bin mal wieder da und will euch was erzählen über Mathematik.
Heute eine kleine mathematische Kuriosität. Verfolgt jemand von euch
Mathe-Twitter? Es gibt auf Twitter so Bubbles, in denen man sich bewegen kann.
Irgendwie die Jura-Bubble oder die Biologie-Bubble oder die Mathe-Bubble.
Und in der Mathe-Bubble da posten Leute halt so Dinge über Mathe, sowas wie
große Primzahlen, die irgendwie eine lustige Struktur haben oder so. Und wenn
man das verfolgt, dann sieht man auch immer wieder diese Formel, über die ich
heute reden will. Die selbstzeichnende Formel. So ein- bis zweimal im Monat taucht
die dann in meiner Timeline auf. Und jetzt wollte ich mir die mal genauer
anschauen. Es gibt dazu auch ein Numberphile-Video. Das verlinke ich euch mal.
Aber ich kann euch noch mehr erzählen, als es in diesem Numberphile-Video gibt.
Und was ich schon verstanden hatte, ist, das ist irgendwie so eine Formel. Und wenn
man die plottet, also irgendwie so eine Grafik von der Formel erstellt, dann
erscheint die Formel selbst. Also irgendwie die Formel ist selbstreferenziell und
zeichnet sich selbst. Zumindest, wenn man irgendwas richtig macht. Und das wollte
ich mir mal anschauen. Und wenn ihr hier das auf YouTube konsumiert oder irgendwie
einen Player mit Kapitelbildern habt, dann könnt ihr die Formel jetzt auch sehen.
Und die sieht irgendwie ziemlich pixelig aus. Und das ist auch genau so ein Pixel-Raster.
Und zwar, was ihr da seht, ist ein Pixel-Raster von der Größe 17 mal 106.
Also wer es jetzt nicht sieht, muss sich jetzt vorstellen, ihr seht 17 Zeilen, 106
Spalten, Pixel-Bitmap, wie man sagt. Und da ist eine Formel dargestellt, ziemlich
pixelig. Man muss ein bisschen genau hingucken, um das zu erkennen.
Aber die ist irgendwie so, das ist eine Ungleichung, in der steht links ein Halb
und dann ein kleiner Zeichen. Und dann kommen so Floor-Funktionen, also so
Abrundungsfunktionen und eine Modulo-2-Rechnung und irgendwie ein Ausdruck,
der x und y enthält. Also Mod 2 von Floor von y durch 17 mal 2 hoch und dann
irgendein Ausdruck. Und da kommt auch noch ein x drin vor.
Also es gibt zwei Eingaben, x und y. Und die Struktur der Formel ist so, dass wenn
man jetzt x und y irgendwelche Zahlen vorgibt, dann steht da eben eine
Ungleichung. Ein Halb ist kleiner als dieser Ausdruck.
Okay und die Ungleichung, die stimmt dann entweder oder nicht. Da muss man eben die
andere Seite ausrechnen. Und das macht man eben in Abhängigkeit von x und y.
Und jetzt seht ihr vielleicht auch schon, wie man das plotten sollte. Also man nimmt
jetzt x- und y-Koordinaten in so einem Koordinatensystem. x geht nach rechts, y
geht nach oben, setzt die da ein und bekommt dann, dass die Ungleichung entweder
wahr ist oder falsch. Und wenn die Ungleichung wahr ist, dann macht man den
Pixel schwarz. Wenn die Ungleichung falsch ist, macht man den Pixel weiß. Und dann kriegt man ein Bild.
Und das Bild ist sehr unendlich groß erst mal. Aber was diese Formel jetzt für
eine Eigenschaft hat, ist, dass wenn man jetzt ein genau richtig gewähltes 17 mal
106 Pixel großen Ausschnitt wählt, dann sieht man wieder diese Formel. Dann sieht
man genau diesen pixeligen Ausschnitt, den ihr jetzt in eurer Kapitelmarke seht.
Verrückt, oder? Also habe ich mir irgendwie so die Anleitung, das Handbuch von der
Formel durchgelesen. Und der Witz an der Sache ist, dass man sich von dieser
riesigen xy-Ebene, ihr müsst euch die jetzt so vorstellen, dass wir jeden Pixel
schon eingefärbt haben. Das geht zwar irgendwie in jede Richtung unendlich
weiter, aber wir haben alles schon eingefärbt. Und man kann jetzt sehen, dass
eigentlich, ob ein Pixel schwarz oder weiß ist, hängt auch nur von den ganz
zahligen Anteilen der Zahlen x und y ab. Also wenn ich x1 eingebe oder x1,1, dann
kommt das gleiche raus. Das heißt, das Bild, was sich ergibt, ist durch diese
ganzen Rundungen, die in der Formel vorkommen, ist wirklich auch ein Pixelbild,
das eigentlich ganze Zahlen als Eingaben nimmt. Also wir könnten uns das so
vorstellen, dass wir für die x und y nur ganze Zahlen eingeben müssen. Denn wenn
wir an den ganzen Zahlen nur ein bisschen rütteln, dann ändert sich da
nichts. Also es ist wirklich ein Pixelbild und hängt von den ganzen
Zahlen ab. Und was man jetzt machen muss, ist, man hat dieses unendliche Gebilde
und jetzt schneidet man da so einen Streifen raus, der geht in x-Richtung
von 0 bis 106. 106 war auch genau die Breite von dem Bild. Und die untersten
17 Zeilen, Zeile 0 bis 16, die könnte man sich jetzt mal anschauen. Also wir
schauen uns jetzt unser unnötig großes Koordinatensystem xy an. Das hat einen
Nullpunkt, 0,0. Und davon ausgehend schauen wir jetzt mal das Stück an. Das ist 17
Zeilen hoch, von 0 bis 16 und 106 Spalten breit. Und wenn wir uns das
anschauen, dann werden wir sehen, das ist leer. Es enthält gar nichts. Alle Pixel
weiß. Und jetzt gehen wir in diesem Streifen, 106 Spalten breiten Streifen
1 hoch und betrachten die nächsten 17 Zeilen darüber. Die nächsten 17 Zeilen
darüber haben ein Pixel links unten schwarz und den Rest weiß. Und wenn wir
noch weiter drüber gehen, dann werden wir sehen, dass die unten links einen zweiten
Pixel schwarz haben, den ersten dafür wieder weiß. Also ein Pixel, der an der
zweiten Stelle unten links ist. Und tatsächlich ist diese Formel so gebaut,
dass wenn ich jetzt in diesem Streifen immer weiter höher gehe, immer 17 Zeilen
nach oben, erhalte ich einfach jedes mögliche 17 mal 106 Pixel Bitmap.
Insbesondere erhalte ich auch eins, wo da Eigenraum steht. Und ich halte auch eins,
wo da euer Name steht. Und ich halte auch eins, wo da diese Formel steht. Denn diese
Formel kann man so pixelig hinschreiben. Wie viele solche Bilder gibt es
eigentlich? Also das ist auch ganz leicht zu berechnen.
Das sind ja 17 mal 106 Pixel. Die sind nur schwarz und weiß. 17 mal 106 ist
1802, wie man leicht berechnen kann mit dem Taschenrechner. Oder im Kopf, wenn man
richtig gut Kopf rechnen kann. Also haben wir 2 hoch 1802 solche Bilder.
Das sind schon ganz schön viele. Also ungefähr so eine 3 mit 542 Nullen.
Ein bisschen weniger, habe ich mir mal ausgerechnet. Und so viele verschiedene
Bilder gibt es. Und die kommen jetzt da einfach der Reihe nach. Und weil die auch
so schön der Reihe nach sind, kann man das auch umrechnen.
Also man kann einfach eine Zahl, eine riesengroße Zahl, eine Zahl zwischen 0
und dieser 3 mit 542 Nullen nehmen und in ein Bild umrechnen. Indem man dann 17 mal
meine Zahl oder, ja, also ich gehe einfach in die Zeile, die meine Zahl angibt und
schaue von da 17 Zeilen nach oben. Und dann bekomme ich halt ein Bild raus und
dieser Streifen geht halt alle möglichen Bilder der Reihe nach durch.
Diese Tupper-Formel, benannt nach dem kanadischen Mathematiker Jeff Tupper,
zeichnet eben diese ganzen Bilder alle nacheinander. Und man braucht jetzt auch
noch die richtige Zeile. Und er hat natürlich diese Zeile auch angegeben, in
der man schauen muss. Aber man könnte sagen, diese Formel
druckt sich doch nicht selbst, weil in der Formel ja diese Zeilennummer nicht
enthalten ist. Die braucht man noch separat. Diese Übersetzung zwischen
Zeilennummer und Bild ist jedenfalls ziemlich einfach. Die könnt ihr jetzt
mal programmieren. Das ist eine ganz schöne Übungsaufgabe in praktischer
Informatik, ein Programm zu schreiben, was die Zeilennummer in das Bild übersetzt
oder das Bild in die Zeilennummer. Ich verlinke euch aber auch mal eine
Webseite, wo die Übungsaufgabe schon gelöst ist. Dann könnt ihr damit ein
bisschen rumspielen. Wir haben noch gar nicht geklärt, wie
er jetzt diese Formel finden konnte. Also wenn man diese Formel mal hat und man
kennt ihre Eigenschaft, dass sie alle diese Bilder nacheinander plottet und
man dann nur noch das Richtige raussuchen muss, den richtigen Streifen, dann ist es
ja klar. Aber warum hat diese Formel die Eigenschaft, alle Bilder zu generieren,
die 17 Zeilen hoch sind und die nacheinander in diesem Streifen da zu
platzieren? Und das klingt erst mal verwirrend, ist aber gar nicht so schwer
zu verstehen. Ich mache das mal mit einem einzeiligen Bild. Also wenn mein Bild jetzt
nicht 17 Zeilen wäre, sondern nur eine Zeile hoch, dann ist es eigentlich gar
nicht so schwer. Man schreibt einfach alle Zahlen in binär
nacheinander auf. Also ich schreibe in die erste Zeile von einem, ich konstruiere
sozusagen von 0 alle einzeiligen Bilder. In dem ersten Bild steht 0 alle Bits weiß.
Im zweiten Bild steht 1, ein Bit ganz links gesetzt. Im dritten Bild steht 2,
das heißt das zweite Bit von links ist gesetzt. Und jetzt habe ich mir eine
Länge vorgegeben und schreibe alle diese Bitmuster übereinander und dann kann
man sich ganz leicht überlegen, dass es da eine einfache Formel gibt. Die
Floor-Funktion von j hoch 2 hoch i mod 2 gleich 1. Wenn diese Gleichung gilt, dann
ist der Pixel schwarz und wenn nicht, dann in Zeile i Spalte j schwarz und wenn nicht,
dann eben weiß. Okay, damit hat man also eine Zeile und jetzt muss man das Ganze
noch so ein bisschen aufbohren, dass man eben ganze 17er Felder hat und das macht
eben diese Formel ist gar nicht so schwer. Okay, das ist jetzt also diese
Magie und ihr könnt das auch in diesem Numberphile-Video ist es natürlich
total schön illustriert und ihr könnt euch das mal anschauen, aber Fragen, die
da nicht beantwortet werden und die sich für mich jetzt offensichtlich stellen,
sind erstens, die Formel ist gar nicht selbstzeichnend, weil eben das
Hochscrollen, wie weit muss ich in meiner Spalte hochscrollen,
das wird nicht mit kodiert. Und zweitens, die Schriftart ist furchtbar.
Es sieht doch total pixelig aus, wer will sich denn sowas angucken? Und die beiden
Dinge, über die will ich jetzt auch noch ein bisschen reden. Fangen wir jetzt mal
bei eins an. Also die Formel ist nicht wirklich selbstreferenziell, weil fehlt,
in welche Zeile muss man scrollen. Könnte man jetzt wirklich eine
selbstreferenzielle Formel machen, die das noch mit enthält? Und die Antwort ist
ja und theoretisch kann man das relativ leicht zeigen. Also das ist so, naja,
würde ich mal sagen, ein Standard-Trick in der theoretischen Informatik, zu
zeigen, dass sowas existieren muss. Es gibt so Programme, die ihren eigenen
Quellcode ausgeben. Also man hat ein Programm und wenn man das ausführt, da
gibt es einfach seinen eigenen Quellcode aus. Das ist auch erst mal gar nicht so
leicht zu finden. Also man kennt ja, wenn man irgendwie anfängt zu programmieren,
vielleicht so ein Hello-World-Programm. Print, Hello-World. Und jetzt will man quasi
print und dann den Programmcode da reinschreiben. Aber das Problem ist, wenn
ich den Programmcode da reinschreibe, dann habe ich ja noch diesen extra Print-Befehl
am Anfang und der steht dann da nicht mit drin. Und wenn ich den noch mit
reinschreiben will, dann habe ich wieder einen extra Print-Befehl. Also muss
irgendwie diese Abhängigkeit brechen. Und meistens wird das irgendwie so
gemacht, dass man so eine generische Ausdruckroutine hat, wie zum Beispiel die
Print-Funktion. Und dann irgendwie ein Datenblock, der noch transformiert wird.
Der Datenblock ist dann, der codiert den Quelltext und der ist aber nicht der
Quelltext selbst. Denn wenn der Quelltext selbst da schon drin wäre, dann hätte
man immer das Problem, dass man den Aufruf der Printroutinen noch hat.
Also muss er den irgendwie knapper codieren. Und dann kriegt man das hin.
Also könnt ihr euch auf Wikipedia einzeilige Beispiele in Python anschauen.
Und sowas nennt man jedenfalls ein Quine. Und Quines existieren in jeder
Programmiersprache. Das ist so ein Satz in der Informatik. Man kann sogar, weil so
eine Programmiersprache rekursiv ist, kann man sogar ein Programm schreiben, was ein
Quine findet, was ein Quine berechnet. Also die existieren nicht nur, sondern
die sind auch berechenbar. Und mit so Techniken, die man entwickelt, um diese
Quines zu finden, kann man auch eine selbstreferenzielle Formel bauen, die ganz
viele, ganz große Blöcke ausgibt, wo jetzt nicht nur die Formel reinpasst,
sondern auch noch die Zeilennummer. Also ihr müsst euch das jetzt so vorstellen.
Da steht dann jetzt, das ist jetzt kein 17 mal 106 Block, sondern irgendwie 1000 irgendwas
mal irgendwas Block. Und da steht eben oben die Formel. Und da drunter steht
auch noch die Zeile, in der man gucken muss. Und da muss man schon wieder ein bisschen suchen.
Also das hat dann wieder so eine selbstreferenzielle Natur. Aber das gibt's
auch. Und Topper hatte auch sowas schon gefunden. Und es passte aber irgendwie
nicht auf einen Bildschirm. Also es war so eine, sagen wir mal noch, theoretische
Konstruktion. Und jetzt kommt eine neue Person ins Spiel. Mein neuer Held. Und das ist Jakub
Trawnik aus der Tschechischen Republik. Und er hat eine Formel gebaut, die auf
einen Bildschirm passt, mit der Zahl und noch verschiedene andere schöne
Eigenschaften hat. Es ist erst mal sehr kompakt, funktioniert nach dem gleichen
Prinzip. Und er hat auch gleich noch eingebaut, dass man immer die gleiche Stelle plotten muss.
Also man plottet immer den gleichen Ausschnitt von dem XY-Koordinatensystem. Und neben X und
Y enthält die Formel jetzt auch noch einen großen Parameter n, eine große Zahl, die sozusagen den
Bildausschnitt so verschiebt, dass das Bild von der Formel genau immer an der gleichen Stelle
kommt. Und das ist die Stelle, die irgendwie den Nullpunkt enthält. Also sehr praktisch.
Das hat er so 2011 gemacht. Ich glaube, diese ursprüngliche Tupper-Formel war von so der
Jahrtausendwende, vom 20. auf 21. Jahrhundert. Aber jetzt kommen wir zum zweiten Punkt. Denn
Trawnik hatte auch diese visuellen Schmerzen beim Betrachten so einer pixeligen Formel. Und da fühle
ich so eine gewisse Seelenverwandtschaft. Denn es geht auch nichts über schöne Schriftarten, oder?
Und er machte sich also auf, und ich glaube so 2017 begann das, so beschreibt er das in einem
Blogpost, eine Formel zu bauen, die nicht mehr auf Bitmaps beruht. Worauf beruhen die
schönen Schriftarten, die wir heute auf unseren Computern sehen? Die beruhen alle auf Glyphen.
Und das sind so geometrische Repräsentationen von den Buchstaben, die wir sehen, mithilfe von
Bezierkurven oder irgendwelchen mathematischen Kurven, die in beliebiger Genauigkeit gezeichnet
werden können. Also die Außenhülle eines Buchstabens, eines einzelnen Buchstabens,
besteht aus Kurven. Und wenn ich jetzt reinzoome, dann wird einfach dieses Stück von der Kurve
wieder neu berechnet. Und ich erhalte immer eine glasklare Darstellung meines Buchstabens. Egal,
wie weit ich reinzoome. Ihr kennt das sicherlich auch, den Unterschied zwischen einer Vektorgrafik
und einer Bitmap-Grafik. Wenn ich in Bitmap reinzoome, sehe ich irgendwann die Pixel als
große Quadrate. Und eine sogenannte Vektorgrafik berechnet eben die Kurven so, wie sie wirklich
sein sollen. Und es muss doch einfach eine ästhetisch ansprechende Version dieser Formel
geben, die nicht auf Bitmaps beruht, sondern ordentlicher Typografie, eine selbstreferenzielle
Formel, die in jeder Zoom-Stufe gut aussieht. Und das hat er geschafft. Ich zitiere ihn mal
ein bisschen. Er ist da auch so ein bisschen drangegangen, hat Typografie dabei noch mitgelernt,
also aus seinem Blogpost. Typography is all about outline-based fonts. So in August 2017,
I searched for other formulas that could be useful for glyph rendering that would be using
outlines. Also er will jetzt das typografische Prinzip umsetzen, dass man die Buchstaben
beschreibt, indem man ihre Außenhüllen beschreibt als mathematische Kurven. At this time I could try
to convert existing fonts into my outline curve format. Also er hatte so ein Formel-Stücken schon
gefunden, die so einzelne Kurven beschreiben, die er jetzt nutzen wollte, um seine Buchstaben
abzubilden und dann die Formel zu finden, die selbstreferenzielle Formel, die sie selbst
plottet. Und jetzt kam er natürlich erstmal auf das Lizenzproblem. Schriftarten sind alle mit
Lizenzen versehen, deswegen musste er seine eigene Schriftart designen. I would not really want to
attach a license to my formula. Also er wollte jetzt nicht eine Lizenz kaufen für seine
selbstreferenzielle Formel, denn in der Mathematik wollen wir ja nicht unbedingt Lizenzbedingungen
mitliefern mit unseren Theorien und unseren Formeln. Also I wanted to try designing a font
myself, a thing that I never did myself before. Designing a font consumes a lot of time. Also er kommt zu der
richtigen Nerd-Einsicht. Ich muss an dieser Stelle jetzt lernen, wie man seine eigene Schriftart
designt und ich mache das jetzt, das ist es mir wert. Und dann macht er das und er lernt viel dabei.
To outsiders of typography, the letters can just use regular geometric shapes that follow coarse
grids of control points. But in fact the human vision is pleased most by shapes that are not
fitting a coarse grid of control points. Also er nerdet sich rein in die Typografie, stellt fest,
dass es eben nicht um reguläre geometrische Anordnung geht bei der Typografie, sondern um
ein künstlerisches Empfinden. A font is not a group of pretty characters, but rather a pretty group of
characters. Ist das nicht wundervoll? Also er beginnt 2017 und braucht dann irgendwie ein paar
Monate und hat dann alle Buchstaben designt, die er braucht. Unter anderem auch so ein Schatten-R
für die reellen Zahlen, wie man es in der Mathematik gerne benutzt. Und arbeitet dann an dem Programm,
das die Typografie zusammensetzt. Das aus den einzelnen Buchstaben eben die Worte formt und
kam dann ein bisschen ins Schwitzen, weil er noch nicht so ganz perfektionistisch fertig war. Aber
er hat dann beschlossen, dass er jetzt mit der Typografie aufhört und sich eben der
selbstreferenziellen Formel widmet. Und dann hat er aber immer noch bis 2019 gebraucht, um diese
Arbeit zu vervollständigen. Und jetzt hat er es geschafft. 2019 hat er es geschafft. Die Formel
rendert sich selbst. Wenn man sie plottet, dann erscheint die Formel zusammen mit allen Parametern
und einer Anleitung, wie man das liest, wie man sie plottet, in der von ihm selbst entworfenen
Schriftarten. Das ist fantastisch, oder? Die Formel ist jetzt also freiskalierbar. Das heißt,
wenn ich in einen Bildausschnitt reinzoome, dann wird sozusagen von meinem Computer ein Pixelbild,
ein Ausschnitt in Pixeln berechnet. Dazu muss die Formel wieder genauer ausgewertet werden. Und die
Formel enthält einen reellen Parameter, Epsilon, so einen Genauigkeitsparameter. Und den würde ich
dann anpassen. Und ich würde dann dort diesen Bildausschnitt berechnen. Und ich bekomme ihn
in der gewünschten Auflösung. Man kann beliebig hereinzoomen und alles wird sehr hochauflösend.
Tja, was soll ich dazu sagen? Ich kann eigentlich nichts sagen, außer, dass ich diese Arbeit sehr
bewundere. Ich ziehe meinen Hut davor. Und das ist die wahre, selbstreferenzielle Formel. Denn sie ist
selbstreferenziell und hat schöne Typografie. Und damit wünsche ich euch einen guten Tag,
eine gute Nacht oder was auch immer ihr gerade macht. Bis bald, beim nächsten Mal, Eigenraum. Ciao!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.