数学 / 复数 · 一个点、一次旋转 / 三角形式与乘法的旋转 待审核 5 / 5
旋转 + 伸缩

三角形式与乘法的旋转

直角坐标写法 a+bia + bi 让加减法一目了然,乘除法却看不出几何意义。换一组参数(到原点的距离,与从实轴正方向转过的角),乘法立刻变成两个简单动作的合成。本页给出这套写法、它对乘法与开方的解释,以及辐角在实现里的两处坑。

1 · 辐角与三角形式

定义 1.1(辐角与三角形式) 非零复数 zz 对应的向量与实轴正方向的夹角 θ\theta 叫做 zz 的辐角,满足 a=rcosθa = r\cos\thetab=rsinθb = r\sin\thetar=zr = |z|)。于是 z=r(cosθ+isinθ)z = r(\cos\theta + i\sin\theta),这叫三角形式。辐角相差 360°360° 的整数倍的角都是辐角,落在指定区间内的那一个叫辐角主值。

零复数的模为零,方向无从谈起,故它没有辐角。区间的选法是约定:课本取 [0,2π)[0, 2\pi),复分析文献多取 (π,π](-\pi, \pi]。两套在负虚部一侧差一整圈:z=iz = -i 在前一套里是 270°270°,在后一套里是 90°-90°

实现上这条约定要自己接:Math.atan2 返回的是 (π,π](-\pi, \pi],负值加一圈才落到 [0,2π)[0, 2\pi)。折算时另有两处实测值得记:

  • Math.atan2(0, 0) 返回 0,而零复数的辐角本无定义。核心模块的 arg 因此先判零、返回 null,不让这个 0 混进后续的角度运算。
  • Math.atan2(0, -0)π\piMath.atan2(-0, -0)π-\pi。负零把同一个方向劈成了两个返回值;换算到 [0,2π)[0, 2\pi) 之后 π-\pi 也落回 π\pi,这条区间约定顺手把分歧吃掉了。若当初选的是 (π,π](-\pi, \pi]1+0i-1 + 0i 与它的共轭会拿到两个差一整圈的辐角主值。

2 · 乘法的旋转与伸缩

定理 2.1z1=r1(cosθ1+isinθ1)z_1 = r_1(\cos\theta_1 + i\sin\theta_1)z2=r2(cosθ2+isinθ2)z_2 = r_2(\cos\theta_2 + i\sin\theta_2),则 z1z2=r1r2[cos(θ1+θ2)+isin(θ1+θ2)]z_1 z_2 = r_1 r_2\big[\cos(\theta_1 + \theta_2) + i\sin(\theta_1 + \theta_2)\big] 即模相乘、辐角相加。除法对应模相除、辐角相减。

证明 按展开式相乘,实部为 r1r2(cosθ1cosθ2sinθ1sinθ2)r_1 r_2(\cos\theta_1\cos\theta_2 - \sin\theta_1\sin\theta_2),虚部为 r1r2(sinθ1cosθ2+cosθ1sinθ2)r_1 r_2(\sin\theta_1\cos\theta_2 + \cos\theta_1\sin\theta_2)。两个括号分别是余弦与正弦的和角公式,收拢即得。∎

这条定理把乘法读成了几何动作:乘 z2z_2 就是把 z1z_1 绕原点转 θ2\theta_2、再伸长到 r2r_2 倍。模为 11 的因子只转不伸,ii 是其中最常用的一个:乘 ii 即逆时针转 90°90°,而 i2=1i^2 = -1 在这个视角下不再是规定,是「转两次 90°90° 等于取相反数」。反复取幂即得棣莫弗公式 zn=rn(cosnθ+isinnθ)z^n = r^n(\cos n\theta + i \sin n\theta)

单测验这条定理时不重算和角公式,而是拿一个与复数无关的参照:乘 ww 等价于矩阵 (cddc)\begin{pmatrix} c & -d \\ d & c \end{pmatrix} 作用在向量 (a,b)(a, b) 上,那个矩阵就是「转 argw\arg w、伸 w|w| 倍」的旋转伸缩矩阵。两条路径逐个取值比对,偏差在 1e-12 以内。

图 2-1 · 三角形式下的乘法与开方。乘法一栏可调两个复数的模与辐角,读数对照模之积与辐角之和;开方一栏可调开方次数,读数给出相邻夹角与逐个代回的残差。

3 · 开方与 n 次单位根

开方是取幂的逆运算:求 ww 使 wn=zw^n = z。在三角形式下这件事变得机械,只需模开 nn 次算术根、辐角除以 nn,再逐个加 360°/n360°/n

wk=rn(cosθ+360°kn+isinθ+360°kn),k=0,1,,n1w_k = \sqrt[n]{r}\left(\cos\frac{\theta + 360°k}{n} + i\sin\frac{\theta + 360°k}{n}\right), \quad k = 0, 1, \dots, n-1

非零复数的 nn 次方根恰有 nn 个,模全相同,故均匀分布在同一个圆上,连起来是正 nn 边形。z=1z = 1 那一组叫 nn 次单位根,它们之和为零(正多边形的重心在中心)。

与实数开方的对比在负数上最直接:Math.sqrt(-4)NaN,而 4-4 在复数意义下有两个平方根 ±2i\pm 2i。实测取到的两个根是 1.225e-16 + 2i-3.674e-16 - 2i——实部那条 1e-16 尾巴来自 cos90°\cos 90°,数学上应为零。所以「4-4 的平方根不存在」这句话只在实数范围内成立,而 NaN 表达的就是这个范围限制,不是运算本身无解。

单测拿两件事验单位根,都不重算构造公式:逐个把根代回 znz^n(用重复相乘)看与 11 的残差,以及量相邻两根的商的辐角是否恰为 360°/n360°/n。残差随 nn 增长,nn 与最大残差实测如下:n=4n = 47.348e-16n=12n = 126.110e-15n=100n = 1009.438e-14n=1000n = 10001.008e-12。大致线性,因为 n1n - 1 次乘法各贡献一份舍入。这批数字推翻了单测最初的容差:原先按 4e-16nn 给上限,看着与线性增长相称,但 n=3n = 3 那一档实测 1.460e-15 直接越过 1.2e-15 的上限——小 nn 处有一段与 nn 无关的固定开销。改成常数项加线性项之后才稳定通过。

4 · 单位根与傅里叶变换的旋转因子

nn 次单位根不是一个孤立的构造。欧拉公式把三角形式写成 z=reiθz = re^{i\theta},单位根就是 ei2πk/ne^{i \cdot 2\pi k / n},而离散傅里叶变换的每一项系数正是这些数与样本的乘积。把信号「缠绕」在转速为 kk 的圆上,靠的就是辐角均匀分布这一条。这条线索的完整叙述见 旋转的向量:复指数DFT:逐个频率探针

本页的开方与那边的变换共用同一个几何事实:把圆等分成 nn 份。差别只在读法:本页问「哪些数的 nn 次幂等于 zz」,傅里叶那边问「信号里含哪些转速」。

5 · 参考文献

  1. De Moivre's formula. Wikipedia. 棣莫弗公式:取幂时模取幂、辐角乘倍。https://en.wikipedia.org/wiki/De_Moivre%27s_formula
  2. Root of unity. Wikipedia. n 次单位根及其在圆上的均匀分布。https://en.wikipedia.org/wiki/Root_of_unity
  3. Argument (complex analysis). Wikipedia. 辐角与辐角主值的两套区间约定。https://en.wikipedia.org/wiki/Argument_(complex_analysis)
  4. Euler's formula. Wikipedia. 欧拉公式,三角形式的指数写法。https://en.wikipedia.org/wiki/Euler%27s_formula
  5. Math.atan2(). MDN. atan2 的返回区间与它在原点、负零上的取值。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2