CasNum - 컴퍼스와 자를 이용한 임의 정밀도 산술 라이브러리
(github.com/0x0mer)- 컴퍼스와 자 작도법을 기반으로 임의 정밀도 산술을 구현한 Python 라이브러리로, 모든 연산을 기하학적 구성으로 수행함
- 각 수를 평면상의 점으로 표현하고, 덧셈·곱셈·논리 연산을 모두 작도 규칙으로 구현
- Game Boy 에뮬레이터(PyBoy) 내부의 ALU를 CasNum으로 대체해, 기하학적 연산만으로 게임을 실행할 수 있음
- RSA 예제와 Game Boy 통합 예제가 포함되어 있으며, 시각화 뷰어(viewer) 를 통해 작도 과정을 실시간으로 볼 수 있음
- MIT 라이선스로 공개되어 있으며, PyBoy(LGPL v3)와 2048.gb(zlib 라이선스)를 수정·포함함
CasNum 개요
-
CasNum은 컴퍼스와 자 작도법(compass and straightedge) 을 이용해 임의 정밀도 산술을 수행하는 Python 라이브러리
- 각 수
x는 평면상의 점(x, 0)으로 표현 - 덧셈은 두 점의 중점을 찾고 이를 두 배로 확장하는 방식으로 구현
- 곱셈과 나눗셈은 삼각형의 닮음 원리를 이용해 구성
- 논리 연산(AND, OR, XOR)도 기하학적으로 구현되어 있음
- 각 수
-
기본 작도 엔진은
cas/디렉터리에 있으며, 다음 다섯 가지 기본 작도를 지원- 두 점을 지나는 직선
- 한 점을 중심으로 다른 점을 지나는 원
- 두 직선의 교점
- 직선과 원의 교점
- 두 원의 교점
-
이러한 작도 연산을 기반으로 CasNum 클래스가 정의되어 있으며, 산술 및 논리 연산을 모두 기하학적으로 수행
주요 기능 및 최적화
- 곱셈, 나눗셈, 모듈로 연산 등은 삼각형 닮음과 기하학적 관계를 이용해 구현
- 특정 연산(예: 2배 곱셈)은 일반 알고리듬보다 효율적으로 수행 가능
-
Python의
lru_cache를 사용해 연산 결과를 캐시, 재사용 시 속도 향상 - 캐시로 인해 메모리 사용량이 크게 증가할 수 있음, 주의 필요
활용 예시
-
RSA 암호화 프로그램 구현
-
Game Boy 에뮬레이터(PyBoy) 의 ALU에 통합하여, 모든 연산을 CasNum으로 대체
-
opcodes_gen.py파일만 최소한으로 수정 - Pokémon Red 등 ROM을 실행 가능 (단, 부팅에 약 15분 소요)
- 두 번째 실행부터는 캐시 덕분에 약 0.5~1 FPS로 동작
-
-
examples/디렉터리에 RSA 및 Game Boy 예제 포함 -
시각화 뷰어(
casnum/cas/viewer.py) 를 통해 작도 과정을 실시간으로 확인 가능
철학과 성능
- 단순한
a + b연산 대신, 직선과 원의 교차로 중점을 구하는 과정을 직접 구현하는 개발자 정신을 강조 - “4차 방정식을 풀지 않고는 루프 카운터를 증가시킬 수 없다면, 진정한 증분이 아니다”라는 철학적 유머 포함
- 시간 복잡도: Yes / 공간 복잡도: Also yes라는 표현으로, 계산 비용이 매우 큼을 풍자적으로 표현
의존성과 라이선스
- 필수 의존성:
sympy - 선택적 의존성:
pyglet(시각화용),pytest-lazy-fixtures(테스트용),pycryptodome(RSA 예제용) - MIT 라이선스로 배포
- 포함된 서드파티 구성요소
- PyBoy (수정 버전): LGPL v3.0
- 2048.gb ROM: zlib 라이선스
- PyBoy는 CasNum을 사용하도록 수정되었으며, 원본은 Baekalfen/PyBoy에서 확인 가능
FAQ
- “Doom을 실행할 수 있나?” → “숫자이므로 실행할 수 없음”
- “빠른가?” → “유클리드 사본을 손으로 베끼는 것보다는 훨씬 빠름”
- “왜 만들었나?” → “임의 정밀도 산술을 원했지만, 동시에 무언가를 느끼고 싶었음”
Hacker News 의견들
-
FAQ 형식의 농담이 너무 공감됨
특히 “임의 정밀도 산술을 원했지만, 감정도 느끼고 싶었다”는 부분이 인상적이었음- 고마움! 그렇게 느껴줘서 정말 기쁨임
-
정말 훌륭한 코믹한 글쓰기와 프로젝트였음
“내가 쓴 건 실행하기 전에 꼭 저장하라”는 문장이 너무 웃겼음
단순히 칭찬을 더하고 싶었고, 0x0mer가 이 반응에서 따뜻한 내적 빛을 느꼈으면 함- 고마움! 나도 그 따뜻한 기운을 확실히 느끼고 있음
-
최근 Ben Syversen 채널의 ‘큐브 두 배 만들기’ 영상을 보고 컴퍼스와 자로 계산하는 법을 처음 배웠음
-
이 프로젝트를 올려줘서 고마움
어떻게 이걸 발견했는지 궁금함- CasNum은 컴퍼스와 자로 구현한 임의 정밀도 산술 라이브러리임
“100% 더 많은 Euclid”라는 표현이 너무 멋짐
- CasNum은 컴퍼스와 자로 구현한 임의 정밀도 산술 라이브러리임
-
구현을 컴퍼스만으로 단순화할 수도 있을 것 같음
Mohr–Mascheroni 정리를 참고하면 됨- 나폴레옹도 이런 주제에 관심이 많았다고 함
Mascheroni가 그에게 책을 헌정했고, Laplace가 “그에게서 모든 걸 기대했지만, 기하학 수업은 아니었다”고 말했다는 일화가 있음
관련 글
- 나폴레옹도 이런 주제에 관심이 많았다고 함
-
BigInt에만 의존하지 않고 큰 수를 다루는 흥미로운 접근임
10^9 기반을 사용해 일반 JavaScript 숫자로 효율적인 연산을 수행하고, 메모리 사용량도 줄일 수 있음
브라우저 엔진과 Node 버전별로BigInt와의 벤치마크 비교가 궁금함 -
“이걸 당신의 ISA라고 생각하라”는 표현이 너무 명확하고 기호학적으로 정교함
-
reals 라이브러리와 비교했을 때 어떤 차이가 있을지 궁금함
- CasNum은 성능 면에서는 그리 빠르지 않을 것 같음
-
정말 멋진 아이디어임
전체 게임 상태와 ROM을 평면 위에 올려두고, 그 상태에서 다음 단계를 계산하게 할 수 있을까 궁금함- 나도 그 생각을 해봤음
이론적으로 가능할 것 같고, ALU 시뮬레이션보다 더 확장된 형태로 구현할 수도 있음
다만 그렇게 하면 순수함이 조금 줄어들 것 같음
또 다른 아이디어로는, 컴퍼스와 자로 게임 그래픽을 직접 그려보는 시도도 있음
- 나도 그 생각을 해봤음
-
정말 사랑스러운 프로젝트임
- 고마움!