三角形式与乘法的旋转
直角坐标写法 让加减法一目了然,乘除法却看不出几何意义。换一组参数(到原点的距离,与从实轴正方向转过的角),乘法立刻变成两个简单动作的合成。本页给出这套写法、它对乘法与开方的解释,以及辐角在实现里的两处坑。
1 · 辐角与三角形式
定义 1.1(辐角与三角形式) 非零复数 对应的向量与实轴正方向的夹角 叫做 的辐角,满足 、()。于是 ,这叫三角形式。辐角相差 的整数倍的角都是辐角,落在指定区间内的那一个叫辐角主值。
零复数的模为零,方向无从谈起,故它没有辐角。区间的选法是约定:课本取 ,复分析文献多取 。两套在负虚部一侧差一整圈: 在前一套里是 ,在后一套里是 。
实现上这条约定要自己接:Math.atan2 返回的是
,负值加一圈才落到
。折算时另有两处实测值得记:
Math.atan2(0, 0)返回0,而零复数的辐角本无定义。核心模块的arg因此先判零、返回null,不让这个0混进后续的角度运算。-
Math.atan2(0, -0)是 而Math.atan2(-0, -0)是 。负零把同一个方向劈成了两个返回值;换算到 之后 也落回 ,这条区间约定顺手把分歧吃掉了。若当初选的是 , 与它的共轭会拿到两个差一整圈的辐角主值。
2 · 乘法的旋转与伸缩
定理 2.1 设 、,则 即模相乘、辐角相加。除法对应模相除、辐角相减。
证明 按展开式相乘,实部为 ,虚部为 。两个括号分别是余弦与正弦的和角公式,收拢即得。∎
这条定理把乘法读成了几何动作:乘 就是把 绕原点转 、再伸长到 倍。模为 的因子只转不伸, 是其中最常用的一个:乘 即逆时针转 ,而 在这个视角下不再是规定,是「转两次 等于取相反数」。反复取幂即得棣莫弗公式 。
单测验这条定理时不重算和角公式,而是拿一个与复数无关的参照:乘
等价于矩阵
作用在向量
上,那个矩阵就是「转
、伸
倍」的旋转伸缩矩阵。两条路径逐个取值比对,偏差在 1e-12 以内。
3 · 开方与 n 次单位根
开方是取幂的逆运算:求 使 。在三角形式下这件事变得机械,只需模开 次算术根、辐角除以 ,再逐个加 :
非零复数的 次方根恰有 个,模全相同,故均匀分布在同一个圆上,连起来是正 边形。 那一组叫 次单位根,它们之和为零(正多边形的重心在中心)。
与实数开方的对比在负数上最直接:Math.sqrt(-4) 是 NaN,而
在复数意义下有两个平方根
。实测取到的两个根是 1.225e-16 + 2i 与 -3.674e-16 - 2i——实部那条 1e-16 尾巴来自
,数学上应为零。所以「
的平方根不存在」这句话只在实数范围内成立,而 NaN 表达的就是这个范围限制,不是运算本身无解。
单测拿两件事验单位根,都不重算构造公式:逐个把根代回
(用重复相乘)看与
的残差,以及量相邻两根的商的辐角是否恰为
。残差随
增长,
与最大残差实测如下:
时 7.348e-16,
时 6.110e-15,
时 9.438e-14,
时 1.008e-12。大致线性,因为
次乘法各贡献一份舍入。这批数字推翻了单测最初的容差:原先按 4e-16 乘
给上限,看着与线性增长相称,但
那一档实测 1.460e-15 直接越过 1.2e-15 的上限——小
处有一段与
无关的固定开销。改成常数项加线性项之后才稳定通过。
4 · 单位根与傅里叶变换的旋转因子
次单位根不是一个孤立的构造。欧拉公式把三角形式写成 ,单位根就是 ,而离散傅里叶变换的每一项系数正是这些数与样本的乘积。把信号「缠绕」在转速为 的圆上,靠的就是辐角均匀分布这一条。这条线索的完整叙述见 旋转的向量:复指数 与 DFT:逐个频率探针。
本页的开方与那边的变换共用同一个几何事实:把圆等分成 份。差别只在读法:本页问「哪些数的 次幂等于 」,傅里叶那边问「信号里含哪些转速」。
5 · 参考文献
- De Moivre's formula. Wikipedia. 棣莫弗公式:取幂时模取幂、辐角乘倍。https://en.wikipedia.org/wiki/De_Moivre%27s_formula
- Root of unity. Wikipedia. n 次单位根及其在圆上的均匀分布。https://en.wikipedia.org/wiki/Root_of_unity
- Argument (complex analysis). Wikipedia. 辐角与辐角主值的两套区间约定。https://en.wikipedia.org/wiki/Argument_(complex_analysis)
- Euler's formula. Wikipedia. 欧拉公式,三角形式的指数写法。https://en.wikipedia.org/wiki/Euler%27s_formula
- Math.atan2(). MDN. atan2 的返回区间与它在原点、负零上的取值。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2