ハクソク

世界を動かす技術を、日本語で。

CasNumの翻訳は「CasNum」となります。これは特定の用語や製品名であるため、そのまま表記します。

概要

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.git
    • cd CasNum
    • pip install -r requirements.txt
  • サンプル実行
    • python3 -m examples.basic
    • python3 -m examples.rsa
  • 作図ビューア(casnum/cas/viewer.py)で自動ズーム機能付き
    • rsa例では手動ズーム推奨
  • PyBoyでROM起動例
    • 2048.gb(zlibライセンス)を同梱
    • cd examples/PyBoy
    • pip install -r requirements.txt
    • PYTHONPATH=../.. python
    • Python対話環境で以下を実行
      • from pyboy import PyBoy
      • from casnum import viewer
      • viewer.start()
      • pyboy = PyBoy('2048.gb')
      • while pyboy.tick(): pass
      • pyboy.stop()
    • 初回起動は15分程度かかるが、2回目以降はキャッシュで0.5~1FPS程度

開発哲学

  • 現代の開発者はa+bで満足しがち
  • CasNumは「4次方程式を解いてループカウンタをインクリメントする」体験を提供
  • 作図の本質的な美しさ手間を楽しむ開発者向け

パフォーマンス・依存関係

  • lru_cacheによる計算結果の徹底キャッシュ
  • メモリ消費増大のリスクあり、自己責任で利用
  • 時間計算量・空間計算量ともに「Yes」とユーモラスに表現
  • 主な依存パッケージ
    • sympy
    • pyglet(作図表示用、推奨)
    • 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.gbzlibライセンスのGame Boy ROM
  • 免責事項:本ソフトウェアは「現状のまま」提供、いかなる損害も作者は責任を負わない

Hackerたちの意見

投稿ありがとう!すごく嬉しいよ!どうやって見つけたのか知りたいな :)
> CasNum(コンパスと定規の数)は、コンパスと定規の構成を使って任意精度の算術を実装するライブラリです。任意精度の算術、今ならユクリッドが100%増量中!すべてのALUオペコードが幾何学的構成を通じて完全に実装された機能的な改良版ゲームボーイエミュレーターを搭載。すごいね :D
F.A.Q Q: でも、DOOMは動くの? A: 実際には「動かす」ことはできないよ、ただの数だから。 Q: 速いの? A: 「速い」って何を指してるの?手でユクリッドを写すより速いって意味なら、確かに劇的に速いよ。 Q: なんでこれを作ったの? A: 任意精度の算術が欲しかったけど、何かを感じたかったんだ。共感できるな、特に3番目の質問には。
ハハ、ありがとう!そう言ってもらえて嬉しいよ!
ここで何が起こってるのか全然わからない…
https://en.wikipedia.org/wiki/Constructible_number
いいね!数ヶ月前にBen Syversenのチャンネルのこの動画で立方体を二倍にする計算を知ったよ。https://www.youtube.com/watch?v=96LbF8nn05c
最近見た中で一番クールなことだ!よくやった!
ありがとう! :)
5次方程式を解こうとしたけど、うまくいかなかった :(
残念ながら、この機能リクエストはアベル・ルフィニによって却下されちゃった :(
これ、めっちゃいいね!!ゲーム全体の状態とROMを同時に平面に含めて、次のステップを計算するのってどれくらい難しいんだろう?
いい質問だね :) 自分もこれについて考えてたんだけど、可能な気がするし、やり方もいくつかアイデアがあるよ。全GBをコンパスと定規でエミュレートできたらクールだけど、逆に言うと、ALUをシミュレートするよりも「純粋」さが欠けてて、ちょっと「強引」になるかもね。自分が考えたアイデアの一つは、コンパスと定規を使ってゲームのグラフィックを描くことなんだ(つまり、円や線を使ってGBのグラフィックをおおよそ描くって感じ)。
それは素敵だね。
これが https://github.com/rubenvannieuwpoort/reals とどう比較されるのか、すごく気になる。
素晴らしいコメディーの文章(もちろんプロジェクトもね)。大爆笑しちゃったよ。自分の「一番共感できる」引用をこのスレッドに追加したいな: > いつも通り、私が書いたものを実行する前に大事な作業は保存しておいてね。 :') でも本当に、このスレッドの感謝の声に加わりたいだけなんだ :) 0x0mer、みんなの反応から愛を感じて、これから何年もその温かい気持ちに浸れるといいな。