2026年8月30日日曜日

🧪 数値計算研究所 ー 高度化の、アイデア

GMP + MPFR — WebAssembly / Worker

🧪 数値計算研究所

6つの高精度計算モジュールを搭載。計算はすべて別スレッド(Worker)で実行され、途中キャンセルが可能です。
✅ 計算完了
log(2.0,3.0)
⏱ 24.90 ms
0.6931471805599453094172321214581765680755001343602552541206800094933936219696947156058633269964186875420014810205706857336855202357581305570326707516350759619307275708283714351903070386238916734711233501153644979552391204751726815749320651555247341395258829504530070953263666426541042391578149520437404303855008019441706416715186447128399681717845469570262716310645461502572074024816377733896385506952606683411372738737229289564935470257626520988596932019650585547647033067936544325476327449512504060694381471046899465062201677204245245296126879465461931651746813926725041038025462596568691441928716082938031727143677826548775664850856740776484514644399404614226031930967354025744460703080960850474866385231381816767514386674766478908814371419854942315199735488037516586127535291661000710535582498794147295092931138971559982056543928717000721808576102523688921324497138932037843935308877482597017155910708823683627589842589185353024363421436706118923678919237231467232172053401649256872747782344535348
1,001 桁

📜 計算履歴

log(2.0,3.0)0.6931471805599453094172321214…
cos(32.0652 deg)0.8474445230979004648021981802…
π (5000000桁)3.1415926535897932384626433832…
ーーーーー      この様な、サイトを、作りましたが、より、複雑な計算をさせるためには、どの様な、工夫が、良いと、LLMは、考察しますか?、

これは、かなり面白いところまで来ています。
提示された構成を見る限り、すでに単なる「高精度電卓」ではなく、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. 特に「ζ(ゼータ関数)」は相性がいい

個人的には、次に追加するなら

  ζ(s)\zeta(s) 

を強くおすすめします。

例えば、

  ζ(2)=π26\zeta(2)=\frac{\pi^2}{6} 

です。

さらに、

  ζ(4)=π490\zeta(4)=\frac{\pi^4}{90} 

など。

そして、

  ζ(3)\zeta(3) 

は「アペリーの定数」と呼ばれる有名な定数です。

ここから一気に、

π → ζ関数 → 素数

という数学の深い世界につながります。


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

のように分ける。

例えば、

  13\frac{1}{3} 

を、

0.333333333333333...

として最初から丸めてしまうのではなく、

1/3

という有理数として保持する。

そして必要になった段階で、

precision = 1000

なら1000桁へ変換する。

これは非常に重要な設計思想です。


7. さらに「複素数」へ行くと一気に世界が広がる

これはぜひやってほしいです。

例えば、

  1=i\sqrt{-1}=i 

です。

現在の

sqrt
log
exp
sin
cos

を複素数対応にすると、数学の景色が激変します。

例えば、

  eiπ+1=0e^{i\pi}+1=0 

を計算できる。

スクショ
  eiπ+1=0e^{i\pi}+1=0 
  ei45=cos(45)+isin(45)0.71+0.71ie^{i\text{45}^\circ}=\cos(\text{45}^\circ)+i\sin(\text{45}^\circ)\approx \text{0.71}+\text{0.71}i
  θ=450.79 rad\theta=\text{45}^\circ\approx \text{0.79}\text{ rad}
単位円上の点は (cos θ, sin θ) = (0.71, 0.71) です。
  θ\theta
°
-1-0.50.51-1-0.50.51ReImθ = 45°cos θsin θ
フィードバックを送る

さらに、

  log(1)=iπ\log(-1)=i\pi 

という世界に入ります。

ただし、複素対数は多価関数なので、ここから「主値」「分枝(branch)」という非常に面白い問題が出てきます。


8. ここで「高精度」の本当の面白さが出る

例えば、

  eiπ+1e^{i\pi}+1 

を100桁精度で計算したら、

0.000000000000000000000000000...

になる。

しかし実際の浮動小数点計算では、完全な0ではなく、

1.23e-...

のような誤差が残る可能性があります。

そこでサイトに、

絶対誤差

  xxreference|x-x_{\rm reference}| 

相対誤差

  xxreferencexreference\frac{|x-x_{\rm reference}|}{|x_{\rm reference}|} 

を表示させる。

すると、

「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

のようにする。

そして、

  桁数vs計算時間\text{桁数} \quad vs \quad \text{計算時間} 

をプロット。

これをやると、

「高精度計算は桁数を増やすとどのように重くなるのか?」

というコンピューター科学の実験になります。


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. さらに「フラクタル」と高精度計算を結びつける

すでにフラクタルがあるのが面白いです。

例えば、

  zn+1=zn2+cz_{n+1}=z_n^2+c 

のMandelbrot集合。

通常は倍精度で十分ですが、

「超高倍率ズーム」

をやると高精度演算が必要になってきます。

例えば、

Zoom:
10^1
10^3
10^6
10^12
10^50

と進んでいく。

ここで、

「普通のdoubleでは見えなくなる世界をMPFRで見る」

という展示ができます。

これはかなりインパクトがあります。


14. 「素数」も単なる判定から一歩進める

現在の

🔢 素数判定

を、

素因数分解

まで発展させる。

例えば、

  12345678910111234567891011 

を入力すると、

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という現在の技術構成は、この方向とかなり相性が良いです。

ルートR、などは、2乗すると、R、ですが、3乗すると、R、などについても、ロッグ、Log~、で、表せましたっけ?

ルートR、などは、2乗すると、R、ですが、3乗すると、R、などについても、ロッグ、Log~、で、表せましたっけ?、雑学や業界話を交えながら、解説してください、

はい、表せます。しかも、ここには「平方根」から「任意の n 乗根」、さらに 対数(Log)・指数・複素数へつながる、数学のかなり美味しい世界があります。

たとえば、

  R=R1/2\sqrt{R}=R^{1/2} 

なので、

  (R)2=R(\sqrt{R})^2=R 

です。

同じ発想で、

  R3=R1/3\sqrt[3]{R}=R^{1/3} 

なら、

  (R3)3=R(\sqrt[3]{R})^3=R 

となります。


まず「n乗根」は全部、指数で書ける

一般に、

  Rn=R1/n\boxed{\sqrt[n]{R}=R^{1/n}} 

です。

したがって、

  R=R1/2\sqrt{R}=R^{1/2}  R3=R1/3\sqrt[3]{R}=R^{1/3}  R4=R1/4\sqrt[4]{R}=R^{1/4}  R10=R1/10\sqrt[10]{R}=R^{1/10} 

と、全部同じ形式になります。

さらに、

  (R1/n)n=Rn/n=R(R^{1/n})^n=R^{n/n}=R 

です。

つまり、

「n乗するとRになる数」を探す操作が、指数

1/n1/nを掛ける操作

になっています。


では、Logを使うと?

ここからが面白いところです。

xxを3乗したら RRになる」

つまり、

  x3=Rx^3=R 

を考えます。

両辺の対数を取ると、

  log(x3)=logR\log(x^3)=\log R 

対数の性質

  log(x3)=3logx\log(x^3)=3\log x 

によって、

  3logx=logR3\log x=\log R 

したがって、

  logx=logR3\log x=\frac{\log R}{3} 

です。

最後に指数関数へ戻すと、

  x=exp(logR3)\boxed{x=\exp\left(\frac{\log R}{3}\right)} 

となります。

つまり、

  R3=R1/3=exp(logR3)\boxed{\sqrt[3]{R} =R^{1/3} =\exp\left(\frac{\log R}{3}\right)} 

です。

これはもちろん、

  Rn=exp(logRn)\boxed{\sqrt[n]{R} =\exp\left(\frac{\log R}{n}\right)} 

まで一般化できます。


実は「平方根」もLogで書ける

たとえば、

  100\sqrt{100} 

なら、

  1001/2100^{1/2} 

ですが、

  1001/2=exp(log1002)100^{1/2} = \exp\left(\frac{\log100}{2}\right) 

とも書けます。

つまり、

  R=exp(logR2)\boxed{ \sqrt{R} = \exp\left(\frac{\log R}{2}\right) } 

です。

そして3乗根なら、

  R3=exp(logR3)\boxed{ \sqrt[3]{R} = \exp\left(\frac{\log R}{3}\right) } 

4乗根なら、

  R4=exp(logR4)\boxed{ \sqrt[4]{R} = \exp\left(\frac{\log R}{4}\right) } 

となります。


ここに「指数関数と対数関数は表裏一体」という話が出てくる

数学的には、

  axa^x 

  logax\log_a x 

は、互いに逆の操作です。

たとえば、

  23=82^3=8 

なら、

  log28=3\log_2 8=3 

です。

言い換えると、

指数関数は「何乗するか」を作る。

対数関数は「何乗したのか」を取り出す。

という関係です。


さらに面白いのが「計算機の裏側」

実は、コンピューターで

R1/3R^{1/3}のような計算をするとき、

概念的には

  R1/3=exp(lnR3)R^{1/3} = \exp\left(\frac{\ln R}{3}\right) 

というルートが非常に重要です。

たとえばPythonなら、

import math

R = 1000

x = math.exp(math.log(R) / 3)

print(x)

とすれば、

  x=10x=10 

が得られます。

なぜなら、

  ln1000=3ln10\ln1000=3\ln10 

なので、

  ln10003=ln10\frac{\ln1000}{3}=\ln10 

そして、

  eln10=10e^{\ln10}=10 

だからです。


これは昔の「対数表」の世界にもつながります

ここが数学史的にかなり面白いところです。

昔、電卓やコンピューターがなかった時代には、掛け算・割り算・べき乗・根の計算は大変でした。

そこで大活躍したのが対数表です。

対数には、

  log(ab)=loga+logb\log(ab)=\log a+\log b 

という性質があります。

つまり、

掛け算

  a×ba\times b 

を、

対数にすると

  loga+logb\log a+\log b 

という「足し算」に変換できます。

そして、

  log(an)=nloga\log(a^n)=n\log a 

なので、

n乗

を、

n倍

に変換できます。

さらに、

  Rn\sqrt[n]{R} 

は、

  logRn\frac{\log R}{n} 

に変換できます。

つまり昔の人は、

「難しい乗根計算を、対数表を使って割り算に変換する」

ということを実際にやっていました。


そして「計算尺」が登場する

https://images.openai.com/static-rsc-4/Ip20j64kdNbhvQVg-w6P-ccK2MBk-zgG-2mzvNUut6GoV_T5a9v7bcNSlD2POfvgTaky50XyjtXrZa6uetj30SyGQKOJdPDOTU3e4Er4ecY9SPMljewNEnQEEyERbvpc4XQcZFYxcuJ60MMie1Ve8SorKQThRKVrUoYKs_ZnoJwP8GO01xvyEPUvf7hafFMO?purpose=fullsize
https://images.openai.com/static-rsc-4/xkDz0ShzLSKg8Z1k1d9bxMBVUdXAAkKJHvTkOsbfdFE8YAEAy6SBSHQyJjHqadK7idgzH8eYeUKF0-cmQra_RKy3csPAWhvtKitcYEV9u9ukXMULX6CE6zl7pi9LNoqehruUlrfYiDnLUq-nMtSHvjODf1zPTWelpyVWjNzlGXcRSkoTAYTwB-cto5Fsot7n?purpose=fullsize
https://images.openai.com/static-rsc-4/ZGFtV658G_lVsjn5K21SesAtUxDN_VBTo_8IoywC49Bfm110Uicw42NSfslDxE91D6m9DBLisnGZHSqTNIPg9MOl9WIfxfBjQP9cApkTDFJQPhq_8oh9OaokugLokHRypEz4nteAbeOEN-cLVspxU87UNV8jDypWEp0dpDBkDlbF61qqJu4iTXoHnSNR_vm0?purpose=fullsize
5

昔の技術者・科学者が使っていた**計算尺(slide rule)**は、まさにこの対数の性質を利用した道具です。

計算尺の目盛りは普通の等間隔ではありません。

「対数目盛」になっています。

そのため、目盛りをずらすだけで、

  a×ba\times b 

が計算できる。

さらに工夫すれば、

  • 掛け算
  • 割り算
  • べき乗
  • 平方根
  • 立方根

などまで計算できました。

20世紀のエンジニアにとっては、計算尺を使えることが一種の職人技だったわけです。


さらに「業界話」をすると……

航空機設計、建築、機械工学、電気工学などでは、昔の技術者が計算尺を使って設計計算をしていました。

NASAのアポロ計画の時代にも、計算尺は現場で使われていました。

もちろん大型コンピューターも存在していましたが、

「コンピューターがあるから計算尺はいらない」

という単純な世界ではありませんでした。

概算・桁のチェック・設計値の妥当性確認

などでは、計算尺が非常に便利だったのです。


さらに一段深くすると「平方根」は特殊ではない

ここが数学的に美しいところです。

我々は、

  R\sqrt{R} 

を特別扱いしがちですが、数学的には、

  R1/2R^{1/2} 

にすぎません。

同様に、

  R3=R1/3\sqrt[3]{R}=R^{1/3}  R5=R1/5\sqrt[5]{R}=R^{1/5} 

です。

そしてさらに、

  R3/2R^{3/2} 

なども、

  R3/2=(R)3R^{3/2} = (\sqrt R)^3 

と解釈できます。

例えば、

  643/264^{3/2} 

なら、

  (64)3=83=512(\sqrt{64})^3 = 8^3 = 512 

です。

つまり、

  根号は「分数指数」の別表記\boxed{\text{根号は「分数指数」の別表記}} 

と考えると、かなり多くの公式が一気に統一されます。


そして「Log」は、さらに巨大な世界への入口

実は、

  R1/n=exp(lnRn)R^{1/n} = \exp\left(\frac{\ln R}{n}\right) 

という式は、単なる「立方根の計算方法」ではありません。

これは、

指数関数 ↔ 対数関数

という数学の巨大な構造そのものです。

さらにここから、

  eix=cosx+isinxe^{ix}=\cos x+i\sin x 

というオイラーの公式に進むと、

  logz\log z 

という「複素数の対数」の世界へ入っていきます。

すると「平方根」「立方根」という話が、最終的には

  eiθe^{i\theta} 

や、

  cosθ+isinθ\cos\theta+i\sin\theta 

とつながってしまいます。

つまり、

「Rを2乗するとRになる数」ではなく「Rをn乗するとRになる数」を考える

ところから始めると、

根号 → 分数指数 → 対数 → 指数関数 → 複素数 → オイラーの公式

という、数学史でも非常に美しい一本の道筋が見えてきます。

特に「なぜコンピューターは sqrt()pow() を高速に計算できるのか?」まで掘ると、Newton法・二分法・log/exp・浮動小数点・CPUの命令までつながって、かなり面白い「数学+コンピューター業界話」になります。