Eigenraum· Folge 7

EIG007 Selbstplottende Formeln

Sonntag, 23. Oktober 2022 · 20 min

MP3

Shownotes

•
Thomas Kahle

•
Website (thomas-kahle.de)

•
Bluesky (bsky.app/profile/tomkalei.bsky.social)

•
YouTube (Channel) (youtube.com/channel/UCgJHmP4tUv538_gkpT9lWDw)

•
ORCiD (orcid.org/0000-0003-3451-5021)

•
Patreon (patreon.com/EigenraumPodcast)

•
@tomkalei (Mastodon) (machteburch.social/@tomkalei)

•
Spende (Paypal) (paypal.me/tomkalei)

Jeff Tupper fand Anfang der 2000er eine Formel, deren Auswertung alle 17×106 großen Bitmaps enthält (de.wikipedia.org/wiki/Tuppers_Formel) und damit auch ein solches Bitmap der Formel selbst. Hinter dem folgenden Link ist ein kurzes Numberphile Video zur Tupper Formel (youtu.be/_s5RFgd59ao) und hier könnt ihr selbst Zahlen in Bitmaps übesetzen (takitamblog.tk/skrypty/Tupper).

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 (jtra.cz/index.html) eine Variante, die sich selbst als Vektorgrafik rendert (jtra.cz/stuff/essays/math-self-reference-smoot…).

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

Ein automatisch generiertes Transkript (also den Volltext) dieser Folge gibt es auf der Episodenseite (eigenpod.de/eig007-selbstplottende-formeln).

Transkriptvom Podcast bereitgestellt · Zeitmarken springen hin

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!

0:00 / 0:00