返回 2026-05-20
⚙️ 工程

Pythagorean AdditionPythagorean Addition

Pythagorean Addition

kqr

简而言之:与其费力地计算 \(c = \sqrt{a^2 + b^2}\),不如用“最大加最小”算法(alpha-max plus beta-min algorithm)进行心算估算。

\[\hat{c} = \mathrm{max}\left(a, 0.9a + 0.5b \right)\]

这样得到的 \(\hat{c}\) 会非常接近真实的 \(c\)。这在累加方差来源、求半径或其他类似情况时非常有用。

背景

数学关系 \(c^2 = a^2 + b^2\) 的出现频率出人意料地高。它出现在以下多个领域中:

  • 几何学(勾股定理);
  • 统计学(方差来源可叠加);
  • 物理学(质能-动量关系式)。
  • 当这个公式出现时,通常是因为其中一个变量未知,即我们需要求解的是:

  • \(? = \sqrt{a^2 + b^2}\) 或
  • \(? = \sqrt{c^2 - b^2}\)。
  • 麻烦之处在于,即使擅长估算平方和平方根(例如因之前练习过对数),这些运算在心中仍然难以完成——因为平方会使数值迅速变大。

    顿悟

    我灵光一现。也许问题在于将其视为三个独立操作(平方、相加、开方)。如果我们换个思路,把它看作一个基本的复合运算呢?我们可以称之为 \(⊞\)(Unicode 名称恰如其分:squared plus),并定义为:

    \[a ⊞ b = \sqrt{a^2 + b^2}\]

    然后我们就可以通过间隔重复训练自己心算这个运算,就像学习乘法表或对数一样。这样一来,我们再也不用为这类问题烦恼了!给定两个以标准差为单位测量的变异源,我们就能立刻知道总变异量——同样以标准差表示。这会更加直观。

    唯一的问题是我们还得学会它的逆运算:

    \[c ⊟ b = \sqrt{c^2 - b^2}\]

    ⊞ 运算应该不难掌握,因为其等高线呈从原点向外辐射的同心圆;而 ⊟ 运算可能较难,因为其等高线是形状奇特的圆锥曲线。

    前人已有研究

    看来我不是第一个想到这个问题的人。早在 20 世纪 80 年代初,IBM 就有一篇论文提出了一种让计算机高效逼近 ⊞ 运算的方法。11 Moler & Morrison 的《Replacing Square Roots by Pythagorean Sums》发表于 IBM Journal of Research and Development,1981年。这个方法非常巧妙:给定一点 (x,y),作者找到一种方法沿圆半径方向将该点向横轴方向推移,当纵坐标足够小时,横坐标即为半径。然而这类迭代算法不太适合心算。22 我听说有人能在脑中运行几次牛顿-拉夫逊法来改进近似值。我也想成为那样的人,但我还不行。

    不过,作为人类其实有更简便的方法来估算 \(a ⊞ b\)。假设 \(a\) 是较大的数(如果不是,则交换两者):

  • 计算 \(\hat{c} = 0.9a + 0.5b\)。
  • 如果 \(\hat{c}\) 小于 \(a\),则将 \(\hat{c}\) 设为 \(a\)。
  • 搞定!这就是结果。
  • 这是一种估算,确实存在误差,但最坏情况下误差仅为 3%,平均误差仅 1.5%。对于一个如此简单的步骤来说,这已经非常惊人了。需要说明的是,我们只是把较大数缩小十分之一,再加上较小数的一半,结果竟然非常接近它们平方和的平方根!

    这种方法之所以被称为 alpha-max plus beta-min,是因为虽然我们使用了 α=0.9 和 β=0.5,这只是为了便于心算,但其他参数也是存在的,其中一些甚至略微更精确。

    逆运算

    这个算法的另一个好处是它很容易进行逆运算。如果我们只知道总和 c 以及其中一项 b,就可以通过减法求出另一项:

    \[\hat{a} = 2 \left( c - 0.9b \right)\]

    或者

    \[\hat{a} = 1.11 \left( c - 0.5b \right)\]

    具体使用哪一个公式,取决于我们已知的是较小项还是较大项。

    示例

    举个例子说明如何使用这个方法:假设我们知道男性平均比女性高 12 cm。那么,在性别已知的情况下,一个人的平均身高可以看作是一个抛硬币的结果——要么 +6 cm,要么 −6 cm,因此标准差为 6 cm。同时,我们还知道男性和女性各自群体内的身高标准差约为 7 cm。

    那么,综合考虑男女两性的总体身高变异度应为:

    \[0.9 \times 7 + 0.5 \times 6 =\] \[= 6.3 + 3 = 9.3\]

    而如果我们真的在全球随机抽样测量人们的身高,得到的标准差确实会接近这个数值。这太酷了!我原本没想到自己居然能“心算”方差来源的合成。

    需要完整排版与评论请前往来源站点阅读。