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)として表現 - 加算は2点の中点を求め、それを2倍に拡張する方式で実装
- 乗算と除算は三角形の相似の原理を利用して構成
- 論理演算(AND, OR, XOR)も幾何学的に実装
- 各数
-
基本作図エンジンは
cas/ディレクトリにあり、次の5種類の基本作図をサポート- 2点を通る直線
- ある点を中心として別の点を通る円
- 2直線の交点
- 直線と円の交点
- 2つの円の交点
-
これらの作図演算を基盤としてCasNumクラスが定義されており、算術演算と論理演算をすべて幾何学的に実行
主な機能と最適化
- 乗算、除算、モジュロ演算などは三角形の相似と幾何学的関係を使って実装
- 特定の演算(例: 2倍乗算)は一般的なアルゴリズムより効率的に実行可能
- Pythonの
lru_cacheを使って演算結果をキャッシュし、再利用時の速度を向上 - キャッシュによりメモリ使用量が大きく増加する可能性があるため注意が必要
活用例
-
RSA暗号化プログラムの実装
-
Game Boyエミュレータ(PyBoy) のALUに統合し、すべての演算をCasNumに置き換え
opcodes_gen.pyファイルのみを最小限に修正- Pokémon RedなどのROMを実行可能(ただし起動に約15分必要)
- 2回目の実行からはキャッシュのおかげで約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を実行できるか?」 → 「数値なので実行できない」
- 「速いか?」 → 「ユークリッドの写本を手で書き写すよりはずっと速い」
- 「なぜ作ったのか?」 → 「任意精度算術が欲しかったが、同時に何かを感じたかった」
1件のコメント
Hacker Newsのコメント
FAQ形式のジョークがすごく共感できた
特に「任意精度演算が欲しかったが、感情も感じたかった」という部分が印象的だった
本当に素晴らしいユーモラスな文章とプロジェクトだった
「私が書いたものは実行する前に必ず保存しろ」という一文が最高に面白かった
ただ称賛を付け加えたかっただけで、0x0merがこの反応から温かな内なる光を感じてくれたらいいなと思う
最近、Ben Syversenのチャンネルの「立方体を2倍にする」動画を見て、コンパスと定規で計算する方法を初めて知った
このプロジェクトを投稿してくれてありがとう
どうやってこれを見つけたのか気になる
「Euclidが100%増量」という表現がとてもいい
実装はコンパスだけに単純化することもできそうだ
Mohr–Mascheroniの定理を参照するとよい
Mascheroniは彼に本を献呈し、Laplaceが「彼には何でも期待していたが、幾何学の授業だけは違った」と語ったという逸話がある
関連記事
BigIntだけに依存せずに大きな数を扱う興味深いアプローチだ10^9ベースを使うことで、通常のJavaScriptの数値で効率よく演算でき、メモリ使用量も抑えられる
ブラウザエンジンやNodeのバージョンごとに、
BigIntとのベンチマーク比較が気になる「これをあなたのISAだと思ってほしい」という表現がとても明快で、記号論的にも洗練されている
realsライブラリと比べるとどんな違いがあるのか気になる
本当に素晴らしいアイデアだ
ゲーム全体の状態とROMを平面上に載せて、その状態から次のステップを計算させられるだろうかと気になった
理論上は可能そうで、ALUシミュレーションよりさらに拡張した形で実装することもできるかもしれない
ただ、そうすると純粋さが少し損なわれそうだ
もうひとつのアイデアとして、コンパスと定規でゲームグラフィックスを直接描いてみる試みもある
本当に愛らしいプロジェクトだ