此博客仅讲述入门部分,没有复数的辐角、三角函数等部分。
零、前置知识
- 向量
一、复数的引入、定义与分类
1. 引入
从方程角度看,负实数 − a ( a > 0 ) - a (a > 0) −a(a>0) 没有偶次方根,其实就是方程 x 2 k + a = 0 ( a > 0 , k ∈ Z ) x^{2k} + a = 0 (a > 0, k\in \mathbf{Z}) x2k+a=0(a>0,k∈Z) 无实根,进而归结为方程 x 2 + 1 = 0 x^2 + 1 = 0 x2+1=0 无实根。
回顾已有的数集扩充过程,可以看到,每次扩充都与实际需求密切相关。例如,为了解决正方形对角线的度量,以及 x 2 − 2 = 0 x^2 - 2 = 0 x2−2=0 这样的方程无有理根的问题,人们把有理数集扩充到了实数集。数集扩充后,在实数集中规定的加法运算、乘法运算,与原来在有理数集中规定的加法运算、乘法运算协调一致,并且加法和乘法都满足交换律和结合律,乘法对加法满足分配律。
据此,为了解决方程 x 2 + 1 = 0 x^2 + 1 = 0 x2+1=0 无实根的问题,我们引入数 i \text{i} i,使得 x = i x = \text{i} x=i 是方程 x 2 + 1 = 0 x^2 + 1 = 0 x2+1=0 的解,即使得 i 2 = 1 \text{i}^2 = 1 i2=1。
我们希望 i \text{i} i 和实数之间仍然能像实数那样进行加法和乘法运算,并希望加法和乘法都满足交换律、结合律,以及乘法对加法满足分配律。
2. 定义与分类
我们定义形如 z = a + b i z = a + b\text{i} z=a+bi,其中 a , b ∈ R a, b\in \mathbf{R} a,b∈R 的数 z z z 叫做 复数( complex number \text{complex number} complex number);其中 a a a 称为 实部( real part \text{real part} real part),记作 ℜ ( z ) = a \Re(z) = a ℜ(z)=a; b b b 称为 虚部( imaginary part \text{imaginary part} imaginary part),记作 ℑ ( z ) = b \Im(z) = b ℑ(z)=b; i \text{i} i 为 虚数单位。这种表示方法称为 复数的代数形式。
当 b = 0 b = 0 b=0 时, z z z 为实数;当 b ≠ 0 b \ne 0 b=0 时, z z z 为 虚数( imaginary number \text{imaginary number} imaginary number);当 a = 0 , b ≠ 0 a = 0, b \ne 0 a=0,b=0 时, z z z 为 纯虚数( pure imaginary number \text{pure imaginary number} pure imaginary number)。
全体虚数所构成的集合叫做 虚数集,记作 I \mathbf{I} I;全体复数所构成的集合叫做 复数集,记作 C \mathbf{C} C。复数集是数域。
复数域是实数域的代数闭包。
纯虚数,虚数,实数与复数之间的关系如图:
[外链图片转存中…(img-DIdD4lH8-1644746499024)]
二、复数的意义与运算
1. 几何意义
我们将全体实数放入了数轴,发现实数集与数轴上的点集一一对应。考虑对复数做类似的操作。
首先定义 复数相等。两个复数 z 1 = a + b i , z 2 = c + d i z_1 = a + b\text{i}, z_2 = c + d\text{i} z1=a+bi,z2=c+di 相等,等且仅当 a = c a = c a=c 且 b = d b = d b=d。
由此,我们可以用 惟一 的有序实数对 ( a , b ) (a, b) (a,b) 来表示复数 z = a + b i z = a + b\text{i} z=a+bi,可以得到 复数集与平面直角坐标系上的点集一一对应。这是复数的第一种几何意义。
我们称这种平面直角坐标系为 复平面, x x x 轴为 实轴, y y y 轴为 虚轴,则 复数集与复平面内全体点所构成的集合一一对应。
联系到线性代数的知识,平面向量的坐标也可以用有序实数对 ( a , b ) (a, b) (a,b) 表示。
复数 z = a + b i z = a + b\text{i} z=a+bi 对应复平面内的点 Z ( a , b ) Z(a, b) Z(a,b),其亦对应向量 O Z → = ( a , b ) \overrightarrow{OZ} = (a, b) OZ=(a,b)。于是有 复数集与复平面内的全体向量所构成的集合一一对应。这是复数的第二种几何意义。
相应地,由向量中的模来定义 复数的模:复数 z = a + b i z = a + b\text{i} z=a+bi 的模 ∣ z ∣ = a 2 + b 2 |z| = \sqrt{a^2 + b^2} ∣z∣=a2+b2。也就是说,复数的模为复数所对应的向量的模。
通常地,我们将复数 z = a + b i z = a + b \text{i} z=a+bi 用点 Z Z Z 或向量 O Z → \overrightarrow{OZ} OZ 来表示,并规定相等的向量表示同一个复数。
由向量不能比较大小可知,虚数不可以比较大小(实数可以)。
2. 运算法则
加法与减法
加法法则:
设
z
1
=
a
+
b
i
,
z
2
=
c
+
d
i
z_1 = a + b\text{i}, z_2 = c + d \text{i}
z1=a+bi,z2=c+di,则
z
1
+
z
2
=
(
a
+
c
)
+
(
b
+
d
)
i
z_1 + z_2 = (a + c) + (b + d) \text{i}
z1+z2=(a+c)+(b+d)i
由
a
,
b
,
c
,
d
∈
R
a, b, c, d\in \mathbf{R}
a,b,c,d∈R 可得
a
+
c
,
b
+
d
∈
R
a + c, b + d\in \mathbf{R}
a+c,b+d∈R,故 两个复数的和仍为复数。
我们发现复数的加法法则符合向量的加法法则,进一步证明了复数几何意义的正确性。
由加法法则可得 复数的加法满足交换律和结合律,在此略去证明。
减法法则:
减法作为加法的逆运算,我们可以通过加法法则与复数相等的定义推出减法法则:
z
1
−
z
2
=
z
1
+
(
−
z
2
)
=
(
a
−
c
)
+
(
b
−
d
)
i
\begin{aligned} z_1 - z_2 & = z_1 + (- z_2) \\ & = (a - c) + (b - d) \text{i} \end{aligned}
z1−z2=z1+(−z2)=(a−c)+(b−d)i
同样地,两个复数的差仍为复数。
复数的减法法则依旧符合向量的减法法则。
乘法与除法
乘法法则:
类似于多项式乘法,设
z
1
=
a
+
b
i
,
z
2
=
c
+
d
i
z_1 = a + b\text{i}, z_2 = c + d\text{i}
z1=a+bi,z2=c+di,则
z
1
⋅
z
2
=
(
a
+
b
i
)
(
c
+
d
i
)
=
a
c
+
a
d
i
+
b
c
i
+
b
d
i
2
=
(
a
c
−
b
d
)
+
(
a
d
+
b
c
)
i
\begin{aligned} z_1\cdot z_2 & = (a + b\text{i})(c + d\text{i}) \\ & = ac + ad\text{i} + bc\text{i} + bd\text{i}^2 \\ & = (ac - bd) + (ad + bc) \text{i} \end{aligned}
z1⋅z2=(a+bi)(c+di)=ac+adi+bci+bdi2=(ac−bd)+(ad+bc)i
复数的乘法与向量的向量积形式类似,是由于复数集是数环。
易知 复数乘法满足交换律、结合律和对加法的分配律。
由于复数满足运算律,因此 实数域中的乘法公式在复数域中同样适用。
除法法则:
( 1 ) (1) (1):解方程(略);
(
2
)
(2)
(2):
a
+
b
i
c
+
d
i
=
(
a
+
b
i
)
(
c
−
d
i
)
(
c
+
d
i
)
(
c
−
d
i
)
=
(
a
c
+
b
d
)
+
(
b
c
−
a
d
)
i
c
2
+
d
2
=
a
c
+
b
d
c
2
+
d
2
+
(
b
c
−
a
d
)
c
2
+
d
2
i
\begin{aligned} \dfrac{a + b\text{i}}{c + d\text{i}} & = \dfrac{(a + b\text{i})(c - d\text{i})}{(c + d\text{i})(c - d\text{i})} \\ & = \dfrac{(ac + bd) + (bc - ad)\text{i}}{c^2 + d^2} \\ & = \dfrac{ac + bd}{c^2 + d^2} + \dfrac{(bc - ad)}{c^2 + d^2} \text{i} \end{aligned}
c+dia+bi=(c+di)(c−di)(a+bi)(c−di)=c2+d2(ac+bd)+(bc−ad)i=c2+d2ac+bd+c2+d2(bc−ad)i
当然前提是分母
c
+
d
i
≠
0
c + d\text{i} \ne 0
c+di=0。
由于向量没有除法,因此不讨论与向量的关系。
3. 共轭复数
在上文复数的除法法则中,为了 分母实数化,我们在上下同乘 ( c − d i ) (c - d\text{i}) (c−di),这与我们在初中进行的分母有理化类似。
对于复数 z = a + b i z = a + b\text{i} z=a+bi,称复数 z ‾ = a − b i \overline{z} = a - b\text{i} z=a−bi 为 z z z 的 共轭复数( conjugate complex number \text{conjugate complex number} conjugate complex number)。即两个实部相等,虚部互为相反数的复数互为共轭复数。
可以发现,共轭复数关于实轴对称。
共轭复数的一些小性质:
(
a
+
b
i
)
(
a
−
b
i
)
=
a
2
+
b
2
∣
a
+
b
i
∣
=
∣
a
−
b
i
∣
(a + b\text{i}) (a - b \text{i}) = a^2 + b^2 \\ |a + b\text{i}| = |a - b\text{i}|
(a+bi)(a−bi)=a2+b2∣a+bi∣=∣a−bi∣
第一条由平方差公式得到,用其可进行分母实数化;
第二条是关于模的性质,画个图就明白了。
三、Complex Number in OI
一个例子
FFT 中要使用到复数。
STL 中的 complex 库
万能的 STL 库中给出了 complex 库。
在使用前,我们需要引入头文件
#include <complex>
还需要 using namespace std; 或者用 std::。
声明方式
complex<T> z;
声明一个实部与虚部的类型均为
T
T
T 的复数
z
z
z,
T
T
T 可为 int, double 等。
构造函数
complex<T> z(a, b);
定义一个复数 z = a + b i z = a + b\text{i} z=a+bi。可以没有第二个参数 b b b,此时默认 b = 0 b = 0 b=0。
complex<T> (a, b)
(a, b)
构造一个实部为 a a a,虚部为 b b b 的复数,常用于赋值,如:
complex<int> z;
z = (1.14514, 0)
注意此时类型不同,会强转。
运算
一元运算符:
+(正号)和-(符号);
二元运算符:
=, +=, -=, *=, /=运算符后的数的类型可与运算符前的数不同;+, -, *, /, ==, !=两数类型必须相同。
常用函数
-
.real():无参数时返回复数的实部;有参数时将复数实部赋值,无返回值; -
.imag():同real(),只不过对象变成虚部; -
abs():返回复数的模; -
conj():返回复数的共轭复数;
输入输出
-
使用流输入输出。复数的流输出是有序数对的形式;流输入可以只输入一个数(为实部,此时虚部默认为 0 0 0),或一个有序数对(数对也可以无第二个数,此时效果等同于只输入一个数)
-
通过
.real()和.imag()函数实现。
一个例子
// 18 = 9 + 9 = 18.
#include <iostream>
#include <cstdio>
#include <complex>
#define Debug(x) cout << #x << "=" << x << endl
typedef long long ll;
using namespace std;
int main()
{
complex<double> z(114.514, 1919.810);
cout << z << "\n";
z.real(3);
printf("%lf %lf\n", z.real(), abs(z));
complex<int> y = conj(z);
cout << y << "\n";
complex<int> x;
cin >> x;
printf("%d\n", x.imag());
return 0;
}
输入
(1)
输出
(114.514,1919.81)
3.000000 1919.812344
(3,-1919)
0
四、参考资料
[1] 复数. OI Wiki
[2] C++STL complex吃书使用指南 . 千叶繁华

4881

被折叠的 条评论
为什么被折叠?



