# CasNum - 컴퍼스와 자를 이용한 임의 정밀도 산술 라이브러리

> Clean Markdown view of GeekNews topic #27314. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=27314](https://news.hada.io/topic?id=27314)
- GeekNews Markdown: [https://news.hada.io/topic/27314.md](https://news.hada.io/topic/27314.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-03-09T00:34:00+09:00
- Updated: 2026-03-09T00:34:00+09:00
- Original source: [github.com/0x0mer](https://github.com/0x0mer/CasNum)
- Points: 2
- Comments: 1

## Topic Body

- **컴퍼스와 자 작도법**을 기반으로 임의 정밀도 산술을 구현한 **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](https://github.com/Baekalfen/PyBoy)에서 확인 가능  

### FAQ
- “Doom을 실행할 수 있나?” → “숫자이므로 실행할 수 없음”  
- “빠른가?” → “유클리드 사본을 손으로 베끼는 것보다는 훨씬 빠름”  
- “왜 만들었나?” → “임의 정밀도 산술을 원했지만, 동시에 **무언가를 느끼고 싶었음**”

## Comments



### Comment 52624

- Author: neo
- Created: 2026-03-09T00:34:00+09:00
- Points: 1

###### [Hacker News 의견들](https://news.ycombinator.com/item?id=47291292) 
- FAQ 형식의 농담이 너무 공감됨  
  특히 “**임의 정밀도 산술**을 원했지만, 감정도 느끼고 싶었다”는 부분이 인상적이었음  
  - 고마움! 그렇게 느껴줘서 정말 기쁨임  

- 정말 훌륭한 **코믹한 글쓰기**와 프로젝트였음  
  “내가 쓴 건 실행하기 전에 꼭 저장하라”는 문장이 너무 웃겼음  
  단순히 칭찬을 더하고 싶었고, 0x0mer가 이 반응에서 따뜻한 **내적 빛**을 느꼈으면 함  
  - 고마움! 나도 그 따뜻한 기운을 확실히 느끼고 있음  

- 최근 Ben Syversen 채널의 [‘큐브 두 배 만들기’ 영상](https://www.youtube.com/watch?v=96LbF8nn05c)을 보고 **컴퍼스와 자로 계산하는 법**을 처음 배웠음  

- 이 프로젝트를 올려줘서 고마움  
  어떻게 이걸 발견했는지 궁금함  
  - CasNum은 **컴퍼스와 자로 구현한 임의 정밀도 산술 라이브러리**임  
    “100% 더 많은 Euclid”라는 표현이 너무 멋짐  

- 구현을 **컴퍼스만으로 단순화**할 수도 있을 것 같음  
  [Mohr–Mascheroni 정리](https://en.wikipedia.org/wiki/Mohr%E2%80%93Mascheroni_theorem)를 참고하면 됨  
  - 나폴레옹도 이런 주제에 관심이 많았다고 함  
    Mascheroni가 그에게 책을 헌정했고, Laplace가 “그에게서 모든 걸 기대했지만, 기하학 수업은 아니었다”고 말했다는 일화가 있음  
    [관련 글](https://perso.ens-lyon.fr/ghys/2021/05/17/1952/)  

- `BigInt`에만 의존하지 않고 큰 수를 다루는 흥미로운 접근임  
  **10^9 기반**을 사용해 일반 JavaScript 숫자로 효율적인 연산을 수행하고, 메모리 사용량도 줄일 수 있음  
  브라우저 엔진과 Node 버전별로 `BigInt`와의 **벤치마크 비교**가 궁금함  

- “이걸 당신의 ISA라고 생각하라”는 표현이 너무 명확하고 **기호학적으로 정교함**  

- [reals 라이브러리](https://github.com/rubenvannieuwpoort/reals)와 비교했을 때 어떤 차이가 있을지 궁금함  
  - CasNum은 성능 면에서는 **그리 빠르지 않을 것** 같음  

- 정말 멋진 아이디어임  
  전체 게임 상태와 ROM을 평면 위에 올려두고, 그 상태에서 다음 단계를 계산하게 할 수 있을까 궁금함  
  - 나도 그 생각을 해봤음  
    이론적으로 가능할 것 같고, **ALU 시뮬레이션**보다 더 확장된 형태로 구현할 수도 있음  
    다만 그렇게 하면 순수함이 조금 줄어들 것 같음  
    또 다른 아이디어로는, 컴퍼스와 자로 **게임 그래픽을 직접 그려보는 시도**도 있음  

- 정말 사랑스러운 프로젝트임  
  - 고마움!
