概要
CasNum は、コンパスと定規による作図で任意精度演算を実現する Pythonライブラリ。 Game Boyエミュレータ のALUを幾何学的手法のみで再現した点が特徴。 RSA暗号 やエミュレータ統合など、ユニークな用途にも対応。 パフォーマンス最適化 やキャッシュ活用にも工夫あり。 MITライセンス および一部LGPL/zlibライセンス素材を利用。
CasNum(Compass and straightedge Number)概要
- CasNum は、 コンパスと定規 による作図のみで任意精度演算を実装した Pythonライブラリ
- Game Boyエミュレータ のALU(算術論理演算装置)で、全ての演算を幾何学的構成で再現
- RSA暗号 や Pokémon Red 実行など、実用例も収録
- 最適化 や キャッシュ によるパフォーマンス向上策を実装
- MITライセンス で公開、一部LGPL・zlibライセンス素材を含む
コンパスと定規による作図入門
- CasNum のコアは、ディレクトリ cas/ 配下の 作図エンジン
- 原点 と 単位点 の2点から始め、以下の基本作図をサポート
- 2点を通る 直線の作図
- 1点を中心・別の点を通る 円の作図
- 2直線の交点の作図
- 直線と円の交点(最大2点)の作図
- 2円の交点(最大2点)の作図
- 特に2円の交点は 4次方程式 となり、 circle.py に詳細な数式を実装
- これら5つの作図が、 コンパスと定規作図の基本命令(ISA)
CasNumクラスと数値表現
- CasNum クラスでは、数値xを 平面上の点(x,0) として表現
- 加算 は2点の中点を求めて2倍する作図で実装
- 乗算・除算 は三角形の相似性を利用して構成
- 論理演算(AND, OR, XOR) も幾何学的な手法で実装(やや複雑だが動作)
- 最適化例
- 2倍演算は汎用の乗算アルゴリズムより高速に作図可能
- 剰余演算(mod)は、最大の2のべき乗×法を除去することで効率化
主な用途例
- RSA暗号プログラム の実装
- Game Boyエミュレータ のALUへ統合
- その他独創的な応用例の可能性
- 上記2例は examples/ ディレクトリに実装済み
- 円積問題 は不可能だが、 Pokémon Red は動作可能というユーモア
Game Boyエミュレータとの統合
- PyBoy のコードにCasNumを統合
- 編集箇所は opcodes_gen.py のみ、最小限の改変
- Pokémon Red 等のROMを実際に幾何学演算で起動可能
実行方法・サンプル
- リポジトリのクローンと依存関係のインストール
git clone --recursive git@github.com:0x0mer/CasNum.gitcd CasNumpip install -r requirements.txt
- サンプル実行
python3 -m examples.basicpython3 -m examples.rsa
- 作図ビューア (casnum/cas/viewer.py)で自動ズーム機能付き
- rsa例では手動ズーム推奨
- PyBoyでROM起動例
- 2048.gb(zlibライセンス)を同梱
cd examples/PyBoypip install -r requirements.txtPYTHONPATH=../.. python- Python対話環境で以下を実行
from pyboy import PyBoyfrom casnum import viewerviewer.start()pyboy = PyBoy('2048.gb')while pyboy.tick(): passpyboy.stop()
- 初回起動は15分程度かかる が、2回目以降はキャッシュで0.5~1FPS程度
開発哲学
- 現代の開発者 はa+bで満足しがち
- CasNum は「4次方程式を解いてループカウンタをインクリメントする」体験を提供
- 作図の本質的な美しさ と 手間 を楽しむ開発者向け
パフォーマンス・依存関係
- lru_cache による計算結果の徹底キャッシュ
- メモリ消費増大 のリスクあり、自己責任で利用
- 時間計算量・空間計算量 ともに「Yes」とユーモラスに表現
- 主な依存パッケージ
sympypyglet(作図表示用、推奨)pytest-lazy-fixtures(テスト用)pycryptodome(RSA例用)- Euclid Postulate V (オプション)
F.A.Q(よくある質問)
- Q: DOOMは動く?
- A: 数値ライブラリ なので「動かない」
- Q: 速い?
- A: ユークリッド手書き よりは「劇的に速い」
- Q: なぜ作った?
- A: 任意精度演算 が欲しかったし、「何かを感じたかった」から
ライセンス・サードパーティ素材
- MITライセンス (リポジトリ直下のコード)
- サードパーティ素材
- PyBoy(改変版) :
./examples/PyBoy/、 LGPL v3.0、CasNum対応のため改変- オリジナル:https://github.com/Baekalfen/PyBoy
- ライセンス全文:
./examples/PyBoy/License.md
- 2048.gb : zlibライセンス のGame Boy ROM
- PyBoy(改変版) :
- 免責事項 :本ソフトウェアは「現状のまま」提供、いかなる損害も作者は責任を負わない