CasNum - biblioteca de aritmética de precisión arbitraria usando compás y regla
(github.com/0x0mer)- Biblioteca de Python que implementa aritmética de precisión arbitraria basada en las construcciones con compás y regla, realizando todas las operaciones mediante construcciones geométricas
- Representa cada número como un punto en el plano, e implementa suma, multiplicación y operaciones lógicas completamente mediante reglas de construcción
- Puede reemplazar la ALU interna del emulador de Game Boy (PyBoy) con CasNum, permitiendo ejecutar juegos usando únicamente operaciones geométricas
- Incluye ejemplos de RSA y de integración con Game Boy, y permite ver el proceso de construcción en tiempo real mediante el viewer de visualización
- Publicada bajo licencia MIT, e incluye versiones modificadas de PyBoy (LGPL v3) y 2048.gb (licencia zlib)
Descripción general de CasNum
-
CasNum es una biblioteca de Python que realiza aritmética de precisión arbitraria usando construcciones con compás y regla (compass and straightedge)
- Cada número
xse representa como el punto(x, 0)en el plano - La suma se implementa encontrando el punto medio entre dos puntos y expandiéndolo al doble
- La multiplicación y la división se construyen usando el principio de semejanza de triángulos
- Las operaciones lógicas (AND, OR, XOR) también están implementadas geométricamente
- Cada número
-
El motor base de construcciones está en el directorio
cas/y admite las siguientes cinco construcciones básicas- Recta que pasa por dos puntos
- Circunferencia con centro en un punto y que pasa por otro punto
- Intersección de dos rectas
- Intersección entre una recta y una circunferencia
- Intersección entre dos circunferencias
-
A partir de estas operaciones de construcción se define la clase CasNum, que realiza tanto operaciones aritméticas como lógicas de forma geométrica
Funciones principales y optimización
- Multiplicación, división y operación módulo se implementan usando semejanza de triángulos y relaciones geométricas
- Algunas operaciones específicas (por ejemplo, multiplicar por 2) pueden realizarse de forma más eficiente que con el algoritmo general
- Usa
lru_cachede Python para almacenar en caché los resultados de las operaciones, mejorando la velocidad al reutilizarlos - Debido a la caché, el uso de memoria puede aumentar considerablemente, por lo que hay que tener cuidado
Ejemplos de uso
-
Implementación de un programa de cifrado RSA
-
Integración en la ALU del emulador de Game Boy (PyBoy), reemplazando todas las operaciones por CasNum
- Solo se modifica mínimamente el archivo
opcodes_gen.py - Puede ejecutar ROMs como Pokémon Red (aunque el arranque tarda unos 15 minutos)
- Desde la segunda ejecución, gracias a la caché, funciona a aproximadamente 0.5~1 FPS
- Solo se modifica mínimamente el archivo
-
El directorio
examples/incluye ejemplos de RSA y Game Boy -
El viewer de visualización (
casnum/cas/viewer.py) permite observar el proceso de construcción en tiempo real
Filosofía y rendimiento
- En lugar de una simple operación
a + b, enfatiza el espíritu de desarrollo de implementar directamente el proceso de encontrar un punto medio mediante la intersección de rectas y circunferencias - Incluye el humor filosófico: “si no puedes incrementar un contador de bucle sin resolver una ecuación de cuarto grado, entonces no es un incremento de verdad”
- Usa la expresión complejidad temporal: Yes / complejidad espacial: Also yes para satirizar lo costoso que es el cálculo
Dependencias y licencia
- Dependencia obligatoria:
sympy - Dependencias opcionales:
pyglet(para visualización),pytest-lazy-fixtures(para pruebas),pycryptodome(para el ejemplo de RSA) - Distribuida bajo licencia MIT
- Componentes de terceros incluidos
- PyBoy (versión modificada): LGPL v3.0
- 2048.gb ROM: licencia zlib
- PyBoy fue modificado para usar CasNum, y el original puede consultarse en Baekalfen/PyBoy
FAQ
- “¿Puede ejecutar Doom?” → “No, porque es un número”
- “¿Es rápido?” → “Muchísimo más rápido que copiar a mano un ejemplar de Euclides”
- “¿Por qué se hizo?” → “Quería aritmética de precisión arbitraria, pero al mismo tiempo quería sentir algo”
1 comentarios
Comentarios de Hacker News
El chiste en formato FAQ se siente demasiado identificable
En especial, me impactó la parte de “quería aritmética de precisión arbitraria, pero también quería sentir emociones”
Fue un proyecto y una escritura cómica realmente excelentes
La frase “asegúrate de guardar lo que escribí antes de ejecutarlo” me dio muchísima risa
Solo quería sumar más elogios, y ojalá 0x0mer haya sentido una cálida luz interior con esta reacción
Hace poco vi el video de ‘Duplicar el cubo’ del canal de Ben Syversen, y fue la primera vez que aprendí sobre cómo calcular con compás y regla
Gracias por publicar este proyecto
Me da curiosidad cómo lo descubriste
La expresión “100% más Euclides” es buenísima
Parece que también se podría simplificar la implementación usando solo compás
Basta con revisar el teorema de Mohr–Mascheroni
Mascheroni le dedicó un libro, y está la anécdota de que Laplace dijo: “Esperaba todo de él, menos lecciones de geometría”
Artículo relacionado
Es un enfoque interesante para manejar números grandes sin depender solo de
BigIntUsa una base 10^9 para realizar operaciones eficientes con números normales de JavaScript, y también puede reducir el uso de memoria
Me da curiosidad ver una comparación de benchmarks con
BigIntsegún el motor del navegador y la versión de NodeLa frase “piensa en esto como tu ISA” es muy clara y semióticamente refinada
Me pregunto qué diferencias habría en comparación con la librería reals
Es una idea realmente genial
Me pregunto si sería posible poner todo el estado del juego y la ROM sobre el plano, y calcular el siguiente paso a partir de ese estado
En teoría parece posible, e incluso podría implementarse de una forma más amplia que una simulación de ALU
Aunque si se hace así, da la impresión de que se perdería un poco la pureza
Otra idea sería intentar dibujar directamente los gráficos del juego con compás y regla
Es un proyecto realmente encantador