Swiftで易経をコンパイルする:WebAssemblyと古典術数の不思議な出会い
易経の演算エンジンをWebAssemblyにコンパイルするまでの開発プロセスと、その中で「変」について考えたことを記録する。
1. 背景
この記事を書いているとき、窓の外では小雨が降っていた。
ターミナルに表示された carton bundle という行をじっと見つめながら、ふと荒唐無稽な感じがした——三千年前に生まれた占いの学問が、いまWebAssemblyのバイトコードにコンパイルされ、世界中のブラウザで動こうとしている。
なぜこれをやったのか
易経の演算ロジックはそれほど複雑ではない。核心は「蓍草法(しそうほう)」のランダムな分割と陰陽の判断にすぎない。しかし、世に出回っているオンラインの起卦ツールの大半は、純フロントエンドの擬似乱数か、バックエンドのブラックボックスかのどちらかだ。わたしは完全に透明で、監査可能で、ローカルで動作する演算ツールを作りたかった。
WebAssemblyが最適な選択だった。Swiftの強い型安全性と計算精度をブラウザに持ち込みつつ、すべての演算がユーザーのローカルで完結し、ネットワークリクエストが一切不要になる。
核心的な課題:陰陽の数学的表現
易経の陰陽の爻(こう)には四つの状態がある:
| 状態 | 数値 | 意味 |
|---|---|---|
| 老陽 | 9 | 陽の極みで陰に転ずる、変爻 |
| 少陽 | 7 | 陽の爻、不変 |
| 老陰 | 6 | 陰の極みで陽に転ずる、変爻 |
| 少陰 | 8 | 陰の爻、不変 |
蓍草法の鍵となるのは三回の分割操作で、各操作の余りが爻の状態を決定づける。このロジックはSwiftで書くと非常にすっきりする:
func yarrowStalkOperation(_ stalks: UInt32) -> UInt32 {
let left = stalks / 2
let right = stalks - left
let remainderLeft = left % 4 == 0 ? 4 : left % 4
let remainderRight = right % 4 == 0 ? 4 : right % 4
return remainderLeft + remainderRight + 1
}
三回の操作の結果を合計すると、6・7・8・9のいずれかになり、四つの爻の状態に対応する。
「変」について
このコードをデバッグしながら、わたしはずっと一つの問いを考えていた。易経の核心は「変」であり、プログラムの核心は「決定性」である。
この二つは矛盾しない。蓍草法のランダム性は最初のランダムな分割に由来し、演算プロセス自体は完全に決定的だ。それは量子力学のようなもの——測定の前は重ね合わせの状態であり、測定の後に確定値へと収縮する。
もしかすると、これこそが古人の知恵なのかもしれない:ランダム性の存在を認めつつ、ランダム性の先にある規則性を探し求める。
ツールはすでに公開されており、上部の「周易起卦」エントリから体験できる。実装の詳細に興味があれば、引き続き注目してほしい。