CasNum - Eine Arithmetikbibliothek mit beliebiger Genauigkeit auf Basis von Zirkel und Lineal
(github.com/0x0mer)- Eine Python-Bibliothek, die Arithmetik mit beliebiger Genauigkeit auf Basis von Konstruktionen mit Zirkel und Lineal implementiert und alle Operationen als geometrische Konstruktionen ausführt
- Stellt jede Zahl als Punkt in der Ebene dar und implementiert Addition, Multiplikation und logische Operationen vollständig über Konstruktionsregeln
- Ersetzt die ALU des Game-Boy-Emulators (PyBoy) durch CasNum, sodass Spiele ausschließlich mit geometrischen Operationen ausgeführt werden können
- Enthält RSA-Beispiele und ein Game-Boy-Integrationsbeispiel; über den Visualisierungs-Viewer (
viewer) lässt sich der Konstruktionsprozess in Echtzeit beobachten - Wird unter der MIT-Lizenz veröffentlicht und enthält angepasste Versionen von PyBoy (LGPL v3) und 2048.gb (zlib-Lizenz)
Überblick über CasNum
-
CasNum ist eine Python-Bibliothek für Arithmetik mit beliebiger Genauigkeit mittels Konstruktionen mit Zirkel und Lineal (compass and straightedge)
- Jede Zahl
xwird als Punkt(x, 0)in der Ebene dargestellt - Addition wird umgesetzt, indem der Mittelpunkt zweier Punkte gefunden und anschließend auf das Doppelte erweitert wird
- Multiplikation und Division werden mithilfe des Prinzips ähnlicher Dreiecke konstruiert
- Auch logische Operationen (AND, OR, XOR) sind geometrisch implementiert
- Jede Zahl
-
Die grundlegende Konstruktions-Engine befindet sich im Verzeichnis
cas/und unterstützt die folgenden fünf Basis-Konstruktionen- eine Gerade durch zwei Punkte
- ein Kreis mit einem Punkt als Mittelpunkt durch einen anderen Punkt
- der Schnittpunkt zweier Geraden
- der Schnittpunkt einer Geraden und eines Kreises
- der Schnittpunkt zweier Kreise
-
Auf Basis dieser Konstruktionsoperationen ist die CasNum-Klasse definiert, die arithmetische und logische Operationen vollständig geometrisch ausführt
Hauptfunktionen und Optimierungen
- Multiplikation, Division und Modulo-Operationen werden über ähnliche Dreiecke und geometrische Beziehungen implementiert
- Bestimmte Operationen (z. B. Multiplikation mit 2) lassen sich effizienter ausführen als mit dem allgemeinen Algorithmus
- Verwendet Pythons
lru_cache, um Operationsergebnisse zu cachen und bei Wiederverwendung zu beschleunigen - Durch das Caching kann der Speicherverbrauch stark ansteigen, was zu beachten ist
Anwendungsbeispiele
-
Implementierung eines RSA-Verschlüsselungsprogramms
-
Integration in die ALU des Game-Boy-Emulators (PyBoy), wobei alle Operationen durch CasNum ersetzt werden
- Nur die Datei
opcodes_gen.pymuss minimal angepasst werden - ROMs wie Pokémon Red können ausgeführt werden (der Bootvorgang dauert allerdings etwa 15 Minuten)
- Ab dem zweiten Start läuft es dank Cache mit etwa 0,5 bis 1 FPS
- Nur die Datei
-
Das Verzeichnis
examples/enthält RSA- und Game-Boy-Beispiele -
Über den Visualisierungs-Viewer (
casnum/cas/viewer.py) lässt sich der Konstruktionsprozess in Echtzeit verfolgen
Philosophie und Performance
- Betont einen Entwicklergeist, der statt einer einfachen
a + b-Operation den Prozess zum Finden eines Mittelpunkts über den Schnitt von Geraden und Kreisen direkt implementiert - Enthält den philosophischen Witz: „Wenn man den Schleifenzähler nicht erhöhen kann, ohne eine Gleichung vierten Grades zu lösen, ist es kein echter Inkrement-Schritt“
- Beschreibt die Kosten satirisch mit Zeitkomplexität: Yes / Speicherkomplexität: Also yes
Abhängigkeiten und Lizenz
- Pflichtabhängigkeit:
sympy - Optionale Abhängigkeiten:
pyglet(für die Visualisierung),pytest-lazy-fixtures(für Tests),pycryptodome(für das RSA-Beispiel) - Vertrieb unter der MIT-Lizenz
- Enthaltene Drittanbieter-Komponenten
- PyBoy (modifizierte Version): LGPL v3.0
- 2048.gb-ROM: zlib-Lizenz
- PyBoy wurde für die Verwendung mit CasNum angepasst; das Original ist unter Baekalfen/PyBoy verfügbar
FAQ
- „Kann es Doom ausführen?“ → „Nein, denn es ist eine Zahl“
- „Ist es schnell?“ → „Viel schneller, als eine Kopie von Euklid von Hand abzuschreiben“
- „Warum wurde es gebaut?“ → „Ich wollte Arithmetik mit beliebiger Genauigkeit, aber zugleich auch etwas dabei fühlen“
1 Kommentare
Hacker-News-Kommentare
Der FAQ-artige Witz war extrem nachvollziehbar
Besonders der Teil „Arithmetik mit beliebiger Präzision wollte ich, aber ich wollte auch etwas fühlen“ ist hängen geblieben
Wirklich großartige humorvolle Schreibe und ein tolles Projekt
Der Satz „Was ich geschrieben habe, sollte man unbedingt speichern, bevor man es ausführt“ war zum Totlachen
Ich wollte einfach noch ein bisschen Lob dalassen und hoffe, dass 0x0mer aus dieser Reaktion ein warmes inneres Leuchten mitnimmt
Ich habe erst vor Kurzem durch das Video „Doubling the Cube“ vom Ben-Syversen-Kanal gelernt, wie man mit Zirkel und Lineal rechnet
Danke fürs Posten dieses Projekts
Mich würde interessieren, wie du darauf gestoßen bist
Die Formulierung „100% mehr Euklid“ ist einfach großartig
Man könnte die Implementierung vielleicht sogar nur auf den Zirkel reduzieren
Siehe dazu das Mohr-Mascheroni-Theorem
Mascheroni widmete ihm ein Buch, und von Laplace stammt die Anekdote: „Von ihm hätte ich alles erwartet, nur keinen Geometrieunterricht.“
Verwandter Artikel
Ein interessanter Ansatz für den Umgang mit großen Zahlen, ohne sich nur auf
BigIntzu verlassenMit einer 10^9-Basis könnte man effiziente Operationen mit normalen JavaScript-Zahlen durchführen und zugleich den Speicherverbrauch senken
Mich würde ein Benchmark-Vergleich mit
BigIntje nach Browser-Engine und Node-Version interessierenDie Formulierung „Betrachte das als deine ISA“ ist extrem klar und semiotisch ausgefeilt
Ich frage mich, worin genau die Unterschiede zur reals-Bibliothek liegen
Wirklich eine tolle Idee
Ich frage mich, ob man den kompletten Spielzustand und das ROM auf einer Ebene ablegen und daraus den nächsten Schritt berechnen könnte
Theoretisch müsste das möglich sein, und man könnte es sogar in einer weiter ausgebauten Form als eine ALU-Simulation umsetzen
Allerdings würde dabei wohl ein wenig von der Reinheit verloren gehen
Eine andere Idee wäre, Spielgrafik direkt mit Zirkel und Lineal zu zeichnen
Ein wirklich liebenswertes Projekt