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

2 weeks ago 10

  • 컴퍼스와 자 작도법을 기반으로 임의 정밀도 산술을 구현한 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을 실행할 수 있나?” → “숫자이므로 실행할 수 없음”
  • “빠른가?” → “유클리드 사본을 손으로 베끼는 것보다는 훨씬 빠름”
  • “왜 만들었나?” → “임의 정밀도 산술을 원했지만, 동시에 무언가를 느끼고 싶었음

Read Entire Article