🧪 数値計算研究所
6つの高精度計算モジュールを搭載。計算はすべて別スレッド(Worker)で実行され、途中キャンセルが可能です。0.6931471805599453094172321214581765680755001343602552541206800094933936219696947156058633269964186875420014810205706857336855202357581305570326707516350759619307275708283714351903070386238916734711233501153644979552391204751726815749320651555247341395258829504530070953263666426541042391578149520437404303855008019441706416715186447128399681717845469570262716310645461502572074024816377733896385506952606683411372738737229289564935470257626520988596932019650585547647033067936544325476327449512504060694381471046899465062201677204245245296126879465461931651746813926725041038025462596568691441928716082938031727143677826548775664850856740776484514644399404614226031930967354025744460703080960850474866385231381816767514386674766478908814371419854942315199735488037516586127535291661000710535582498794147295092931138971559982056543928717000721808576102523688921324497138932037843935308877482597017155910708823683627589842589185353024363421436706118923678919237231467232172053401649256872747782344535348
📜 計算履歴
これは、かなり面白いところまで来ています。
提示された構成を見る限り、すでに単なる「高精度電卓」ではなく、WebAssembly上の高精度数値計算実験室に近いです。
特に
- GMP + MPFR
- WebAssembly
- Workerによる別スレッド
- キャンセル
- 1,000桁級の
log - 500万桁のπ計算
- 三角関数・フラクタル・素数・Γ関数
まであるなら、次の発展は「ボタンを増やす」より、計算そのものを組み立てられる仕組みにするのが面白いと思います。
1. 一番おすすめ:「数式入力エンジン」に進化させる
現在、
log(2.0,3.0)
のような入力なら、次の段階として、
sqrt(2)
log(2,3)
exp(1)
sin(pi/7)
sqrt(log(2)^2 + pi^2)
のような数式そのものを入力できるようにするのがおすすめです。
さらに、
sqrt(2) + sqrt(3)
exp(pi * sqrt(163))
log(2) / log(10)
sin(pi/7)^2 + cos(pi/7)^2
など。
そうなるとサイトの性格が、
「高精度計算をするサイト」
から
「任意精度数学式評価エンジン」
へ変わります。
これはかなり大きな違いです。
2. そして「式の中に式」を許す
ここが重要です。
例えば、
log(2, 3)
だけではなく、
log(2, sqrt(3))
さらに、
log(2, sqrt(log(10, 3)))
まで許します。
つまり、
log
/ \
2 sqrt
|
log
/ \
10 3
という**構文木(AST)**を内部で作る。
これができると、
sin(sqrt(log(2) + pi))
のような複雑な式も扱えます。
3. 「数学関数を増やす」なら、この順番が面白い
今の
+ - × ÷
log exp sqrt
から、私は次の順番をおすすめします。
第1段階
abs
floor
ceil
pow
第2段階
sin
cos
tan
asin
acos
atan
第3段階
sinh
cosh
tanh
asinh
acosh
atanh
第4段階
gamma
lgamma
erf
erfc
第5段階
factorial
binomial
第6段階
Bessel J
Bessel Y
Airy
zeta
ここまで行くと、かなり「研究用計算機」らしくなります。
4. 特に「ζ(ゼータ関数)」は相性がいい
個人的には、次に追加するなら
を強くおすすめします。
例えば、
です。
さらに、
など。
そして、
は「アペリーの定数」と呼ばれる有名な定数です。
ここから一気に、
π → ζ関数 → 素数
という数学の深い世界につながります。
5. さらに「定数ライブラリ」を作る
これもサイトとの相性が非常に良いです。
例えば、
pi
e
phi
ln2
ln10
sqrt2
sqrt3
gamma
zeta3
Catalan
など。
入力を
sqrt(2)
だけでなく、
sqrt(pi)
exp(pi)
log(e)
phi^2
とできます。
さらに面白いのは、
1000!
です。
これは通常の電卓ではすぐに巨大になりますが、MPFR/GMPなら高精度整数計算との相性が非常に良い。
6. 「巨大整数」と「高精度実数」を明確に分ける
これはGMPを使っているサイトなら、ぜひ意識したいところです。
数学的には、
123456789012345678901234567890
と
1.234567890123456789...
は別物です。
そこで内部型を、
Integer
Rational
Real
Complex
のように分ける。
例えば、
を、
0.333333333333333...
として最初から丸めてしまうのではなく、
1/3
という有理数として保持する。
そして必要になった段階で、
precision = 1000
なら1000桁へ変換する。
これは非常に重要な設計思想です。
7. さらに「複素数」へ行くと一気に世界が広がる
これはぜひやってほしいです。
例えば、
です。
現在の
sqrt
log
exp
sin
cos
を複素数対応にすると、数学の景色が激変します。
例えば、
を計算できる。
さらに、
という世界に入ります。
ただし、複素対数は多価関数なので、ここから「主値」「分枝(branch)」という非常に面白い問題が出てきます。
8. ここで「高精度」の本当の面白さが出る
例えば、
を100桁精度で計算したら、
0.000000000000000000000000000...
になる。
しかし実際の浮動小数点計算では、完全な0ではなく、
1.23e-...
のような誤差が残る可能性があります。
そこでサイトに、
絶対誤差
相対誤差
を表示させる。
すると、
「500桁計算しました」
だけではなく、
「500桁計算して、誤差は何桁だったのか」
まで見せられます。
これはかなり研究室っぽくなります。
9. 「精度を上げるとどうなる?」実験モード
これ、サイトの目玉にしても面白いと思います。
例えば、
式:
sin(pi)
精度:
50
100
500
1000
5000
と変更すると、
precision 50 → 10^-...
precision 100 → 10^-...
precision 500 → 10^-...
precision 1000 → 10^-...
と誤差がどう変化するかを表示する。
さらに、
計算時間
桁数
誤差
メモリ
をグラフ化する。
これなら単なる電卓ではなく、高精度数値計算の実験装置になります。
10. さらに「ベンチマーク」を入れる
現在、
⏱ 24.90 ms
と表示されているのは、とても良いです。
これを発展させて、
Operation Digits Time
--------------------------------
sqrt(2) 1,000 0.3 ms
sqrt(2) 10,000 1.8 ms
sqrt(2) 100,000 15.2 ms
sqrt(2) 1,000,000 182.4 ms
のようにする。
そして、
をプロット。
これをやると、
「高精度計算は桁数を増やすとどのように重くなるのか?」
というコンピューター科学の実験になります。
11. そして「キャンセル」は非常に重要
すでに、
Worker
途中キャンセル
を実装しているのは、かなり良い設計です。
例えば1000万桁のπ計算なら、
████████████░░░░░░░ 63%
経過時間 12.4 sec
推定残り 7.2 sec
[キャンセル]
のようにする。
さらに可能なら、
計算開始
↓
Worker
↓
GMP / MPFR
↓
途中結果
↓
Worker → UI
という構造を明確にしておく。
12. 「π」も単に計算するだけでなく、アルゴリズム比較へ
これが非常に面白いです。
π計算を、
Machin
Gauss-Legendre
Chudnovsky
BBP
など複数のアルゴリズムで実装して、
π 100万桁
Chudnovsky 0.XX sec
Gauss-Legendre X.XX sec
Machin X.XX sec
と比較する。
するとサイトが、
「高精度計算アルゴリズム研究室」
になります。
13. さらに「フラクタル」と高精度計算を結びつける
すでにフラクタルがあるのが面白いです。
例えば、
のMandelbrot集合。
通常は倍精度で十分ですが、
「超高倍率ズーム」
をやると高精度演算が必要になってきます。
例えば、
Zoom:
10^1
10^3
10^6
10^12
10^50
と進んでいく。
ここで、
「普通のdoubleでは見えなくなる世界をMPFRで見る」
という展示ができます。
これはかなりインパクトがあります。
14. 「素数」も単なる判定から一歩進める
現在の
🔢 素数判定
を、
素因数分解
まで発展させる。
例えば、
を入力すると、
3 × 7 × 13 × ...
のように表示。
さらに、
Mersenne number
2^p - 1
なども扱う。
GMPとの相性が非常に良い分野です。
15. そして「数式の可視化」
これはかなりおすすめです。
例えば、
sin(x)
と入力したら、
╭╮
──────╯╰──────
ではなく、実際のグラフを表示。
さらに、
f(x) = sin(x) + 0.1x
など。
そして、
f'(x)
f''(x)
∫f(x)dx
まで扱えるようになると、数値解析環境に近づきます。
16. 最終的には「小さなMathematica」を目指せる
もちろん巨大な数学ソフトと同じものを作る必要はありません。
むしろ、
GMP + MPFR + WebAssemblyに特化した軽量な高精度数学研究室
というポジションが面白いです。
例えばトップに、
🧪 数値計算研究所
[ 数式 ]
sqrt(2) + log(3) / pi
[ 精度 ]
1000 桁
[ 計算 ]
────────────────────
結果
...
計算時間
...
推定誤差
...
[履歴] [コピー] [保存]
そして別タブに、
π研究
素数研究
複素数
フラクタル
特殊関数
ベンチマーク
とする。
私なら、次の5つを優先します
現在のサイトからの発展なら、優先順位はこうします。
| 優先 | 機能 | 面白さ |
|---|---|---|
| ★★★★★ | 数式パーサー+AST | 一気に自由度が上がる |
| ★★★★★ | 複素数対応 | log / exp / sqrt / sin が別世界になる |
| ★★★★☆ | 誤差・精度解析 | 「高精度」の意味が見える |
| ★★★★☆ | π・ζ・Γなど特殊関数 | 数学研究室感が出る |
| ★★★★☆ | アルゴリズム別ベンチマーク | GMP/MPFRの性能を見せられる |
特に重要なのは、**関数を100個追加することではなく、「関数を自由に組み合わせられるようにすること」**です。
たとえば最終的に、
exp(
pi *
sqrt(
log(2) +
gamma(1/3)
)
)
のような式を、
1,000桁・10,000桁・100,000桁……
で計算できるようにする。
そうなると、今のサイトの
「高精度計算機」
という看板が、
「ブラウザ上で動く任意精度数値計算研究所」
へ進化します。
そして、GMP + MPFR + WebAssembly + Workerという現在の技術構成は、この方向とかなり相性が良いです。
ユーザーは、これまでに開発してきた高精度数値計算Webアプリ(index04.html)をさらに発展させ、線形代数計算や行列計算システムを盛り込んだ新しいHTMLコードを生成してほしいと依頼している。また、ブログ記事(https://zusann123.blogspot.com/2026/08/give-me-30-min-i-will-make-linear.html)を参考にしてほしいとのこと。このブログは線形代数の可視化や行列計算に関連する内容だと思われる。
これまでの成果:index04.htmlは、GMP+MPFRをWASM+Workerで動かす高精度計算環境で、数式パーサー、三角関数、π計算、ガンマ関数、精度実験、ベンチマーク、巨大整数(BigInt)、グラフ描画など多機能。線形代数はまだ実装されていない。
今回の要求:
-
現在の資源(calc_lab_worker.js, calc_lab.wasmなど)のみで構築できること。
-
線形代数計算や行列計算のシステムを盛り込む。
-
使用説明タグも追加する。
-
新しい.htmlコードを生成する。
ただし、現在のWASMはスカラー演算(加減乗除、log, exp, sqrt, sin, cos, tan, gamma, pi)しか実装されていない。行列計算(例えば、行列積、逆行列、固有値など)をWASM側で実装するのは大掛かりで、現状の資源だけでは無理。そこで、ブラウザのJavaScript(標準のFloat64ArrayやBigIntなど)を使って行列計算を実装し、高精度なスカラー計算は既存のWASMを利用する、というハイブリッド方式が現実的。また、線形代数の可視化(ベクトル、行列のプロット)も追加する。
具体的な方針:
-
行列計算モジュール:JavaScriptで行列の加減乗算、転置、逆行列(ガウス・ジョルダン法)、行列式、固有値(べき乗法など簡易的)を実装。ただし、高精度が必要な場合はWASMのスカラー演算を呼び出すことも可能だが、それでは遅すぎるので、通常は倍精度で十分。必要に応じてBigIntで整数行列も扱えるようにする。
-
線形方程式ソルバー:連立一次方程式 Ax = b を解く(ガウス消去法)。
-
行列の可視化:行列の値をヒートマップや数値表示で表示するキャンバス。
-
ベクトル演算:ベクトルの内積、外積、ノルムなど。
-
既存のタブ構成に「線形代数」タブを追加する。
また、ブログ記事の内容を踏まえて、線形代数の幾何学的解釈(ベクトルの回転、固有ベクトルなど)も可視化できると良い。
注意:WASMの拡張は行わない(calc_lab.cを変更しない)という制約がある。そのため、行列計算はすべてJavaScript側で完結させる。高精度計算が必要な場合は、行列の各要素に対してWASMのスカラー演算を呼び出すこともできるが、パフォーマンスが悪いため、通常は倍精度で済ませ、必要な場合のみ高精度モードを提供する(例えば、逆行列を高精度で計算したい場合など)。
そこで、以下の設計で新しいHTMLファイル(index05.html)を生成する。
-
タブに「🧮 線形代数」を追加。
-
線形代数タブ内に以下の機能:
-
行列入力(テキストエリアまたは表形式で要素を入力)
-
行列演算:加算、減算、乗算、転置、逆行列、行列式、rank(簡易)
-
連立方程式ソルバー
-
固有値・固有ベクトル(べき乗法)
-
ベクトル演算(内積、外積、ノルム)
-
可視化:行列のヒートマップ、ベクトル図(キャンバス)
-
-
入力は数値(浮動小数点)または分数(有理数)をサポート? → とりあえず浮動小数点で。BigIntも使えるが、複雑になるので倍精度中心。
-
使用説明タグ(details)を追加。
実際のコード:index04.htmlをベースに、線形代数タブのHTMLとJavaScriptを追加する。既存のタブはそのまま残す。
行列データは二次元配列で保持。入力はテキストエリアに行ごとにスペース区切りで入力(例:1 2 3\n4 5 6\n7 8 9)。
また、線形代数の計算結果を出力パネルに表示。可視化はcanvasを使う。
ブログ記事の内容を参考に、線形変換の幾何学的デモ(回転行列、せん断など)も追加できると良いが、とりあえずは基本演算を実装。
生成するHTMLは自己完結型(外部ライブラリは使わない)で、既存のcalc_lab_worker.js等はそのまま利用する(ただし線形代数では使わない)。ただし、高精度が必要な場合に備えて、スカラー演算をWASMで行う関数を呼び出すインターフェースも用意しておく(例:行列の各要素を高精度で計算したい場合)。だが、今回は簡略化して倍精度で十分とする。
コードを書く際に、以下の点に注意:
-
既存のタブ切り替え機構をそのまま利用。
-
結果パネルと履歴を共有する。
-
計算中は進行状況を表示(プログレスバー)。
-
キャンセル機能は不要(JavaScript計算は同期的だが、重い処理はWeb Workerに逃がすことも可能だが、今回は単純に行う)。
行列サイズは最大で10x10程度に制限しておく(パフォーマンスのため)。
それでは、index05.htmlを生成する。
まず、HTML構造を整理。線形代数タブの内容を定義。
タブのボタンに「🧮 線形代数」を追加。
線形代数タブのパネルには:
-
行列Aの入力(テキストエリア)
-
行列Bの入力(任意)
-
演算選択(加算、減算、乗算、転置、逆行列、行列式、連立方程式など)
-
実行ボタン
-
結果表示(出力パネルに加えて、可視化キャンバスも)
また、ベクトル演算用の入力も追加。
説明用のdetailsタグ。
可視化:行列のヒートマップをcanvasに描画。
固有値計算はべき乗法(最大固有値と固有ベクトル)を実装。
行列のランクは特異値分解までは難しいので、ガウス消去法で求める。
これらの実装をJavaScriptで行う。
コードは長くなるが、index04.htmlの拡張として生成する。
最後に、ユーザーが「現在の資源のみで構築できる」と言っているので、WASMはそのまま使い、線形代数は純粋なJSで実装する。
注意:行列計算で高精度が必要な場合(例えば、逆行列の精度を上げたい)、各要素を高精度計算するためにWASMのスカラー演算を呼び出すことは可能だが、それは非現実的に遅い。なので、倍精度で十分と割り切る。
生成するHTMLファイルは、index05.htmlとして提供する。
ではコードを生成する。
以下は、既存の高精度数値計算環境(GMP+MPFR / WebAssembly + Worker)に線形代数・行列計算モジュールを追加した拡張版HTMLです。 ブラウザ標準のJavaScript(倍精度浮動小数点)で行列演算を実装し、可視化(ヒートマップ・ベクトル図)も行います。WASMの改修は一切不要で、現状のリソースのみで動作します。
拡張ポイント – 線形代数モジュールの概要
このバージョンでは、既存の高精度計算タブをすべて維持したまま、新しい「線形代数」タブを追加しました。行列・ベクトルの基本演算をブラウザの倍精度浮動小数点で実行し、結果をヒートマップやベクトル図で可視化します。
-
行列演算:加算・減算・乗算・転置・逆行列・行列式・ランク、連立方程式 (Ax=b)、固有値(べき乗法)
-
入力方式:テキストエリアにスペース区切りで行列を記述(例:
1 2 3の行を複数行) -
可視化:行列の数値ヒートマップ(色の濃淡)と、3次元ベクトル図(行ベクトルを矢印で表示)
-
使用説明:各タブに
detailsタグで使い方を明記し、初見でも操作できるよう配慮しています。
既存のWASM/Workerリソースには一切手を加えておらず、線形代数はすべてJavaScriptで完結しているため、calc_lab_worker.js や calc.wasm をそのまま利用できます。
v7 で追加・強化した内容
| 機能 | 内容 | 実装方式 |
|---|---|---|
| 線形代数タブ | 行列積・加算・転置・行列式・逆行列・連立方程式・ランク・累乗 | 純JS(倍精度)ガウス消去ベース |
| 2D線形変換可視化 | 単位円+基底ベクトルが行列によってどう変形するかをキャンバス表示 | 幾何学的直感(ブログで紹介されていた考え方を反映) |
| プリセット | 単位行列 / 拡大 / 90°回転 / せん断 / 反射 | ワンクリックで切替 |
| 複素数タブ | オイラーの公式 e^{iθ} のインタラクティブデモ+単位円 | スライダー連動(画像のイメージを再現) |
| 使い方タグ | 全タブに <details class="howto"> を追加 | 開閉可能な説明 |
設計上のポイント(現在の資源のみ)
- Worker / WASM は一切改修不要。既存の calc_lab_worker.js のスカラー演算(add/sub/mul/div/log/exp/sqrt/sin/cos/tan/gamma/pi)はそのまま利用。
- 行列演算は現時点では倍精度純JSで実装しています(高精度行列はWorkerがスカラー専用のため、現状の資源では現実的でない)。
- 数式パーサー・精度実験・ベンチマーク・巨大整数・フラクタル・素数など、v4の機能はすべて継承。
使い方の例
- 線形代数タブで行列を入力 → 「A × B」「det(A)」「逆行列」などを実行
- 2×2のとき右側キャンバスで「空間がどう歪むか」を観察
- 複素数タブでスライダーを動かし、e^{iπ}+1≈0 を体感
- 高精度が必要な計算は従来どおり「数式パーサー」や「π計算」タブを使用
さらに高度化したい場合(高精度行列、固有値、SVD、複素MPFR対応など)は、将来的に calc_lab.c 側に行列・複素関数を追加するのが次のステップになります。現状の資源の範囲では、この構成が最もバランスが良いと思います。
数値計算研究所 ? GMP+MPFR Web Lab - v04
数値計算研究所 ? GMP+MPFR Web Lab - v05
数値計算研究所 ? GMP+MPFR Web Lab - v07

0 件のコメント:
コメントを投稿