数学 / 复数 · 一个点、一次旋转 / 模与距离给出的轨迹 待审核 4 / 5
|z − z₀| = r

模与距离给出的轨迹

复数的加减法已经与向量对上(见 四则运算与 i 的幂 §1),还缺一个长度。模补上这一项:它把「距离」这个几何量交给代数,于是一批轨迹问题可以只用一个绝对值记号写出来。

1 · 模的定义与几何意义

定义 1.1(模) z=a+biz = a + bi 的模是 z=a2+b2|z| = \sqrt{a^2 + b^2},即 zz 对应的点到原点的距离,也是对应向量的长度。

模是非负实数,z=0|z| = 0 当且仅当 z=0z = 0。它与共轭的关系是 zzˉ=z2z \bar z = |z|^2,这一条把开方去掉了:比较两个模的大小时用 z2|z|^2 更省事,也更准。

实现里 z|z|Math.hypot 而不是 Math.sqrt(a * a + b * b)。原因在两端:a=b=10200a = b = 10^{200}a2a^2 溢出成 Infinity,开方仍是 Infinity,而 Math.hypot1.414213562373095e200a=b=10200a = b = 10^{-200}a2a^2 下溢成 0,开方得 0,而 Math.hypot1.414213562373095e-200。高中题目撞不到这两端,选 hypot 的理由是别的:读数面板上一个 Infinity 或一个 0 会让人以为算法错了,而病根在中间那步平方。

2 · 乘法性与三角不等式

模与乘除相容:zw=zw|zw| = |z| \cdot |w|z/w=z/w|z / w| = |z| / |w|w0w \ne 0)。加法则只有不等式。

定理 2.1(三角不等式) 对任意复数 zzww,有 z+wz+w|z + w| \le |z| + |w|,等号当且仅当 zzww 同向(其中之一为零,或 w=kzw = kzk>0k > 0)时成立。另有下界 zwzw|z - w| \ge \big| |z| - |w| \big|

证明 把两个复数看作向量。z+w|z + w| 是三角形第三边的长度,z|z|w|w| 是另两边,两边之和不小于第三边即得上界;三点共线且方向相同时三角形退化成一条线段,此时取等。下界由上界改写而来:z=(zw)+wzw+w|z| = |(z - w) + w| \le |z - w| + |w|,移项得 zwzw|z| - |w| \le |z - w|zzww 互换再取两式的较大者即可。∎

单测按定义验这条不等式:20 万组随机取值下 z+w>z+w|z + w| > |z| + |w| 一次也没出现,取等的那批用 w=kzw = kz 构造(kk2\sqrt 2 这类无理数时差值仍为 0)。这类测试不比对某个公式的返回值,只比对两个量的大小关系,因此它能兼查实现与推导。

3 · 距离条件给出的轨迹

zz0|z - z_0| 是两点间的距离,因为 zz0z - z_0 对应从 z0z_0 指向 zz 的向量。距离条件可直接翻译成轨迹:

表 3-1 · 三种距离条件、它们的轨迹与退化情形。
条件 轨迹 退化情形
zz0=r\lvert z - z_0 \rvert = r z0z_0 为心、rr 为半径的圆 r=0r = 0 时是一个点,r<0r < 0 时是空集
zz0r\lvert z - z_0 \rvert \le r 圆盘(含边界) 同上
zz1=zz2\lvert z - z_1 \rvert = \lvert z - z_2 \rvert 线段 z1z2z_1 z_2中垂线 z1=z2z_1 = z_2 时是整个平面

第三行值得算一遍。两边平方并把 zz12=(xx1)2+(yy1)2|z - z_1|^2 = (x - x_1)^2 + (y - y_1)^2 展开,x2x^2y2y^2 两项在等式两侧同时出现、整体消去,只剩一次式:

2(x2x1)x+2(y2y1)y+(x12+y12x22y22)=02(x_2 - x_1)x + 2(y_2 - y_1)y + (x_1^2 + y_1^2 - x_2^2 - y_2^2) = 0

二次项消失正是「轨迹是直线」的代数表现。z1=z2z_1 = z_2 时三个系数同时为零,方程成了 0=00 = 0——它不是一条直线,而是整个平面。实现必须为这一支单列出口:照上式返回一条 A=B=C=0A = B = C = 0 的「直线」,画板上得到的是一串 NaN 坐标,而 NaN 在 SVG 里只表现为「这条线没画出来」,排查起来比抛错慢得多。

图 3-1 · 距离条件给出的三种轨迹。可切换条件并拖动定点与半径,读数逐点给出取样点到定点的距离与沿轨迹取样的最大偏差。

沿圆取 720 个点逐点验算,zz0r\big| |z - z_0| - r \big| 的最大值在 1e-15 量级(z0=1.52iz_0 = 1.5 - 2ir=3r = 3 一档实测 8.882e-16);中垂线上取 121 个点,两个距离之差最大 3.553e-15z1=2+iz_1 = -2 + iz2=3+4iz_2 = 3 + 4i 一档;坐标为整数且中点落在网格上的那几档差值恰为 0)。单测的容差据此取 1e-141e-13,比实测量级宽一个数量级——留出余量,但不至于宽到放过真正的错误。

4 · 距离之和与距离之差

同一套翻译再往下走一步就出圆锥曲线。zz1+zz2=2a|z - z_1| + |z - z_2| = 2a2a2a 大于两定点的距离)是以 z1z_1z2z_2 为焦点的椭圆,zz1zz2=2a\big| |z - z_1| - |z - z_2| \big| = 2a2a2a 小于两定点的距离)是双曲线。两条定义与它们的标准方程见 椭圆的定义与标准方程双曲线与渐近线

复数记号在这类问题上的价值在于条件的形式与几何意义贴得更近:一个绝对值就是一段距离,等式左边有几个绝对值,就有几段距离参与约束。

5 · 参考文献

  1. Absolute value. Wikipedia. 绝对值与复数的模,含它的乘法性。https://en.wikipedia.org/wiki/Absolute_value
  2. Triangle inequality. Wikipedia. 三角不等式及其取等条件。https://en.wikipedia.org/wiki/Triangle_inequality
  3. Locus (mathematics). Wikipedia. 轨迹的定义:满足给定条件的点集。https://en.wikipedia.org/wiki/Locus_(mathematics)
  4. Bisection. Wikipedia. 中垂线的定义与它的等距刻画。https://en.wikipedia.org/wiki/Bisection
  5. Math.hypot(). MDN. hypot 的定义,以及它对溢出与下溢的处理。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot