演示设计 · 九份第一梯队2026-09-06

九个开关

所有算法可视化站都在演示算法怎么工作。这九份设计演示的是没有它世界会怎么样——每一个都配一个能真的按下去的开关,关掉之后屏幕上必须有东西当场塌掉。选这九个的判据只有一条反事实:如果 1950 年有人证明它不可能存在,今天少的不是一点速度,是一整个行业。

下面九张卡片的两栏是同一件事的两个状态。这个总闸决定哪一侧通电——它就是每份演示里那个开关的样子。

每份演示的六个字段

关掉哪一行
必须是一个具体的函数替换,不是一个概念。说不清换掉了哪一行,这个演示就是在讲故事。
喂什么数据
真实量级的真实数据。顶格随机数据在这九个上会全部骗人。
尺子 A
机器无关的计数:次数、字节、顶点、采样点。可证、可断言、换台机器不变。
尺子 B
换算成现实单位:秒、公里、光纤根数、年。这一把才让人有体感。
屏幕怎么分
分几屏、哪一屏是主角。主角那一屏必须在关掉的一瞬间变化。
它什么时候不赢
每一个都要给出反例。不给反例的演示是广告,不是教学。
01

快速傅里叶变换

Cooley & Tukey · 1965 · 高斯 1805 年的手稿里已有
难度 中

关掉它,移动互联网不会被设计成今天这个样子

关掉哪一行fft(x) 换成按定义写的三重和 dft(x)。其余一个字不动。

关掉

频谱那一屏一直空白。进度条走到 0.003% 时旁边跳出一行字:按这个速度,这段 8 秒的音频要 4 天

打开

频谱瞬间出现。5G 那一屏的实时门槛灯是绿的——每个 OFDM 符号必须在 71.4 微秒内做完一次 2048 点变换,它用了不到千分之一。

尺子 A机器无关

复数乘法次数(256×256 的 MRI k-space 重建)

DFT4.29×10⁹ FFT1.05×10⁶ 4096 ×
尺子 B体感

2048 点变换 vs 5G 的 71.4 微秒实时门槛

DFT超时 372 倍 FFT余量 1000 倍以上
屏幕:三屏
输入
波形/k-space
两条进度条
并排跑
输出
频谱/图像

主角是中间那屏。DFT 那条进度条几乎不动,这个「不动」本身就是演示。

啊哈瞬间

OFDM 这种调制方式本身就建立在「FFT 很便宜」这个前提上。不是有了 4G 再用 FFT 加速,是先有 FFT,才有人敢这样设计无线电。

它什么时候不赢

n 很小时 DFT 反而更快——蝶形运算的簿记开销吃掉了收益。交叉点大约在 n = 16~64,让用户拖着 n 滑块自己看它翻面。另外 n 是质数时经典的 Cooley–Tukey 分解压根不适用,得换 Rader 或 Bluestein。

02

纠错码

Shannon 1948 → Hamming 1950 → Reed–Solomon 1960 → LDPC / Turbo / Polar
难度 高

关掉它,数字存储和数字通信全都变得不可信

关掉哪一行把 RS(255,223) 的 32 个校验符号删掉,编码器退化成恒等映射。信道、噪声、解码入口全不动。

关掉

用鼠标在二维码上涂掉一个模块——扫不出来了。Voyager 那张照片在误码率 10⁻³ 时已经全是雪花。

打开

同一张二维码涂掉三成照样扫得出。同一条信道上照片干干净净,一直撑到误码率 10⁻²。

尺子 A机器无关

可纠正的错误符号数 t = (n−k)/2,以及冗余率

无码t = 0 RS(255,223)t = 16 · 冗余 12.5%
尺子 B体感

同一噪声下的解码成功率 · 二维码被涂掉多少还能扫

无码1 个模块 H 级30% 的模块
屏幕:三屏同步涂抹
无纠错
L 级 7%
H 级 30%

鼠标涂一次,三个码同时被涂。下面一行实时显示「解出/解不出」。第二屏放 Voyager 的照片 + 一条误码率滑块。

啊哈瞬间

在噪声轴上画一条竖线,标着香农极限。1948 年就算出了这条线,人类花了 45 年才逼近它——1993 年的 Turbo 码和被遗忘三十年的 LDPC 把差距压到不足 0.005 dB。5G 的速率就是这 0.005 dB 换来的。

它什么时候不赢

干净信道上冗余是纯浪费。更要紧的是:RS 是悬崖式失效——错误一旦超过 t 个,不是画面逐渐变糊,是一瞬间全错。把误码率滑块慢慢往上推,让用户亲眼看到那道悬崖,比看它成功更有教育意义。

03

公钥密码

Diffie–Hellman 1976 · RSA 1977 · 椭圆曲线 1985
难度 中

关掉它,互联网只能是个公告板,不可能是市场

关掉哪一行禁止任何预共享秘密。Alice 和 Bob 从没见过面,他们之间只有一条 Eve 能看到全部字节的公开信道。

关掉

这是全清单里唯一让用户自己撞墙的演示:给一个沙盒,随便想办法把密钥传过去。每一次尝试,中间那栏 Eve 都原样看到。这不是难,是数学上做不到。

打开

公开信道上只出现 ga mod p 和 gb mod p,Eve 全看见了,却算不出双方共享的那个数。屏幕右上角浏览器的锁扣上。

尺子 A机器无关

Eve 暴力破解需要的运算次数(256 位椭圆曲线,等效安全强度 2¹²⁸)

8 位密钥256 次 ECC-2563.4×10³⁸ 次
尺子 B体感

拿全球比特币矿机的算力(约 7×10²⁰ 次/秒)去跑,要跑多久

8 位瞬间 ECC-256约 150 亿年 > 宇宙年龄
屏幕:三栏,中间是敌人
Alice
公开信道
Eve 在这里
Bob

中间那栏把每一个飞过去的字节都打出来。密钥长度滑块 8→2048 位,右侧「破解时间」从毫秒跳到 10¹⁰ 年。

啊哈瞬间

用户在模式 A 里试了五分钟没成功,然后打开开关——同样的公开信道,同样全都被 Eve 看见,秘密却建立起来了。先让人相信它不可能,再让他看见它发生。

它什么时候不赢

Shor 算法给了它保质期,同一根滑块上画一条「量子」线。另外公钥运算很慢——真实的 TLS 只用它交换一个对称密钥,之后全走 AES。它不是用来加密数据的,是用来交换钥匙的,这一点几乎所有人都搞错。

04

数据压缩

Huffman 1952 · LZ77 1977 · DCT 1974 · 运动补偿
难度 中

关掉它,流媒体在物理上不能存在——地球上铺不出那么多光纤。

关掉哪一行三个开关逐层剥:先关运动补偿(每帧独立),再关 DCT + 量化(只剩无损),最后关熵编码(原始 RGB)。每关一层,码率数字跳一次。

关掉

一部两小时 4K 电影是 5.4 TB。用 100 Mbps 家宽下载要 5 天。右边那根光纤柱状图涨出屏幕。

打开

同一部电影 15 GB,同样的宽带 20 分钟。画质差异肉眼几乎看不出来——这才是真正吓人的地方。

尺子 A机器无关

字节数 · 4K 30fps 一秒钟的数据量

原始 RGB746 MB/s H.264 高质量约 1.9 MB/s 约 400 ×
尺子 B体感

换算成基础设施:一部两小时 4K 电影 · 100 Mbps 宽带

不压缩5.4 TB · 5 天 压缩后15 GB · 20 分钟
屏幕:两屏 + 三个开关
画面
(四种开关状态下的画质)
光纤根数
柱状图

左边画质几乎不变,右边柱子指数级往上蹿——两屏的反差就是这份演示的全部内容。

啊哈瞬间

DCT(Nasir Ahmed,1974)可能是人类历史上执行次数最多的一段算法。你每看一秒视频它跑几百万次,而绝大多数人一辈子没听过这个名字。

它什么时候不赢

把压缩器的输出再喂给它自己——字节数会变大。这是鸽巢原理的直接推论:不存在能压缩所有输入的压缩器。这个反例最好,因为它能证,而且只要一个按钮。压缩靠的从来不是「魔法」,是真实数据有结构

05

卡尔曼滤波

Rudolf Kálmán · 1960 · 阿波罗导航计算机
难度 低 · 先做这个

关掉它,人类到不了月球,你的手机也不知道自己在哪条车道

关掉哪一行去掉预测—更新那两步,只留一路传感器:要么只信 GPS,要么只信惯导积分

关掉

只信 GPS:光标在马路两边乱蹦,时不时跳进居民楼。只信惯导:一开始比谁都平滑,然后慢慢飘走,两分钟后偏出一公里

打开

两个都很烂的东西合起来,贴着真值走。而且它给的不只是位置,还有一个诚实的误差椭圆——它知道自己有多不确定。

尺子 A机器无关

RMSE(对同一条真值轨迹,GPS σ = 5 m @1 Hz,惯导 50 Hz 带零偏游走)

只信 GPS约 5 m 只信惯导随时间发散 卡尔曼约 1 m
尺子 B体感

被判到错误车道/错误道路的时间占比——也就是「导航会不会让你走错路口」

关掉常态打开罕见
屏幕:一张地图 + 一条误差曲线
地图:四条轨迹叠在一起
真值/GPS/惯导/卡尔曼
误差随时间
+ 克拉美-罗下界

右屏画一条虚线是克拉美-罗下界——卡尔曼那条曲线贴着它。这是全清单上「顶到天花板」最直观的一次。

啊哈瞬间

它的立论不是「用更好的传感器」,而是一堆便宜的烂传感器加上一个运动模型,能拼出比任何单个传感器都准的答案。阿波罗就是这么飞的。

它什么时候不赢

做一个「隧道」按钮:GPS 断掉 30 秒。卡尔曼靠惯导硬撑,误差照样随时间增长——它没有魔法,只是把发散推迟了。另外它假设噪声是高斯的、系统是线性的,城市峡谷里的 GPS 多路径反射两条都不满足,这正是扩展卡尔曼和粒子滤波存在的理由。

06

蒙特卡洛与 MCMC

Ulam & von Neumann 1946 · Metropolis 1953 · 洛斯阿拉莫斯
难度 低 · 第二个做

关掉它,高维空间里的一切都算不动——计算化学、药物筛选、金融风险全部停摆。

关掉哪一行随机取点求平均 换回 网格求积。同一个被积函数,同一个精度要求。

关掉

网格法要 (1/h)d 个点。维度滑到 10 就是 10¹⁰ 个点,滑到 20 是 10²⁰——曲线冲出屏幕顶端。

打开

要 (σ/ε)² 个点,和维度完全无关。屏幕上是一条水平线,从 d = 1 一直平到 d = 20。

尺子 A机器无关

达到 1% 精度需要的采样点数

网格 d=1010¹⁰ 网格 d=2010²⁰ 蒙特卡洛约 10⁴(任何 d)
尺子 B体感

按每秒 10⁸ 次采样折算成时间(d = 20)

网格3×10⁴ 亿年 蒙特卡洛不到 1 毫秒
屏幕:一张图就够
横轴 d = 1…20
一条爆炸曲线 vs 一条水平线
两个点云
同步在跑

这是全清单上最干净的一张图:一条指数曲线和一条直线,不需要任何解释。

啊哈瞬间

把滑块拖到 d = 3——网格法赢,点云看起来还更整齐。交叉点在 d ≈ 4~5。让用户自己找到那个翻面的地方,比直接告诉他蒙特卡洛更好,有说服力得多。

它什么时候不赢

低维上它输,而且输得明显。它的收敛只有 1/√N——精度要多一位有效数字得多花 100 倍样本,这在中等维度上会被拟蒙特卡洛(QMC)打败。第二个演示做 MCMC:把 Metropolis 的接受准则换成纯爬山,采样器当场卡死在一个峰上,另外两个峰一次都没访问到。

07

反向传播

Linnainmaa 1970 · Rumelhart–Hinton–Williams 1986 · 注意力机制 2017
难度 中

关掉它,你现在正在用的这个东西不存在

关掉哪一行backward() 换成有限差分:对每个参数分别算一次 (f(w+ε) − f(w)) / ε

关掉

训练曲线那一侧的进度条卡在第一个 batch 上,旁边实时算着「本 batch 预计还需 3 小时」。

打开

几秒钟把 loss 压下去。它要的只是一次前向加一次反向——反向传播的代价和前向同阶,这一条就是全部。

尺子 A机器无关

算一次完整梯度需要的前向传播次数(两层 MLP,101 770 个参数)

数值微分P+1 = 101 771 反向传播约 2 5 万 ×
尺子 B体感

参数量滑块 10³ → 10¹²(GPT 规模)时两条代价曲线

数值微分正比于 P 反向传播恒等于 2 10¹¹ ×
屏幕:两屏 + 一根滑块
两条训练曲线
并排跑
参数量滑块
一条平线 vs 一条斜线

主角是右屏那根滑块。左屏只负责让人相信右屏那两条线是真的。

啊哈瞬间

把滑块推到 10¹²:数值微分需要多出 10¹¹ 倍的算力——把地球上所有 GPU 都拿来,从宇宙诞生开始算。而反向传播不过就是链式法则,一个高中知识。

它什么时候不赢

数值微分还有第二个毛病,值得单画一条 U 形曲线:ε 太小舍入误差爆炸,ε 太大截断误差大,最优 ε ≈ 1.5×10⁻⁸,最好也只剩八位有效数字。反过来,反向传播的代价是内存——它必须存下全部中间激活。这正是训练比推理吃显存得多的原因,也是 gradient checkpointing 存在的理由。

08

TCP 拥塞控制

Van Jacobson · 1988 · 起因是 1986 年 10 月互联网真的崩过一次
难度 中 · 最有戏

关掉它,互联网扩展不到几十台机器以上

关掉哪一行删掉 AIMD:每个发送方全速发,丢包了照发不误。链路、缓冲区、延迟全不动。

关掉

发送方数量过了某个点,那根管子塞满红色的重传包,绿色的有效数据几乎没有。吞吐数字从 32 kbps 塌到 40 bps——复刻 1986 年那个真实数字。

打开

每条流画成一条 AIMD 锯齿线。一百条锯齿没有任何中央协调,自己收敛到公平共享

尺子 A机器无关

有效吞吐 / 链路容量,以及重传包占比(100 条流共享一条瓶颈链路)

关掉goodput → 0 AIMD接近 100%
尺子 B体感

1986 年 10 月,LBL 到伯克利,直线距离 400 米

崩溃时40 bps 正常32 kbps 1000 ×
屏幕:一根管子 + 一片锯齿
横着的管子:彩色包在流动
N 条速率曲线(AIMD 锯齿)

发送方数量是滑块,1 → 100。管子里绿色(有效)和红色(重传)的比例就是全部答案。

啊哈瞬间

这是涌现最漂亮的一次展示:一百个只看得见自己丢包的独立个体,没有任何人指挥,自发地把带宽平分了

它什么时候不赢

做第三个模式:放进一条不遵守 AIMD 的作弊流——它抢走几乎全部带宽。这说明整个机制靠的是自愿遵守,它是一份社会契约,不是一条物理定律。另外 AIMD 在高带宽长时延链路上收敛很慢(BBR 和 CUBIC 因此而生),而无线链路上「丢包等于拥塞」这个假设根本是错的——丢包也可能只是信号差。

09

单纯形法

George Dantzig · 1947 · 线性规划
难度 高

关掉它,整个物理经济的调度层退回到拍脑袋——航班、机组、炼油、电网、集装箱。

关掉哪一行把「沿着棱走到相邻的更优顶点」换成枚举全部顶点。同一个可行域,同一个目标函数。

关掉

50 个变量、25 个约束的排班问题有 1.26×10¹⁴ 个顶点。计数器开始跑,用户看着它一辈子也跑不完。

打开

同一个问题,单纯形法访问了 60 来个顶点就停了。低维时左屏能真的画出那个多面体,看着它沿棱一步步爬到最优角上。

尺子 A机器无关

访问的顶点数(n = 50 变量,m = 25 约束)

枚举C(50,25) = 1.26×10¹⁴ 单纯形约 2m ~ 3m ≈ 60 10¹² ×
尺子 B体感

同一份机组排班:求解时间 · 相对人工方案的成本节省

枚举跑不完单纯形秒级
屏幕:两屏 + 一个「卡它」按钮
三维可行域
看它沿棱爬
规模滑块
顶点总数 vs 访问数

第三个元素最重要:一个按钮,切到 Klee–Minty 立方体

啊哈瞬间

按下那个按钮,同一个求解器,访问的顶点数从 2m 跳到 2m。最坏情况确实是指数级——1972 年就有人造出了反例,而七十年里真实世界没人碰到过

它什么时候不赢

除了 Klee–Minty,还有一条更要命的:要求解必须是整数的时候(排班里的「派几个人」显然是整数),问题立刻变成 NP 难的整数规划,单纯形帮不上忙,只能当分支定界的一个子步骤。真实的排班问题恰恰大多是整数的——这一条务必说出来,否则这份演示就是在骗人。

贯穿九份的五条规矩

九个题材完全不同,但演示的骨架必须是同一副。这五条是把它们变成一套东西、而不是九个孤立小玩具的全部原因。

  1. 永远两把尺子一把机器无关的计数(次数、字节、顶点、采样点),一把换算成现实单位(秒、公里、光纤根数、年)。只给一把的演示,要么没有体感,要么换台机器就不成立。
  2. 关掉的必须是一行,不是一个概念每份演示都要能指出被替换掉的那个具体函数。说不清换掉了哪一行,观众看到的就不是对照实验,是两个不相干的程序。
  3. 每一个都要给反例FFT 在小 n 上输、蒙特卡洛在低维输、压缩对随机数据输、单纯形被 Klee–Minty 卡死。不给反例的演示是广告。而且反例往往比正例更有教学价值——它说清了这个算法的前提是什么。
  4. 把物理极限画进去香农容量、克拉美-罗下界、鸽巢原理、维数灾难。观众该看到的不是「它很快」,是「它已经顶到天花板,不可能更好了」。这九个里有五个能画出这条线。
  5. 屏幕上的每个数字都要是跑出来的不许手抄。像现在那个课程站一样,把它们钉成断言,跑在闸门里——动画在骗人而没有人发现,是这类项目最大的风险。
  6. 先写下预期,再实测,把被打回的地方留在页面上这一条是做完前两份之后加的,因为它每一次都发生了:卡尔曼那份三处被打回,蒙特卡洛那份两处。而五次订正之后的结论全都比原来的强——因为订正后的那句话背后有个数。所以「被打回的记录」不该删掉,它比结论本身更有说服力:读者看到的不是一个宣称,是一个被检验过的宣称。

九份全部建成 · 被实测打回的二十七处

2026-09-07 又加了五份(10 一致性哈希 · 11 拍卖与匹配 · 12 分布式一致性 · 13 FM-index · 14 PageRank),它们自己带来 10 处订正,总数到 37。这份文档记的是最初那九份的设计——六条规矩和六个字段一个字没变,新加的五份全是照它做的;全部订正的完整版在 被打回的记录,做什么和怎么挑在 路线图

九份做下来,每一份都被打回过,最多的一份(04 压缩)三条预期一条也没对。而这些订正分成性质完全不同的三类——分开看比堆在一起有用得多。⚠ 下面是压缩过的清单,每一处的「我以为 / 实测是 / 为什么会错」摊开在 被打回的记录那一页。

A 类 · 结论错了(13 处):我在这份文档里拍的定性判断,被真数打翻。
· 05「落在 2σ 内应该 95%」→ 二维高斯是 98%,且实测 100%,指标没有区分度;「120 秒 500 米」余量只剩 7.6% → 改 400 米。
· 06「蒙特卡洛是水平线」→ 实测是下降的(测度集中);「精度越严交叉点越左」→ 三档全是 d=4,因为交叉维度 = 2 × 求积阶数
· 08「关掉 AIMD 吞吐塌一个数量级」→ 吞吐一点没变,塌的是公平;「两个开关凑一起才要命」→ 它们各管各的
· 01「二维比值 4096 倍」→ 公平比法是 64 倍(那个 N⁴ 实现没人会写);「小 n 时 DFT 更快」→ 没有交叉点
· 07「最优 ε ≈ √机器精度」→ 中心差分是 ∛机器精度,√εm 是前向差分的。
· 04「压缩比 100~400 倍」→ 实测 33.7 倍;「运动补偿最值钱」→ 只值 1.02 倍,最值钱的是熵编码(19.6 倍)。
· 09「单纯形走 2m~3m 个顶点」(流传很广的经验值)→ 实测 0.38m ~ 0.57m(标准扫描:m ∈ {10, 20, 30, 40, 60, 100},每档 40 个实例,随机流写死);站得住的是「线性于 m」这个形状,那个常数取决于你喂它什么 LP
· 02「崩点在 255q = 16 ⇒ 6.3%」→ 那是单个码字的分界;整幅图要 74 个码字全部成功 ⇒ 崩点左移到 3.6%。★ 可靠性按最弱一环算,不按平均。

B 类 · 测量本身不干净(8 处):⚠ 这一类更危险,因为它给出的是一个看起来完全正常的错数字。
· 05 拿瞬时 σ 去比整段 RMSE,得出「滤波器高估自己 1.3 倍」;用整段平均 σ 重算是 1.01
· 08「没有拥塞控制」时每条流的窗口按对数均匀分配,N=1 时它拿到区间最低端,连链路都占不满 ⇒ 量出 20% 而不是 100%;另有暖机窗口太短,时延没到稳态。
· 01 第一版 DFT 内层在调 Math.cos,把秒表比夸大成 1194 倍;配上旋转因子表后是 109 倍。
· 04 验「压缩过的还能不能再压」时用 LCG 造假字节流,LCG 低位周期极短 ⇒ 量出「还能压 6 倍」;换成真实范围编码输出,只能再省 0.19%。
· 03 安全素数生成器里随机项写成 random()*1e15远大于 2^(bits-2) ⇒ 位数被随机项支配,16 位和 44 位生成出来一样大。
· 09 第一版随机 LP 太软了(系数全正、约束不冲突):同一把标准扫描下,软的那族比值随 m 单调下降0.32 / 0.26 / 0.22 / 0.19 / 0.17 / 0.17)——连「线性于 m」都不成立;硬的一族才是 0.38 ~ 0.57,且不随 m 增长。「随机生成的实例」不等于「有代表性的实例」。
· 02 Reed–Solomon 译码器两处一起错:Chien 搜索用了数组下标 k 而非次数 N−1−k,Forney 又漏乘 X_j。只改对一处仍然是 0% 成功率 —— ⚠ 而这次运气好:错得彻底反倒好查,真正危险的是改对一处就从 0% 跳到 60%,那会让人以为方向对了。

C 类 · 检查在空转(6 处):⚠ 比 B 类还隐蔽——B 类至少给一个看起来正常的错数字,这一类连看都没看。 2026-09-07 把闸门第二关从子串搜索改成「键 → 值核对」时当场抓到, 详见 被打回的记录:03 那条断言验的是恒真的 2¹⁶ = 65536 而标签挂着 47000(页面上的数是错的); 02 的公式解出来和它自己写的数对不上;09 那七个「实测」值页面运行时根本不算;04 三处、05 一处实现漂了正文没跟; 08 三个数只有字符串核对。

⇒ ★★ A 类靠「先写预期再实测」抓;B 类只能靠「同一件事用两个独立实现各算一遍」抓;C 类只能靠「把手抄的数换成槽位、由实现在运行时填」抓——八处里有七处是页面自己的数和独立核验对不上、或者一个「本该成立的等式」不成立才暴露的。这两道关都不能省。

⇒ ★★★ 而九份做完之后,最该带走的是这一条:这二十七处订正里,没有一处是「算法本身出乎意料」——出乎意料的全都是我对它的描述。算法一直在那儿,是那些流传很广的说法(2m~3m、√机器精度、4096 倍、蒙特卡洛是水平线)在打折。而每一条订正之后的结论都比原来的强,因为它背后有个数。

建造顺序

按「先拿到能给人看的东西」排,不按重要性排。前两个一天能出原型,第三个负责让人愿意转发。

✓ 已建成
05 卡尔曼
六状态滤波器把零偏也估进状态里;惯导 104 秒飘出 400 米。3 处预期被打回。
✓ 已建成
06 蒙特卡洛
交叉点实测 d = 4,且与精度无关(= 2 × 求积阶数)。外带 Metropolis 开关。2 处被打回。
✓ 已建成
08 TCP
两个开关:RTO 管吞吐(100%→6.2%),AIMD 管公平(0.997→0.461)。4 处被打回。
✓ 已建成
01 傅里叶
一个真的 OFDM 符号 + 71.4 μs 截止线;双尺子图。3 处被打回。
✓ 已建成
07 梯度
同样的前向预算下两个决策边界并排;ε 的 U 型曲线真跑。1 处被打回。
✓ 已建成
04 压缩
一个真的编解码器(DCT/量化/块匹配/熵编码)。3 处被打回,一条也没对。
✓ 已建成
03 公钥
Eve 真跑大步小步:40 位半秒破,44 位先撑不住的是内存。1 处被打回。
✓ 已建成
09 单纯形
二维可行域上真画出爬行路径;Klee–Minty 实测恰好 2ⁿ−1,n=2…12 一次不差。2 处被打回。
✓ 已建成
02 纠错码
真的 GF(256) Reed–Solomon(BM + Chien + Forney);16 个错 100%、17 个错 0%。2 处被打回。

第一份(卡尔曼)的验收标准

九份都做完再给人看是最糟的做法。先只做卡尔曼这一份,做到底,拿它验证「关掉它」这个形式到底成不成立,再决定要不要做剩下八份。这一份的合格线是三条,缺一条都不算做完:

① 点「只信惯导」之后,120 秒内光标必须飘出 500 米以上——关掉的一瞬间屏幕上要有东西真的塌,看不见塌,这份演示就是失败的。
② 三个 RMSE 数字当场算出来,不是写死在页面上的。
③ 按下「隧道」按钮,卡尔曼的误差椭圆必须跟着变大——它知道自己不确定了。这个细节最能说明它不是魔法。

两处最容易做砸:真值轨迹如果画成直线,惯导积分几乎不飘,对比强度直接没了——必须有转弯和加减速。惯导如果只加白噪声、不加零偏随机游走,积分出来的误差是随机游走而不是二次发散,飘得既不够快也不像真的。零偏才是惯导会飘的真正原因,这一条做错,整份演示就废了。

技术形态,以及和现在那个课程站的关系

这九份不需要后端。没有一个演示要跑真的 C++——观众不写代码,他只按一个开关。全部计算在浏览器里用 JS / Canvas 做得下来(最重的是 TCP 那份的离散事件模拟和纠错码那份的 RS 编解码,都在毫秒量级)。零后端、静态站、直接挂 Cloudflare Pages,比现在那个课程站轻一个数量级。

不要复用那个仓库——题材完全不同,53 章的 CSP-J/S 教材和这九份演示没有共同的内容结构,混在一起两边都会变形。server/runner.mjslib/cxx.mjs 也一并留在原地,这里用不上。

唯一要搬过来的是 scripts/check-viz.mjs 那套机制:让页面上跑的那份实现和一份独立写的参照实现,在 Node 里跑同一批数据、逐组对答案,把屏幕上每个数字钉成断言。这九份里每一个数字都是论据,一旦演示那一侧的实现和真算法对不上,整份东西就在骗人,而且没有任何人会发现。这个风险在现在那个仓库里已经被解决过一次了——把机制搬过来,别重新想。