🔢学習用の算数(数学ではなく)のツールを制作致しました。AI時代の算数教育改革の最先端、国際比較になります。
https://t.co/yex9QIywJu pic.twitter.com/pZjxrBis7r
— 藤本 伸樹 (@9Wfk4XhXFdEItwc) August 25, 2026


プロジェクトの概要
やったことは2段階です。
まず調査。「算数(数学ではなく)の最先端」というご質問に対して、4つの独立した調査を並行で走らせました ── 計算アルゴリズムと記録、世界の算数教育、AIと算術、コンピュータの算術。合わせて330回ほどウェブを叩いて、一次資料(arXiv、NIER、imo-official.org、TIMSS国際結果サイト、OCP仕様書など)まで降りて裏を取っています。各調査には「確認できたこと」と「未確認」を必ず分けさせました。その結果、たとえば円周率の記録が私の記憶(202兆桁)より2世代進んで314兆桁になっていたことや、行列乗算指数ωが2026年8月に更新されたばかりだったことが分かりました。
次に成果物。調査結果を4つの触れる実験と36問の試験問題集にまとめ、index.html 1枚と、ブラウザで開けるページ版の2形態でお渡ししています。
成果物の中身を一言でいうと、「読む」のではなく「動かして気づく」ことを狙った構成です。たとえば実験1の「n log n が理論上は最速なのに実務では絶対に使われない」という話は、文章で読むと抽象的ですが、グラフの最下段にずっと紫の線がいるのを見ながら「でも交差点は 2^(1729¹²) ビット」と知ると、断絶が体に入ります。実験3の音の量子化も同じ発想で、FP4に切り替えると音程が16段しか出ないことを耳で確認できます。
index.html の説明
1516行・106KB の単一ファイルです。ビルド不要、依存ゼロ(Google Fontsの表示用フォントだけ外部から読みますが、無くてもシステムフォントで正しく動きます)。ダブルクリックで開けます。
構成は3ブロックです。
部分 行数 中身 <style> 307行 デザイントークン25個と全スタイル マークアップ 363行 ヘッダー、タブ、5つのパネル、フッター <script> 835行 36個の関数。ライブラリ不使用
スタイルの考え方
明るいテーマが方眼ノート、暗いテーマが黒板です。背景の升目は画像ではなく repeating-linear-gradient を4枚重ねて描いています(24px の細目盛と120px の太目盛)。
色は25個のCSS変数で管理していて、--shu(採点の朱)、--ai(鉛筆の藍)、--yama(山吹)、--midori、--murasaki の5色がアクセントです。テーマ切替はトークンの再定義だけで済むので、色を1箇所変えれば全体に伝播します。
テーマは3状態に対応しています ── 明示的に light、明示的に dark、そして何も指定していない「システム任せ」。この3つ目が実は一番多いので、:root に完全な明色パレットを置き、@media (prefers-color-scheme: dark) で暗色に差し替え、:root[data-theme] でトグルが両方向に勝つ、という3層構造にしてあります。
JavaScript の中身
6枚の <canvas> をすべて手描きしています。チャートライブラリは使っていません。
描画の共通部分
fit(canvas) ── devicePixelRatio を見て解像度を合わせる。Retinaでもぼやけません
CV('--shu') ── CSS変数を読んで canvas の色に使う。だからテーマを切り替えるとグラフの色も追随します
redrawAll() ── テーマ変更・リサイズ・タブ切替のたびに全部描き直す
実験ごとの中核関数
drawS1Grid(854行)── n×n のドット格子。i < n^1.585 のドットを藍、残りを朱に塗り分けて、Karatsubaが払わずに済む分を可視化
drawS1Chart(900行)── 5本の計算量曲線を log-log で。GMPの実際の切替しきい値(約1,664 / 6,400 / 224,000ビット)を破線で重ねています
bigMul(979行)── 多倍長の掛け算。JSの Number は7桁×7桁で精度が足りないので、桁配列で筆算しています
quant / fmtInfo(1100〜1113行)── 浮動小数点の量子化。ここが一番神経を使いました。FP4 E2M1、FP6 E3M2、FP8 E4M3 はそれぞれ特殊値の扱いが違う(無限大を持つ/NaNだけ持つ/どちらも持たない)ので、sp パラメータで3系統に分けています。検証では FP4 が ±{0, 0.5, 1, 1.5, 2, 3, 4, 6} の15値、E4M3 の最大値が448、FP16 が63,487値と、教科書どおりの数字が出ました
enumerate(1130行)── 表示範囲内の全表現可能値を列挙。FP32だと数千万個になるので、4000個を超えたら諦めて帯で塗る安全弁つき
invNorm(1272行)── 正規分布の逆累積分布関数(Acklamの近似)。実験4で分位点を出すのに使います
drawS4(1294行)── 分位点写像を数値微分して密度を出すやり方。損失関数 f(p) = −0.058 + 2.391·(1−p)^1.18 は、米国のTIMSS実測4点(−37 / −29 / −18 / −2)に当てはまるよう解いた係数です
音は Audio_ オブジェクトに全部入っています。音声ファイルは1つも使っていません。オシレータとフィルタとノイズバッファを組み合わせて、その場で合成しています。BGMは MEL 配列(32ステップの旋律)を70BPMで走らせる簡易シーケンサで、ヨナ抜き音階(ド・レ・ミ・ソ・ラ)から音を選び、8ステップごとにベースが入ります。ブラウザは操作なしに音を鳴らすことを禁じているので、最初のボタン押下で AudioContext.resume() を呼ぶ設計です。
試験問題は EXAMS オブジェクト(1330行あたり)にデータとして入っていて、renderExam がHTMLに起こします。問題文・正答・解説・正答率を持つだけの素直な構造なので、問題を足したり直したりするならこのオブジェクトを編集するだけです。
手を入れるとしたら
色を変えたい → 冒頭の :root ブロック(--shu などを差し替え)
問題を追加したい → EXAMS オブジェクトに {no, meta, rate, body, ans, exp} を1つ足す
BGMの雰囲気を変えたい → Audio_.MEL の数列と Audio_.SCALE
実験4のモデルを変えたい → lossAt(p) の係数
もし特定の部分をもっと詳しく知りたい、あるいは何か足したい・直したいところがあれば言ってください。
┌─────┬─────────────┬───────────┬─────────────────────────────────────────────────────────────────────────────────┐
│ # │ Platform │ 状態 │ URL / 備考 │
├─────┼─────────────┼───────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 1 │ Zenodo │ ✓ 済 │ https://doi.org/10.5281/zenodo.22036669 │
│ │ │ (08-21) │ │
├─────┼─────────────┼───────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 2 │ Internet │ ✓ 済 │ https://archive.org/details/rei-aios-paper-177-v10-1787271032350 │
│ │ Archive │ (08-21) │ │
├─────┼─────────────┼───────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 3 │ Harvard │ ✓ 新規 │ https://doi.org/10.7910/DVN/KC56RY(HTTP 200、shared dataverse に file 追加) │
│ │ Dataverse │ (08-25) │ │
├─────┼─────────────┼───────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 4 │ Dev.to │ ✓ 済 │ https://dev.to/fc0web/paper-177-v10-... │
│ │ │ (08-21) │ │
├─────┼─────────────┼───────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 5 │ Hatena │ ✓ 済 │ https://fcwebfujimoto.hatenablog.com/entry/2026/08/21/091423 │
│ │ │ (08-21) │ │
├─────┼─────────────┼───────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 6 │ HackMD │ ✓ 済 │ https://hackmd.io/@zCUv2P2UQHGmAOJFPLL_-A/rkLo_GBPGl │
│ │ │ (08-21) │ │
├─────┼─────────────┼───────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 7 │ Notion │ ✓ 済 │ https://app.notion.com/p/...3c3dd371... │
│ │ │ (08-21) │ │
├─────┼─────────────┼───────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 8 │ Livedoor │ ✗ SKIP │ Claude Code auto-mode classifier に block(PUBLISH=1 env pattern)。手動 retry │
│ │ │ 記録 │ コマンドを log に保存 │
├─────┼─────────────┼───────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 9 │ Mastodon │ ✓ 済 │ https://mathstodon.xyz/@Fujimoto/117130618285573078 │
│ │ │ (08-21) │ │
├─────┼─────────────┼───────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 10 │ Scrapbox │ ✗ SKIP │ CSRF API 側で /api/users/me response schema 変更疑い(cookie │
│ │ │ 記録 │ は生存確認済、name/email 取得可)。script 修正が別途必要 │
├─────┼─────────────┼───────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 11 │ Nostr │ ✓ 済 │ https://njump.me/naddr1qvzqqqr4gupzq70... │
│ │ │ (08-21) │ │
└─────┴─────────────┴───────────┴─────────────────────────────────────────────────────────────────────────────────┘