咔嗒

一面墙, 两个方块. 数一数它们一共撞了几次, 数出来的是 π.

今天凌晨刷 B 站, 刷到一个标题: 《1 公斤 vs 古戈尔普勒克斯公斤: 有多少次咔嗒声?》. 视频没有旁白, 我只读到了简介里的章节目录: "1 kg 对 1 kg: 3 声咔嗒", "100 kg: 31", "10,000 kg: 314", 然后是 "10 亿 kg: π 去哪了?".

我想自己算一遍. 算着算着, 就有了上面这个.

规则

左边一面墙. 墙和大方块之间放一个 1 kg 的小方块, 静止. 大方块从右边撞过来. 所有碰撞都是完全弹性的, 没有摩擦. 数所有的碰撞: 小方块撞大方块, 加上小方块撞墙.

质量相等时撞 3 次. 大方块是 100 倍时撞 31 次, 10000 倍时撞 314 次. 质量比每乘 100, π 就多出一位.

为什么是 π, Galperin 在 2003 年的论文里给了一个很漂亮的解释: 把两个方块的位置当成平面上一个点的两个坐标, 再把坐标各乘上 √质量, 两个方块的运动就变成了这个点在一个夹角里打台球, 夹角 θ = arctan √(m/M). 一条直线在角里反射的次数, 就是 π/θ 取整.

我算出来的

我用 Python 模拟了一遍: 用精确的分数算到 10⁴ (再往上分母会大得算不动), 用普通浮点数算到 10¹⁰. 再用公式 N = ⌊π/θ⌋ 从 10² 算到 10¹⁰. 重叠的部分三种结果完全一样:

质量比碰撞次数
13
1010
10²31
10³99
10⁴314
10⁵993
10⁶3141
10⁷9934
10⁸31415
10⁹99345
10¹⁰314159

奇数次方那一行不是乱码. 99, 993, 9934, 99345, 这是 π·√10 = 9.93458… 的数字. θ 很小时 arctan x ≈ x, 碰撞次数约等于 π / √(10⁻ᵏ) = π·10^(k/2). k 是奇数时, 10^(k/2) 里多出一个 √10. 所以 "10 亿 kg: π 去哪了", 我猜答案是: 它乘上了 √10. 不过我没看过那个视频, 不知道它是怎么讲的.

例外是第二行. 质量比 10 时撞 10 次, 不是 π·√10 给的 9. 因为这时 θ = arctan √0.1 ≈ 0.3063, 比 √0.1 ≈ 0.3162 小了 3%, "θ ≈ x" 还不成立. 我很喜欢这个 10: 它看起来像错了, 其实是近似还没开始管用的地方.

那一串 9

再仔细一点: 1/arctan x 比 1/x 稍大, 大约多出 x/3. 所以 π/θ 比 π·10ⁿ 多出一点点, 大约 π/(3·10ⁿ). 碰撞次数是 π/θ 取整, 多出的这一点点平时不影响结果. 只有一种情况会: π 的第 n 位后面紧跟着一长串 9, 长到差不多 n 个, 这一点点就会让它进位, 最后几位全错.

推到这里, 我去读了 Galperin 的原文. 他在第 9、10 节写的正是这件事. 他把 "这种情况永远不会发生" 留成了一个猜想: 要证明它, 就得知道 π 的数字里不会在那种位置出现那么长的一串 9, 而现在没有人能证明这一点. 他还引了澳大利亚数学家 van der Poorten 的回信, 大意是: 以今天的数学, 离回答这个问题还很远.

所以 "碰撞次数就是 π 的数字" 这句话, 严格地说, 后面还跟着一个没人能去掉的 "大概".

π 里最有名的一串 9 是 "费曼点": 小数点后第 762 位起, 连续六个 9. 质量比取 10¹⁵³⁴ 时, 碰撞次数是一个 768 位数, 结尾正好停在 …134999999. 六个 9 离进位需要的七百多个还差得远, 所以这次计数一位不差. 上面 "费曼点" 那个按钮算的就是它.

至于古戈尔普勒克斯 (10 的 10¹⁰⁰ 次方) 公斤: 按同一个公式, 碰撞次数有 5×10⁹⁹ + 1 位. 视频章节写的是 "5 × 10^99 位数字", 对得上. 这个数没法算, 它的位数本身就是 5 后面跟 99 个 0.

怎么做的

模拟按 "下一次碰撞什么时候发生" 来推进, 不按固定的时间步长. 写的时候发现一件让人放心的事: 两种碰撞一定是交替发生的. 两块相撞之后它们一定分开, 下一次只能是小方块撞墙; 撞墙之后小方块往回走, 下一次只能是撞大方块. 所以计数只由速度的变化决定, 浮点数的位置误差影响不了它. 网页里能模拟到 10¹⁰, 也就是 314159 次.

再大的质量比用 BigInt 直接算公式: 用 Machin 公式算 π, 用级数算 arctan, 精度取 k + 30 位. 如果商的小数部分太靠近整数, 页面会说 "精度不够", 不猜. 页面的算法, 我和一个保护位多一倍, 单独写的 Python 版本对过: 10² 到 10¹²⁰ 的每一个, 加上 10⁴⁹⁹, 10⁵⁰⁰, 10¹⁵³³, 10¹⁵³⁴, 10¹⁹⁹⁹, 10²⁰⁰⁰, 一共 125 个, 全部一样.

声音默认关着. 打开以后, 质量比大的时候, 咔嗒声会在大方块贴近墙的那一瞬间连成一阵嗡嗡声.

参考

  • G. Galperin, Playing pool with π (the number π from a billiard point of view), Regular and Chaotic Dynamics 8(4), 2003. 我读的是 都柏林圣三一学院上的 PDF. 设定, 次数公式 [π/θ], 第 9, 10 节关于连续的 9 的讨论和猜想, 以及 van der Poorten 的回信, 都出自这里.
  • B 站视频 BV1QZxR6GEnJ 的简介 (章节目录). 简介说它搬运自 TumbleWorks 的 "1 kg vs a GOOGOLPLEX kg: How Many Clacks?". 视频本身我没看过, 页面里引用的只有章节标题.
  • 表格里的次数, π·√10 的解释, k = 1 的例外, "多出约 π/(3·10ⁿ)" 的推导, 费曼点的位置 (第 762 位) 和 10¹⁵³⁴ 的计数, 都是我自己算的. 推导那一段是我先推出来, 后来才在 Galperin 的原文里读到同样的结论.

勘误

暂无.