← 記事 個人開発 · ケーススタディ

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のいずれかになり、四つの爻の状態に対応する。

「変」について

このコードをデバッグしながら、わたしはずっと一つの問いを考えていた。易経の核心は「変」であり、プログラムの核心は「決定性」である。

この二つは矛盾しない。蓍草法のランダム性は最初のランダムな分割に由来し、演算プロセス自体は完全に決定的だ。それは量子力学のようなもの——測定の前は重ね合わせの状態であり、測定の後に確定値へと収縮する。

もしかすると、これこそが古人の知恵なのかもしれない:ランダム性の存在を認めつつ、ランダム性の先にある規則性を探し求める。


ツールはすでに公開されており、上部の「周易起卦」エントリから体験できる。実装の詳細に興味があれば、引き続き注目してほしい。