CasNum - Bibliothèque d’arithmétique à précision arbitraire avec compas et règle
(github.com/0x0mer)- Bibliothèque Python implémentant l’arithmétique à précision arbitraire sur la base des constructions au compas et à la règle, en effectuant toutes les opérations via des constructions géométriques
- Représente chaque nombre comme un point du plan, et implémente addition, multiplication et opérations logiques uniquement à l’aide de règles de construction
- Remplace l’ALU interne de l’émulateur Game Boy (PyBoy) par CasNum, ce qui permet d’exécuter des jeux en s’appuyant uniquement sur des opérations géométriques
- Inclut des exemples RSA et d’intégration Game Boy, et permet d’observer le processus de construction en temps réel via le viewer de visualisation
- Publié sous licence MIT, avec PyBoy (LGPL v3) et 2048.gb (licence zlib) modifiés et inclus
Aperçu de CasNum
-
CasNum est une bibliothèque Python qui effectue de l’arithmétique à précision arbitraire à l’aide des constructions au compas et à la règle (compass and straightedge)
- Chaque nombre
xest représenté par le point(x, 0)dans le plan - L’addition est implémentée en trouvant le milieu de deux points puis en l’étendant par un facteur deux
- La multiplication et la division sont construites à l’aide du principe de similitude des triangles
- Les opérations logiques (AND, OR, XOR) sont également implémentées géométriquement
- Chaque nombre
-
Le moteur de construction de base se trouve dans le répertoire
cas/et prend en charge les cinq constructions fondamentales suivantes- Une droite passant par deux points
- Un cercle centré sur un point et passant par un autre
- L’intersection de deux droites
- L’intersection d’une droite et d’un cercle
- L’intersection de deux cercles
-
À partir de ces opérations de construction, la classe CasNum est définie et effectue géométriquement toutes les opérations arithmétiques et logiques
Principales fonctionnalités et optimisations
- Les multiplications, divisions et opérations modulo sont implémentées à l’aide de la similitude des triangles et de relations géométriques
- Certaines opérations (par ex. multiplication par 2) peuvent être effectuées plus efficacement qu’avec un algorithme général
- Utilise le
lru_cachede Python pour mettre en cache les résultats des opérations, ce qui améliore les performances lors des réutilisations - En contrepartie, ce cache peut augmenter fortement l’usage mémoire, ce qui demande de l’attention
Exemples d’utilisation
-
Implémentation d’un programme de chiffrement RSA
-
Intégration dans l’ALU de l’émulateur Game Boy (PyBoy) pour remplacer toutes les opérations par CasNum
- Seul le fichier
opcodes_gen.pyest modifié au minimum - Exécution possible de ROM comme Pokémon Red (avec un démarrage d’environ 15 minutes)
- À partir du deuxième lancement, fonctionnement à environ 0,5 à 1 FPS grâce au cache
- Seul le fichier
-
Le répertoire
examples/inclut des exemples RSA et Game Boy -
Le viewer de visualisation (
casnum/cas/viewer.py) permet de suivre en temps réel le processus de construction
Philosophie et performances
- Met en avant un esprit de développement qui consiste, au lieu d’une simple opération
a + b, à implémenter directement le processus de recherche du milieu par intersection de droites et de cercles - Inclut l’humour philosophique suivant : « Si on ne peut pas incrémenter un compteur de boucle sans résoudre une équation du quatrième degré, alors ce n’est pas une vraie incrémentation »
- L’expression complexité temporelle : Yes / complexité spatiale : Also yes tourne en dérision le coût de calcul extrêmement élevé
Dépendances et licence
- Dépendance requise :
sympy - Dépendances optionnelles :
pyglet(visualisation),pytest-lazy-fixtures(tests),pycryptodome(exemple RSA) - Distribué sous licence MIT
- Composants tiers inclus
- PyBoy (version modifiée) : LGPL v3.0
- ROM 2048.gb : licence zlib
- PyBoy a été modifié pour utiliser CasNum, et la version d’origine est disponible sur Baekalfen/PyBoy
FAQ
- « Peut-on faire tourner Doom ? » → « Non, car ce n’est pas un nombre »
- « Est-ce rapide ? » → « Bien plus rapide que recopier un exemplaire d’Euclide à la main »
- « Pourquoi l’avoir créé ? » → « Je voulais de l’arithmétique à précision arbitraire, mais je voulais aussi ressentir quelque chose »
1 commentaires
Commentaires sur Hacker News
La blague au format FAQ est vraiment très parlante
En particulier le passage « je voulais de l’arithmétique à précision arbitraire, mais je voulais aussi ressentir des émotions » m’a marqué
C’était un projet et une écriture comique vraiment excellents
La phrase « sauvegardez absolument ce que j’ai écrit avant de l’exécuter » m’a fait mourir de rire
Je voulais simplement ajouter un compliment de plus, et j’espère que 0x0mer ressentira une chaleureuse lumière intérieure grâce à cette réaction
J’ai appris récemment pour la première fois comment calculer avec un compas et une règle en regardant la vidéo « doubler le cube » de la chaîne de Ben Syversen
Merci d’avoir partagé ce projet
Je me demande comment tu l’as découvert
L’expression « 100% more Euclid » est vraiment géniale
On pourrait sans doute simplifier l’implémentation avec le compas seul
Il suffit de se référer au théorème de Mohr–Mascheroni
Mascheroni lui a dédié un livre, et il existe une anecdote selon laquelle Laplace aurait dit : « j’attendais tout de lui, sauf des leçons de géométrie »
Article connexe
C’est une approche intéressante pour manipuler de grands nombres sans dépendre uniquement de
BigIntL’usage d’une base 10^9 permet d’effectuer des opérations efficacement avec des nombres JavaScript ordinaires, tout en réduisant l’utilisation mémoire
Je serais curieux de voir une comparaison de benchmarks avec
BigIntselon les moteurs de navigateur et les versions de NodeLa formule « pensez-y comme à votre ISA » est d’une clarté remarquable et sémiotiquement raffinée
Je me demande quelles seraient les différences par rapport à la bibliothèque reals
C’est une idée vraiment géniale
Je me demande s’il serait possible de placer tout l’état du jeu et la ROM sur le plan, puis de calculer l’étape suivante à partir de cet état
En théorie, cela semble possible, et on pourrait même l’implémenter sous une forme plus poussée qu’une simulation d’ALU
Mais dans ce cas, cela réduirait peut-être un peu la pureté de l’ensemble
Une autre idée serait d’essayer de dessiner directement les graphismes du jeu avec un compas et une règle
C’est un projet vraiment adorable