复数

如果您已经学习过复数相关知识,请跳过本页面.

学习复数知识需要一部分向量基础,如果并未学习过向量知识请移步 向量页面.

复数

引入

注

下面的引入方法来自人教版高中数学 A 版必修二.

从方程的角度看,负实数能不能开平方,就是方程 x2+a=0(a>0)x^2+a=0 (a>0) 有没有解,进而可以归结为方程 x2+1=0x^2+1=0 有没有解.

回顾已有的数集扩充过程,可以看到,每次扩充都与实际需求密切相关.例如,为了解决正方形对角线的度量,以及 x2−2=0x^2-2=0 这样的方程在有理数集中无解的问题,人们把有理数集扩充到了实数集.数集扩充后,在实数集中规定的加法运算、乘法运算,与原来在有理数集中规定的加法运算、乘法运算协调一致,并且加法和乘法都满足交换律和结合律,乘法对加法满足分配律.

依照这种思想,为了解决 x2+1=0x^2+1=0 这样的方程在实数系中无解的问题,我们设想引入一个新数 i\mathrm{i},使得 x=ix=\mathrm{i} 是方程 x2+1=0x^2+1=0 的解,即使得 i2=−1\mathrm{i}^2=-1.

思考:把新引进的数 i\mathrm{i} 添加到实数集中,我们希望数 i\mathrm{i} 和实数之间仍然能像实数那样进行加法和乘法运算,并希望加法和乘法都满足交换律、结合律,以及乘法对加法满足分配律.那么,实数系经过扩充后,得到的新数系由哪些数组成呢?

依照以上设想,把实数 bb 与 i\mathrm{i} 相乘,结果记作 bib\mathrm{i};把实数 aa 与 bib\mathrm{i} 相加,结果记作 a+bia+b\mathrm{i}.注意到所有实数以及 i\mathrm{i} 都可以写成 a+bi(a,b∈R)a+b\mathrm{i}(a,b\in \mathbf{R}) 的形式,从而这些数都在扩充后的新数集中.

定义

我们定义形如 a+bia+b\mathrm{i},其中 a,b∈Ra,b\in \mathbf{R} 的数叫做 复数,其中 i\mathrm{i} 被称为 虚数单位,全体复数的集合叫做 复数集,记作 C\mathbf{C}.

复数通常用 zz 表示,即 z=a+biz=a+b\mathrm{i}.这种形式被称为 复数的代数形式.其中 aa 称为复数 zz 的 实部,记作 Re⁡(z)\operatorname{Re}(z),bb 称为复数 zz 的 虚部,记作 Im⁡(z)\operatorname{Im}(z).如无特殊说明,都有 a,b∈Ra,b\in \mathbf{R}.

对于一个复数 zz,当且仅当 b=0b=0 时,它是实数,当 b≠0b\not = 0 时,它是虚数,当 a=0a=0 且 b≠0b\not = 0 时,它是纯虚数.

纯虚数,虚数,实数,复数的关系如下图所示.

配图:complex relation

性质与运算

几何意义

我们知道了 a+bia+b\mathrm{i} 这样类似的形式的数被称为复数,并且给出了定义和分类,我们还可以挖掘一下更深层的性质.

我们把所有实数都放在了数轴上,并且发现数轴上的点与实数一一对应.我们考虑对复数也这样处理.

首先我们定义 复数相等:两个复数 z1=a+bi,z2=c+diz_1=a+b\mathrm{i},z_2=c+d\mathrm{i} 是相等的,当且仅当 a=ca=c 且 b=db=d.

这么定义是十分自然的,在此不做过多解释.

也就是说,我们可以用唯一的有序实数对 (a,b)(a,b) 表示一个复数 z=a+biz=a+b\mathrm{i}.这样,联想到平面直角坐标系,我们可以发现 复数集与平面直角坐标系中的点集一一对应.好了,我们找到了复数的一种几何意义.

那么这个平面直角坐标系就不再一般,因为平面直角坐标系中的点具有了特殊意义——表示一个复数,所以我们把这样的平面直角坐标系称为 复平面,xx 轴称为 实轴,yy 轴称为 虚轴.我们进一步地说:复数集与复平面内所有的点所构成的集合是一一对应的.

我们考虑到学过的平面向量的知识,发现向量的坐标表示也是一个有序实数对 (a,b)(a,b),显然,复数 z=a+biz=a+b\mathrm{i} 对应复平面内的点 Z(a,b)Z(a,b),那么它还对应平面向量 OZ→=(a,b)\overrightarrow{OZ}=(a,b),于是我们又找到了复数的另一种几何意义:复数集与复平面内的向量所构成的集合是一一对应的(实数 00 与零向量对应).

于是,我们由向量的知识迁移到复数上来,定义 复数的模 就是复数所对应的向量的模.复数 z=a+biz=a+b\mathrm{i} 的模 ∣z∣=a2+b2|z|=\sqrt{a^2+b^2}.

于是为了方便,我们常把复数 z=a+biz=a+b\mathrm{i} 称为点 ZZ 或向量 OZ→\overrightarrow {OZ},并规定相等的向量表示同一个复数.

并且由向量的知识我们发现,虚数不可以比较大小(但是实数是可以的).

加法与减法

对复数 z1=a+bi,z2=c+diz_1=a+b\mathrm{i},z_2=c+d\mathrm{i},定义加法规则如下:

z1+z2=(a+c)+(b+d)iz_1+z_2=(a+c)+(b+d)\mathrm{i}

很明显,两个复数的和仍为复数.

考虑到向量的加法运算,我们发现复数的加法运算符合向量的加法运算法则,这同样证明了复数的几何意义的正确性.

同样可以验证,复数的加法满足 交换律 和 结合律.即:

z1+z2=z2+z1(z1+z2)+z3=z1+(z2+z3)\begin{aligned} z_1+z_2&=z_2+z_1\\ (z_1+z_2)+z_3&=z_1+(z_2+z_3) \end{aligned}

减法作为加法的逆运算,我们可以通过加法法则与复数相等的定义来推导出减法法则:

z1−z2=(a−c)+(b−d)iz_1-z_2=(a-c)+(b-d)\mathrm{i}

这同样符合向量的减法运算.

乘法、除法与共轭

对复数 z1=a+bi,z2=c+diz_1=a+b\mathrm{i},z_2=c+d\mathrm{i},定义乘法规则如下:

z1z2=(a+bi)(c+di)=ac+bci+adi+bdi2=(ac−bd)+(bc+ad)i\begin{aligned} z_1z_2&=(a+b\mathrm{i})(c+d\mathrm{i})\\ &=ac+bc\mathrm{i}+ad\mathrm{i}+bd\mathrm{i}^2\\ &=(ac-bd)+(bc+ad)\mathrm{i} \end{aligned}

可以看出,两个复数相乘类似于两个多项式相乘,只需要把 i2\mathrm{i}^2 换成 −1-1,并将实部与虚部分别合并即可.

复数的乘法与向量的向量积形式类似.

易得复数乘法满足 交换律,结合律 和 对加法的分配律,即:

  • z1z2=z2z1z_1z_2=z_2z_1
  • (z1z2)z3=z1(z2z3)(z_1z_2)z_3=z_1(z_2z_3)
  • z1(z2+z3)=z1z2+z1z3z_1(z_2+z_3)=z_1z_2+z_1z_3

由于满足运算律,我们可以发现实数域中的 乘法公式在复数域中同样适用.

除法运算是乘法运算的逆运算,我们可以推导一下:

a+bic+di=(a+bi)(c−di)(c+di)(c−di)=ac+bdc2+d2+bc−adc2+d2i(c+di≠0)\begin{aligned} \frac{a+b\mathrm{i}}{c+d\mathrm{i}}&=\frac{(a+b\mathrm{i})(c-d\mathrm{i})}{(c+d\mathrm{i})(c-d\mathrm{i})}\\ &=\frac{ac+bd}{c^2+d^2}+\frac{bc-ad}{c^2+d^2}\mathrm{i} &(c+d\mathrm{i}\not =0) \end{aligned}

由于向量没有除法,这里不讨论与向量的关系.

为了分母实数化,我们乘了一个 c−dic-d\mathrm{i},这个式子很有意义.

对复数 z=a+biz=a+b\mathrm{i},称 a−bia-b\mathrm{i} 为 zz 的 共轭复数,通常记为 zˉ\bar z.我们可以发现,若两个复数互为共轭复数,那么它们 关于实轴对称.

对复数 z,wz,w,复数共轭有如下性质

  • z⋅zˉ=∣z∣2z\cdot\bar{z}=|z|^2
  • z‾‾=z\overline{\overline{z}}=z
  • Re⁡(z)=z+zˉ2\operatorname{Re}(z)=\dfrac{z+\bar{z}}{2},Im⁡(z)=z−zˉ2\operatorname{Im}(z)=\dfrac{z-\bar{z}}{2}
  • z±w‾=zˉ±wˉ\overline{z\pm w}=\bar{z}\pm\bar{w}
  • zw‾=zˉwˉ\overline{zw}=\bar{z}\bar{w}
  • z/w‾=zˉ/wˉ\overline{z/w}=\bar{z}/\bar{w}

辐角和辐角主值

如果设定实数单位 11 作为水平正方向,虚数单位 i\mathrm{i} 作为竖直正方向,得到的就是直角坐标视角下的复平面.

表示复数 zz 的位置,也可以借助于极坐标 (r,θ)(r, \theta) 确定.前文已经提到了 rr 为复数 zz 的模.

从实轴正向到 非零 复数 z=x+iyz=x+\mathrm{i}y 对应向量的夹角 θ\theta 满足关系:

tan⁡θ=yx\tan \theta=\frac{y}{x}

称为复数 zz 的 辐角,记为:

θ=arg⁡z\theta= \arg z

任一个 非零 复数 zz 有无穷多个辐角,故 arg⁡z\arg z 事实上是一个集合.借助开头大写的 Arg⁡z\operatorname{Arg} z 表示 其中一个特定值,满足条件:

−π<Arg⁡z≤π-\pi<\operatorname{Arg} z \le \pi

称 Arg⁡z\operatorname{Arg} z 为 辐角主值 或 主辐角.辐角就是辐角主值基础上加若干整数个(可以为零或负整数)2kπ2k\pi,即 arg⁡z={Arg⁡z+2kπ∣k∈Z}\arg z = \{\operatorname{Arg} z + 2k\pi \mid k\in \mathbf Z\}.

需要注意的是两个辐角主值相加后不一定还是辐角主值,而两个辐角相加一定还是合法的辐角.

称模小于 11 的复数,在复平面上构成的图形为 单位圆.称模等于 11 的复数为 单位复数,全体单位复数在复平面上构成的图形为 单位圆周.在不引起混淆的情况下,有时单位圆周也简称单位圆.

在极坐标的视角下,复数的乘除法变得很简单.复数乘法,模相乘,辐角相加.复数除法,模相除,辐角相减.

欧拉公式

欧拉公式(Euler's formula)1

对任意实数 xx,有

eix=cos⁡x+isin⁡x\mathrm{e}^{\mathrm{i}x}=\cos x+\mathrm{i}\sin x

在补充 复指数函数与复三角函数 的定义后,该公式可推广至全体复数.

指数函数与三角函数

对于复数 z=x+iyz=x+\mathrm{i}y,函数 f(z)=ex(cos⁡y+isin⁡y)f(z)=\mathrm{e}^x(\cos y+\mathrm{i}\sin y) 满足 f(z1+z2)=f(z1)f(z2)f(z_1+z_2)=f(z_1)f(z_2).由此给出 复指数函数 的定义:

exp⁡z=ex(cos⁡y+isin⁡y)\exp z=\mathrm{e}^x(\cos y+\mathrm{i}\sin y)

复指数函数在实数集上与实指数函数的定义完全一致.在复平面上拥有性质:

  • 模恒正:∣exp⁡z∣=exp⁡x>0|\exp z|=\exp x>0.
  • 辐角:arg⁡(exp⁡z)={y+2kπ∣k∈Z}\arg(\exp z)=\{y + 2k\pi \mid k\in\mathbf Z\}.
  • 加法定理:exp⁡(z1+z2)=exp⁡(z1)exp⁡(z2)\exp (z_1+z_2)=\exp (z_1)\exp (z_2).
  • 周期性:exp⁡z\exp z 是以 2πi2\pi \mathrm{i} 为基本周期的周期函数.如果一个函数 f(z)f(z) 的周期是某一周期的整倍数,称该周期为 基本周期.

复三角函数(也简称 三角函数)的定义如下:

cos⁡z=exp⁡(iz)+exp⁡(−iz)2\cos z=\frac{\exp (\mathrm{i}z)+\exp (-\mathrm{i}z)}{2} sin⁡z=exp⁡(iz)−exp⁡(−iz)2i\sin z=\frac{\exp (\mathrm{i}z)-\exp (-\mathrm{i}z)}{2\mathrm{i}}

若取 z∈Rz\in\mathbf{R},则由 欧拉公式 有:

cos⁡z=Re⁡(eiz)\cos z=\operatorname{Re}\left(\mathrm{e}^{\mathrm{i}z}\right) sin⁡z=Im⁡(eiz)\sin z=\operatorname{Im}\left(\mathrm{e}^{\mathrm{i}z}\right)

复三角函数在实数集上与实三角函数的定义完全一致.在复平面上拥有性质:

  • 奇偶性:正弦函数是奇函数,余弦函数是偶函数.
  • 三角恒等式:通常的三角恒等式都成立,例如平方和为 11,或者角的和差公式等.
  • 周期性:正弦与余弦函数以 2π2\pi 为基本周期.
  • 零点:实正弦与实余弦函数的全体零点,构成了复正弦与复余弦函数的全体零点.这个推广没有引进新的零点.
  • 模的无界性:复正弦与复余弦函数,模长可以大于任意给定的正数,不再像实正弦与实余弦函数一样被限制在 11 的范围内.

复数的三种形式

借助直角坐标系的视角以及极坐标系的视角,可以写出复数的三种形式.

复数的 代数形式 用于表示任意复数.

z=x+yiz=x+y\mathrm{i}

代数形式用于计算复数的加减乘除四个运算比较方便.

复数的 三角形式 和 指数形式,用于表示非零复数.

z=r(cos⁡θ+isin⁡θ)=rexp⁡(iθ)z=r(\cos \theta +\mathrm{i}\sin \theta)=r \exp (\mathrm{i}\theta)

这两种形式用于计算复数的乘除两个运算以及后面的运算较为方便.如果只用高中见过的函数,可以使用三角形式.如果引入了复指数函数,写成等价的指数形式会更加方便.

单位根

考察方程 xn=1x^n=1 在复数意义下的解.显然,这样的解有 nn 个,称这 nn 个解都是 nn 次单位(复)根(nn-th root of unity).根据复平面的知识,nn 次单位根把单位圆 nn 等分.

设 ωn=exp⁡2πin\omega_n=\exp\dfrac{2\pi \mathrm{i}}{n}(即幅角为 2π/n2\pi/n 的单位复数),则 xn=1x^n=1 的解集表示为 {ωnk∣k=0,1⋯ ,n−1}\{\omega_n^k\mid k=0,1\cdots,n-1\},其中,

wnk=exp⁡2πkin=cos⁡2πkn+isin⁡2πkn.w_n^k = \exp\dfrac{2\pi k \mathrm{i}}{n} = \cos\dfrac{2\pi k}{n} + \mathrm{i}\sin\dfrac{2\pi k}{n}.

如果不加说明,一般叙述中的 nn 次单位根,是指从 11 开始逆时针方向的第一个解,即上述 ωn\omega_n,其它解均可以用 ωn\omega_n 的幂表示.

为什么通常提到 nn 次单位根,总是特指第一个?

主要是为了应用时方便.所有 nn 次单位根都可以表示为第一个 nn 次单位根 ωn\omega_n 的幂次;而且,对于任意 k<nk < n,复数 ωn\omega_n 都不是 kk 次单位根.

本原单位根

事实上,nn 次单位根中满足类似性质的不止 ωn\omega_n 一个.称集合

{ωnk∣0≤k<n, gcd⁡(n,k)=1}\{\omega_n^k\mid 0\le k<n,~\gcd(n,k)=1\}

中的元素为 nn 次本原单位根(nn-th primitive root of unity).根据上述表达式可知,全体 nn 次本原单位根共有 φ(n)\varphi(n) 个,其中,φ(n)\varphi(n) 为 欧拉函数.

任意一个本原单位根 ω\omega,都与上述 ωn\omega_n 具有相同的性质:对于任意的 0<k<n0<k<n,ω\omega 的 kk 次幂不为 11,也就是说,ω\omega 不是 kk 次单位根.因此,借助任意一个本原单位根,都可以生成全体单位根.

为了理解 nn 次本原单位根的结构,需要考虑单位根的如下性质:

性质

对于整数 nn 和 kk,设 d=gcd⁡(n,k)d=\gcd(n,k),有 ωnk=ωn/dk/d\omega_n^k = \omega_{n/d}^{k/d}.

证明

直接计算可知

wnk=exp⁡2πkin=exp⁡2π(k/d)in/d=ωn/dk/d.w_n^k = \exp\dfrac{2\pi k\mathrm{i}}{n} = \exp\dfrac{2\pi (k/d)\mathrm{i}}{n/d} = \omega_{n/d}^{k/d}.

这说明,只要 gcd⁡(n,k)≠1\gcd(n,k)\neq 1,那么,ωnk\omega_n^k 就一定是 ngcd⁡(n,k)\dfrac{n}{\gcd(n,k)} 次(本原)单位根.因此,满足前述性质的单位根 ωnk\omega_n^k 一定是满足 gcd⁡(n,k)=1\gcd(n,k)=1.这正是本原单位根具有上述定义的原因.

另外,作为这些分析的简单推论,有:

定理

当 kk 遍历 nn 的因数,所有 kk 次本原单位根恰构成 nn 次单位根的一个划分.而且,对于 ℓ⊥n\ell\perp n,映射 x↦xℓx\mapsto x^\ell 给出 nn 次单位根之间的双射,且保持上述划分不变:它将 k∣nk\mid n 次本原单位根仍然映射到 kk 次本原单位根.

尽管本原单位根有很多选择,但是由于第一个根 ωn\omega_n 形式最为简单,算法竞赛中还是 ωn\omega_n 最为常用.对于部分场景,为提高计算效率,还可以考虑用某一模数下的 本原单位根 代替复数域中的 ωn\omega_n.

编程语言中的复数

C 中的复数

在 C99 标准中,有 <complex.h> 头文件.

在 <complex.h> 头文件中,提供了 double complex、float complex 和 long double complex 三种类型.

算术运算符'+'、'-'、'*'和'/',可以用于浮点数和复数的任意混合.当表达式两端有一个为复数时,计算结果为复数.

头文件 <complex.h> 提供了虚数单位 I,引入此头文件时,大写字母 I 不可以作为变量名使用.

对于单个复数,<complex.h> 提供了若干操作:creal 函数用于提取实部,cimag 函数用于提取虚部,cabs 函数用于计算模,carg 函数用于计算辐角主值.

所有的函数根据类型不同,都有三个.例如 creal 函数有 creal、crealf、creall 三个,用于处理对应的 double、float 和 long double 三种类型.末尾什么都不带的默认处理 double 类型.以下所有函数均遵从此规律,不再特别说明.

这些函数返回值都是一般的浮点数.可以将普通浮点数直接赋值给复数,但是不可以将复数直接赋值给浮点数,而是需要使用上述提取操作.

函数 conj 用于计算共轭复数,返回值是复数.

函数 cexp 计算复指数,clog 计算对数主值,csin 计算正弦,ccos 计算余弦,ctan 计算正切.

函数 cpow 计算幂函数,csqrt 计算平方根,casin 计算反正弦,cacos 计算反余弦,catan 计算反正切.这部分函数计算的全部都是多值函数的主值.

C++ 中的复数

在 C 里面的 <ctype.h>,到 C++ 会变成 <cctype>,几乎所有的头文件遵从这个命名规律.

但是,<complex.h> 不遵守,C++ 没有 <ccomplex> 头文件.C++ 的复数直接是 <complex>,并且装的东西和 C 完全不一样.

很有趣.这是因为,在 C++ 的第一个版本 C++98,即已经有了 <complex>,而 C 语言在 C99 才添加.

在 C++ 中,复数类型定义使用 complex<float>、complex<double> 和 complex<long double>.由于面向对象的多态性,下面函数的名字都是唯一的,无需 f 或 l 的后缀.

一个复数对象拥有成员函数 real 和 imag,可以访问实部和虚部.

一个复数对象拥有非成员函数 real、imag、abs、arg,返回实部、虚部、模和辐角.

一个复数对象还拥有非成员函数:norm 为模的平方,conj 为共轭复数.

一个复数对象还拥有非成员函数 exp、log(底为 e\mathrm{e} 的对数主值)、log10(底为 10 的对数主值,C 中没有)、pow、sqrt、sin、cos、tan,含义与 C 中的含义相同.

在 C++14 及以后的版本中,定义了 字面量运算符 std::literals::complex_literals::""if, ""i, ""il.例如输入 100if、100i 和 100il,三者将分别返回 std::complex<float>{0.0f, 100.0f}、std::complex<double>{0.0, 100.0} 以及 std::complex<long double>{0.0l, 100.0l}.这使得我们可以方便地书写形如 auto z = 4.0 + 3i 的复数声明.

参考资料与链接

Footnotes

  1. 有关欧拉公式的更多介绍,可以参考两个视频:欧拉公式与初等群论、微分方程概论 - 第五章:在 3.14 分钟内理解 eiπ\mathrm{e}^{\mathrm{i}\pi}. ↩

本文内容来自 OI Wiki《复数》;作者与修订历史见原文。AIOJ 对排版、站内链接和资源路径做了格式适配。

内容依 CC BY-SA 4.0 与 SATA 许可共享;附加条款以原文声明为准。感谢 OI Wiki 作者与贡献者;请按 SATA 约定前往 OI Wiki 仓库 Star 支持。