**WebAssembly向けにRustで固有値ソルバーを実装する**

- **目的:** Rust を用いて堅牢な固有値ソルバーを実装し、WebAssembly(WASM)へコンパイルしてブラウザ上で効率的に動作させること。
- **主要手順:**
  1. 数値アルゴリズムの選定または実装(例:QR アルゴリズム、べき乗法など)。
  2. 必要に応じて `no_std` を使用しつつ Rust でコアロジックを記述。
  3. `wasm-pack` または `cargo build --target wasm32-unknown-unknown` を用いて WebAssembly にコンパイル。
  4. JavaScript との相互運用のために `#[wasm_bindgen]` を使って関数をエクスポート。
  5. ブラウザ環境でテストとベンチマークを実施。

2026/01/02 4:31

**WebAssembly向けにRustで固有値ソルバーを実装する** - **目的:** Rust を用いて堅牢な固有値ソルバーを実装し、WebAssembly(WASM)へコンパイルしてブラウザ上で効率的に動作させること。 - **主要手順:** 1. 数値アルゴリズムの選定または実装(例:QR アルゴリズム、べき乗法など)。 2. 必要に応じて `no_std` を使用しつつ Rust でコアロジックを記述。 3. `wasm-pack` または `cargo build --target wasm32-unknown-unknown` を用いて WebAssembly にコンパイル。 4. JavaScript との相互運用のために `#[wasm_bindgen]` を使って関数をエクスポート。 5. ブラウザ環境でテストとベンチマークを実施。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

記事では、著者が完全に手動で作成した固有値ソルバーをRustで構築し、それをWebAssembly(WASM)にコンパイルしてJavaScriptから直接使用できるようにする方法について説明しています。

Matrix
Complex
のカスタム型を作成し、Householder QR分解、Gershgorin円検証、ヘッセンベルグ変換、および完全なQRアルゴリズムなどのコア線形代数ルーチンを実装することで、このライブラリは
wasm-bindgen
以外に外部依存関係を持たず自己完結型となります。Rust の機能(
Option
、パターンマッチング(
let-else
)、デバッグマクロ、単体テスト、および Clippy ライント)を利用してコード品質を維持しています。クレートは
wasm-pack
でパッケージ化され、約84 kBのWASMバイナリとJavaScript バインディングが生成され、著者はそれらを iframe ショートカットを介して Hugo ベースのブログに埋め込んでいます。将来的には、さらに多くの行列型や対話型デモ、Rust フロントエンドフレームワークとの深い統合を追加し、WebAssembly/DOM 互換性の問題にも対処する予定です。この軽量かつ高性能な数値ツールは、ウェブページやアプリケーションに簡単に埋め込むことができ、重い外部ライブラリなしで JavaScript における線形代数タスクに高速な代替手段を開発者にもたらします。

本文

2025年12月31日 – RustでWebAssembly向け固有値ソルバーを実装する

最近、ゲーシュゴリン円定理(Gershgorin Circle Theorem)に出会い、インタラクティブな可視化に最適だと感じました。
しかし私はウェブ開発者ではなく、JavaScriptもあまり好きではありません。そのため、上記のインタラクティブコンポーネントで行われる固有値計算は Rust で書き、WebAssembly にコンパイルし、HTML と JavaScript でラップしています。

免責事項 – 本投稿と Rust コードは私自身が作成したもので、講義ノートや他言語のリファレンス実装を参照しながら書きました。HTML・CSS・JavaScript は LLM が生成しました。すべてのミスは私にあります。


1. ゲーシュゴリン円定理

この定理は、行列の固有値が複素平面上でどこに存在するかを、その行列だけから簡単に推測できることを示します。

(A) を (n \times n) の複素行列とします。
各行 (i) に対して:

  • 中心 (c_i = a_{ii})
  • 半径 (r_i = \sum_{j \neq i} |a_{ij}|)

ゲーシュゴリン円は [ D(c_i,r_i)={z\in\mathbb C : |z-c_i| \le r_i}. ]

ゲーシュゴリン円定理
(A) のすべての固有値は、集合 (\bigcup_{i=1}^n D(c_i,r_i)) 内に入ります。

もし (A) が実対称行列ならば、全固有値は実数であり、円は実軸上の閉区間へと縮約します。


2. 例

[ [ 2 , -1 , 0 ],
  [ 1 ,  1 , 0 ],
  [ 0 ,  0 , 5 ] ]

固有値: ({\frac{3\pm i\sqrt{3}}{2},,5})。
ゲーシュゴリン円: (D(2,1), D(1,1), D(5,0))。

複素共役対は最初の二つの円の境界に位置し、実固有値は 5 における退化円と一致します。

別例 – 4次ハダマード行列:

[ [ 1 , -1 ,  1 , -1 ],
  [ 1 , -1 , -1 ,  1 ],
  [ 1 ,  1 , -1 , -1 ],
  [ 1 ,  1 ,  1 ,  1 ] ]

固有値: ({\pm\sqrt2 \pm i\sqrt2})。


3. QR 固有値アルゴリズム

QR アルゴリズムは、類似変換を QR 分解で反復適用し、収束するまで続けます。

(A_k) が与えられたとき、 [ A_{k+1}=R_k Q_k,\quad A_k=Q_k R_k. ]

この列は、対角成分が固有値となる上三角行列へ収束します。
単純実装では収束が遅く、非対称行列(例えば置換行列)に対して失敗します。


4. Rustでの実装

4.1 複素数

Rust には組み込みの複素型がないため、自前で定義します:

#[wasm_bindgen]
#[derive(PartialEq, Clone, Copy)]
pub struct Complex {
    pub re: f64,
    pub im: f64,
}

加算・減算・乗算・除算・ノルム(

f64::hypot
を用いて数値安定性を確保)などの演算とヘルパー関数を実装します。

4.2 円型

#[wasm_bindgen]
#[derive(PartialEq, Debug)]
pub struct Circle {
    pub centre: Complex,
    pub radius: f64,
}

contains(&self, z: Complex) -> bool
メソッドで点が円内にあるか判定します。

4.3 行列型

行列は row-major 配列で保存します:

#[wasm_bindgen]
#[derive(Clone)]
pub struct Matrix {
    order: usize,
    entries: Vec<Complex>,
}

主なメソッド:

  • new(order, entries)
    – コンストラクタ。
  • get(row, col)
    ,
    set(row, col, val)
  • zero(order)
    ,
    eye(order)
  • 演算は演算子オーバーロード(
    Add
    ,
    Sub
    ,
    Mul
    )で実装。
  • gershgorin_circles()
    Vec<Circle>
    を返す。
  • qr_decomposition()
    は Gram–Schmidt を実装。
  • hessenberg_reduction()
    は Householder 反射を使用。

4.4 シフト付き QR アルゴリズムと減算法

最終的な実装は以下のようになります:

#[wasm_bindgen]
pub fn qr_algorithm(&self, max_iter: u64, tol: f64) -> Vec<Complex> {
    let mut n = self.order;
    let mut eigvals = vec![Complex::zero(); n];
    let mut a_k = self.clone().hessenberg_reduction();

    for _ in 0..max_iter {
        if a_k.get(n-1, n-2).norm() <= tol {
            n -= 1;
            eigvals[n] = a_k.get(n, n);
            a_k = a_k.deflate(n);
        }
        if n == 1 { eigvals[0] = a_k.get(0,0); break; }

        // trailing 2x2 ブロックの固有値
        let (mu_1, mu_2) = {
            let (a,b,c,d) = (
                a_k.get(n-2,n-2),
                a_k.get(n-2,n-1),
                a_k.get(n-1,n-2),
                a_k.get(n-1,n-1)
            );
            let trace = a + d;
            let det   = a*d - b*c;
            let disc  = (trace*trace)/Complex::real(4.0) - det;

            (
                trace/Complex::real(2.0) + disc.sqrt(),
                trace/Complex::real(2.0) - disc.sqrt()
            )
        };

        if n == 2 { eigvals[0] = mu_1; eigvals[1] = mu_2; break; }

        let a_nn = a_k.get(n-1,n-1);
        let s_k = if (mu_1-a_nn).norm() < (mu_2-a_nn).norm() {
            mu_1
        } else { mu_2 };

        let shift  = Matrix::eye(n).scalar_mul(s_k);
        let (q,r)  = (&a_k - &shift).qr_decomposition();
        a_k = &(&r * &q) + &shift;
    }
    eigvals
}

5. 補足事項

  • デバッグ
    dbg!
    ,
    #[test]
    を活用すると簡単に検証できます。
  • ゼロコスト抽象化 – クローンは多くの場合不要です。借用チェッカーとイテレータで割り当てを減らせます。
  • デフォルト引数 – Rust にはないため、明示的にパラメータを渡すことでテストが容易になります。
  • Clippy & LSP – バグ検出やインラインドキュメント生成に不可欠です。

6. WebAssembly へのコンパイル

wasm-pack
を使用:

cargo new --lib gershgorin-circle-theorem
wasm-pack build --target web --no-typescript --no-pack

生成される

.wasm
.js
pkg/
ディレクトリに配置されます。
#[wasm_bindgen]
により、JavaScript のグルーコードは最小限です:

<script type="module">
  import init, { Complex, Matrix } from "./pkg/gershgorin_circle_theorem.js";
  init().then(() => {
      const matrix = new Matrix(order, values);
      const circles = matrix.gershgorin_circles();
      const eigvals = matrix.qr_algorithm(10n, 1e-8);
  });
</script>

7. Hugo での公開

このコンポーネントはブログ投稿内に iframe として埋め込みます。

publish-html-as-resource.html
というカスタムショートコードを用い、
.html
ファイルをページではなくリソースとして扱います。

{{< iframe src="component/component.html" width="100%" height="820" >}}

8. 結論

Rust で固有値ソルバーを書き、WebAssembly にコンパイルする作業は非常にやりがいのある経験でした。
借用チェッカーの壁や複素型の欠如といった初期の障害を

wasm-bindgen
と Rust エコシステムのおかげで乗り越えることができました。

次なる挑戦

  • 他の行列族(確率行列、正定値行列)を対象にインタラクティブデモを作成。
  • Brauer の Cassini 楕円などより厳密な境界を調査。
  • JavaScript グルーコードをさらに削減 —
    web-sys
    や Leptos/Dioxus などのフレームワークを検討。

投稿終了。

同じ日のほかのニュース

一覧に戻る →

2026/01/01 15:15

**球状ヘビ**

## Japanese Translation: **概要** インターフェースは、矢印キーまたは画面上のボタンでナビゲートし、結果を公開リーダーボードに送信し、そのリーダーボードをページから直接閲覧できるようにします。これらすべての機能は GitHub 上で入手可能なオープンソースコードから構築されているため、開発者は実装を検証・フォーク・拡張することができます。

2026/01/07 6:10

プロバイオティクス摂取後の口腔マイクロバイオームシーケンス研究

## Japanese Translation: > 本研究では、BioGaia の市販オーラルプロバイオティクス「Prodentis」(*Limosilactobacillus reuteri* の2株を含む)が、30日間の自己投与試験中に口腔内で定着できるかどうかを検証しました。事前・治療中・治療後、および停止から1週間後の4つの唾液サンプルを Oxford Nanopore 技術と Plasmidsaurus を用いて解析しました。*L. reuteri* のリードは検出されず、最も近い一致は約91 % の類似度に留まりました。これは定着がなかったか、または検知限界以下のレベルであったことを示唆しています。 > 口腔マイクロバイオームは変化しました:Prodentis を中止した後、*Streptococcus salivarius* が全細菌に対して <2 % から約20 % に上昇しました。同時に *S. mitis* は急激に減少(≈15 % → 1 %)し、総合的な Streptococcus の割合はほぼ一定のままでした。これは *S. salivarius* がニッチを占有して置き換えたことを示唆しています。さらに *Veillonella tobetsuensis* は 2.1 % から 5.7 % に増加し、成長する *S. salivarius* が生成する乳酸に支えられた可能性があります。いずれのサンプルにも赤複合体(P. gingivalis, T. forsythia, T. denticola)は検出されませんでした。 > シーケンス解析は便利で費用対効果が高く、4サンプルに対して総額 240 ドルで済みました。高品質な ONT リード(中央値 Q 23、約1,500 nt)が得られました。この結果は口腔プロバイオティクスの定着検出の難しさを浮き彫りにし、短期間でも製品がマイクロバイオームを再構築できることを示しています。Prodentis は風味が良く、一時的な口腔健康効果を提供する可能性がありますが、本実験ではプロバイオティクス株の定着は検出されませんでした。将来的には、より高用量や代替投与システムを試し、定着と長期的影響を評価する研究が期待されます。

2026/01/07 5:24

**ハッカー全員へ:お金の仕組み(2024)**

## Japanese Translation: --- ## Summary 記事「Calling All Hackers」は、cts(別名 gf_256)が *Phrack* Volume 0x10、Issue 0x47、Phile #0x11 of 0x11 に掲載したもので、ハッカーが自らの技術スキルを持続可能なビジネスに転換できると主張しています―ただし、基本的な金融リテラシーを習得し、暗号資産やベンチャーキャピタル界隈で広く蔓延している投機的ハイプを避ける必要があります。 cts は「shitcoin」のポンプ&ダンプ手法と、「Western Way」と呼ばれるものを対比しています。後者は依然としてハイプに頼っていますが、実際の価値創造を主張しています。彼はトークンローンチの仕組みを説明し、取引所、市場メーカー、創業者、ベンチャーキャピタル(SAFT契約を含む)の役割を指摘します。同記事は、100×リターンに執着するベンチャーキャピタルを批判し、多くのVCファンドがパワーロウ分布に依存しているため創業者が高リスクな賭けへと押されることを指摘しています。 株主、従業員、顧客、コミュニティ間の緊張について語り、株主価値がしばしば他のステークホルダーを犠牲にして優先されると主張します。この短期的な焦点はレイオフや製品品質の低下、「カルトリーダー」CEO の登場につながり、持続可能なモデルよりもハイプによって推進されるケースがあると述べています。 ハッカーへの実務上の示唆としては、以下があります:プライベートでしっかり統治された企業を構築すること、責任を持って資金調達を行うこと、長期的なビジョンを維持すること、そして評価額の膨張などの虚栄心に駆られた指標を避けること。記事は Airbnb Class A株のSEC提出資料、Moxie Marlinspike のブログ投稿、Twitter スレッドなど具体的なソースを引用し、エクイティ構造とVC行動を示しています。 cts はハッカーコミュニティ(CTFチーム、Phrack スタッフ、Zellic メンバー)に感謝し、将来のテクノロジー生態系を形作りたいハッカーには、体系的な経済と金融を理解することが不可欠であると強調しています。付録では、IB、PE、HF、VC などの金融用語をハッカー向けに風刺的に定義したリストをユーモラスに掲載しています。 主旨は:ハッカーが金融リテラシーと持続可能なビジネス慣行を受け入れれば、よりレジリエントなテックエコシステムを構築し、VC の期待を真の価値創造へシフトさせ、エクイティ・ガバナンス・ステークホルダーのバランスに関する業界全体の規範に影響を与えることができるという点です。