CasNum - biblioteca de aritmética de precisão arbitrária usando compasso e régua
(github.com/0x0mer)- Uma biblioteca Python que implementa aritmética de precisão arbitrária com base em construções com compasso e régua, realizando todas as operações por meio de construções geométricas
- Cada número é representado como um ponto no plano, e adição, multiplicação e operações lógicas são todas implementadas por regras de construção
- É possível substituir a ALU interna do emulador de Game Boy (PyBoy) pelo CasNum, permitindo executar jogos usando apenas operações geométricas
- Inclui exemplos com RSA e integração com Game Boy, e é possível ver o processo de construção em tempo real por meio do visualizador (viewer)
- Disponibilizado sob a licença MIT, e modifica/inclui o PyBoy (LGPL v3) e o 2048.gb (licença zlib)
Visão geral do CasNum
-
CasNum é uma biblioteca Python que realiza aritmética de precisão arbitrária usando construções com compasso e régua (compass and straightedge)
- Cada número
xé representado como o ponto(x, 0)no plano - A adição é implementada encontrando o ponto médio entre dois pontos e expandindo-o ao dobro
- Multiplicação e divisão são construídas usando o princípio da semelhança de triângulos
- Operações lógicas (AND, OR, XOR) também são implementadas geometricamente
- Cada número
-
O mecanismo básico de construção fica no diretório
cas/e oferece suporte às cinco construções básicas a seguir- reta que passa por dois pontos
- círculo com centro em um ponto e passando por outro
- interseção de duas retas
- interseção entre reta e círculo
- interseção entre dois círculos
-
Com base nessas operações de construção, a classe CasNum é definida e executa geometricamente tanto operações aritméticas quanto lógicas
Principais recursos e otimizações
- Multiplicação, divisão e operação de módulo são implementadas usando semelhança de triângulos e relações geométricas
- Algumas operações específicas (por exemplo, multiplicação por 2) podem ser executadas com mais eficiência do que no algoritmo geral
- Usa o
lru_cachedo Python para armazenar em cache os resultados das operações, melhorando a velocidade em reutilizações - Devido ao cache, o uso de memória pode aumentar bastante, exigindo atenção
Exemplos de uso
-
Implementação de um programa de criptografia RSA
-
Integração com a ALU do emulador de Game Boy (PyBoy), substituindo todas as operações pelo CasNum
- Apenas o arquivo
opcodes_gen.pyfoi modificado minimamente - É possível executar ROMs como Pokémon Red (embora a inicialização leve cerca de 15 minutos)
- A partir da segunda execução, graças ao cache, roda a cerca de 0,5~1 FPS
- Apenas o arquivo
-
O diretório
examples/inclui exemplos de RSA e Game Boy -
É possível acompanhar o processo de construção em tempo real por meio do visualizador (
casnum/cas/viewer.py)
Filosofia e desempenho
- Em vez de uma operação simples como
a + b, o projeto enfatiza o espírito de implementar diretamente o processo de encontrar o ponto médio pela interseção entre retas e círculos - Inclui o humor filosófico: “Se você não consegue incrementar um contador de loop sem resolver uma equação de quarto grau, então isso não é um incremento de verdade”
- A expressão complexidade de tempo: Yes / complexidade de espaço: Also yes é usada de forma satírica para indicar o altíssimo custo computacional
Dependências e licença
- Dependência obrigatória:
sympy - Dependências opcionais:
pyglet(visualização),pytest-lazy-fixtures(testes),pycryptodome(exemplo de RSA) - Distribuído sob a licença MIT
- Componentes de terceiros incluídos
- PyBoy (versão modificada): LGPL v3.0
- 2048.gb ROM: licença zlib
- O PyBoy foi modificado para usar o CasNum, e o original pode ser encontrado em Baekalfen/PyBoy
FAQ
- “Dá para rodar Doom?” → “Não, porque é um número”
- “É rápido?” → “Muito mais rápido do que copiar à mão um exemplar de Euclides”
- “Por que isso foi feito?” → “Eu queria aritmética de precisão arbitrária, mas ao mesmo tempo queria sentir alguma coisa”
1 comentários
Comentários do Hacker News
A piada em formato de FAQ foi extremamente relacionável
especialmente a parte “eu queria aritmética de precisão arbitrária, mas também queria sentir emoções”
Foi um projeto e uma escrita cômica realmente excelentes
A frase “salve o que escrevi antes de executar” foi hilária
Só queria somar mais elogios e espero que o 0x0mer tenha sentido uma luz interior acolhedora com essa reação
Recentemente vi o vídeo ‘dobrando o cubo’ no canal do Ben Syversen e foi a primeira vez que aprendi como calcular com compasso e régua
Obrigado por postar este projeto
Fiquei curioso sobre como você encontrou isso
A expressão “100% mais Euclides” é muito boa
Parece que também daria para simplificar a implementação usando apenas compasso
Basta consultar o teorema de Mohr–Mascheroni
Mascheroni dedicou o livro a ele, e há a anedota de que Laplace disse: “eu esperava tudo dele, menos aulas de geometria”
Texto relacionado
É uma abordagem interessante para lidar com números grandes sem depender só de
BigIntUsar uma base 10^9 permite fazer operações eficientes com números JavaScript comuns e também reduzir o uso de memória
Fiquei curioso para ver uma comparação de benchmarks com
BigIntem diferentes engines de navegador e versões do NodeA expressão “pense nisso como sua ISA” é muito clara e semioticamente refinada
Fiquei curioso sobre quais seriam as diferenças em comparação com a biblioteca reals
É uma ideia muito legal
Fiquei me perguntando se seria possível colocar todo o estado de um jogo e a ROM em um plano e, a partir desse estado, calcular o próximo passo
Em teoria, parece possível, e talvez até dê para implementar isso de uma forma mais expandida do que uma simulação de ALU
Só que, se fizer isso, parece que perderia um pouco da pureza
Outra ideia seria tentar desenhar os gráficos do jogo diretamente com compasso e régua
Que projeto adorável