模与距离给出的轨迹
复数的加减法已经与向量对上(见 四则运算与 i 的幂 §1),还缺一个长度。模补上这一项:它把「距离」这个几何量交给代数,于是一批轨迹问题可以只用一个绝对值记号写出来。
1 · 模的定义与几何意义
定义 1.1(模) 的模是 ,即 对应的点到原点的距离,也是对应向量的长度。
模是非负实数, 当且仅当 。它与共轭的关系是 ,这一条把开方去掉了:比较两个模的大小时用 更省事,也更准。
实现里
走 Math.hypot 而不是 Math.sqrt(a * a + b * b)。原因在两端:
时
溢出成 Infinity,开方仍是 Infinity,而 Math.hypot 给 1.414213562373095e200;
时
下溢成 0,开方得 0,而 Math.hypot 给 1.414213562373095e-200。高中题目撞不到这两端,选 hypot 的理由是别的:读数面板上一个 Infinity 或一个 0 会让人以为算法错了,而病根在中间那步平方。
2 · 乘法性与三角不等式
模与乘除相容:,()。加法则只有不等式。
定理 2.1(三角不等式) 对任意复数 、,有 ,等号当且仅当 与 同向(其中之一为零,或 且 )时成立。另有下界 。
证明 把两个复数看作向量。 是三角形第三边的长度, 与 是另两边,两边之和不小于第三边即得上界;三点共线且方向相同时三角形退化成一条线段,此时取等。下界由上界改写而来:,移项得 , 与 互换再取两式的较大者即可。∎
单测按定义验这条不等式:20 万组随机取值下
一次也没出现,取等的那批用
构造(
取
这类无理数时差值仍为 0)。这类测试不比对某个公式的返回值,只比对两个量的大小关系,因此它能兼查实现与推导。
3 · 距离条件给出的轨迹
是两点间的距离,因为 对应从 指向 的向量。距离条件可直接翻译成轨迹:
| 条件 | 轨迹 | 退化情形 |
|---|---|---|
| 以 为心、 为半径的圆 | 时是一个点, 时是空集 | |
| 圆盘(含边界) | 同上 | |
| 线段 的中垂线 | 时是整个平面 |
第三行值得算一遍。两边平方并把 展开, 与 两项在等式两侧同时出现、整体消去,只剩一次式:
二次项消失正是「轨迹是直线」的代数表现。 时三个系数同时为零,方程成了 ——它不是一条直线,而是整个平面。实现必须为这一支单列出口:照上式返回一条 的「直线」,画板上得到的是一串 NaN 坐标,而 NaN 在 SVG 里只表现为「这条线没画出来」,排查起来比抛错慢得多。
沿圆取 720 个点逐点验算,
的最大值在 1e-15 量级(、
一档实测 8.882e-16);中垂线上取 121 个点,两个距离之差最大 3.553e-15(、
一档;坐标为整数且中点落在网格上的那几档差值恰为 0)。单测的容差据此取 1e-14 与 1e-13,比实测量级宽一个数量级——留出余量,但不至于宽到放过真正的错误。
4 · 距离之和与距离之差
同一套翻译再往下走一步就出圆锥曲线。( 大于两定点的距离)是以 、 为焦点的椭圆,( 小于两定点的距离)是双曲线。两条定义与它们的标准方程见 椭圆的定义与标准方程 与 双曲线与渐近线。
复数记号在这类问题上的价值在于条件的形式与几何意义贴得更近:一个绝对值就是一段距离,等式左边有几个绝对值,就有几段距离参与约束。
5 · 参考文献
- Absolute value. Wikipedia. 绝对值与复数的模,含它的乘法性。https://en.wikipedia.org/wiki/Absolute_value
- Triangle inequality. Wikipedia. 三角不等式及其取等条件。https://en.wikipedia.org/wiki/Triangle_inequality
- Locus (mathematics). Wikipedia. 轨迹的定义:满足给定条件的点集。https://en.wikipedia.org/wiki/Locus_(mathematics)
- Bisection. Wikipedia. 中垂线的定义与它的等距刻画。https://en.wikipedia.org/wiki/Bisection
- Math.hypot(). MDN. hypot 的定义,以及它对溢出与下溢的处理。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot