数的概念扩展——复数

此博客仅讲述入门部分,没有复数的辐角、三角函数等部分。

零、前置知识

  • 向量

一、复数的引入、定义与分类

1. 引入

从方程角度看,负实数 a(a>0) 没有偶次方根,其实就是方程 x2k+a=0(a>0,kZ) 无实根,进而归结为方程 x2+1=0 无实根。

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

据此,为了解决方程 x2+1=0 无实根的问题,我们引入数 i,使得 x=i 是方程 x2+1=0 的解,即使得 i2=1

我们希望 i 和实数之间仍然能像实数那样进行加法和乘法运算,并希望加法和乘法都满足交换律、结合律,以及乘法对加法满足分配律。

2. 定义与分类

我们定义形如 z=a+bi,其中 a,bR 的数 z 叫做 复数complex number);其中 a 称为 实部real part),记作 (z)=ab 称为 虚部imaginary part),记作 (z)=bi虚数单位。这种表示方法称为 复数的代数形式

b=0 时,z 为实数;当 b0 时,z虚数imaginary number);当 a=0,b0 时,z纯虚数pure imaginary number)。

全体虚数所构成的集合叫做 虚数集,记作 I;全体复数所构成的集合叫做 复数集,记作 C复数集是数域

复数域是实数域的代数闭包。

纯虚数,虚数,实数与复数之间的关系如图:

二、复数的意义与运算

1. 几何意义

我们将全体实数放入了数轴,发现实数集与数轴上的点集一一对应。考虑对复数做类似的操作。

首先定义 复数相等。两个复数 z1=a+bi,z2=c+di 相等,等且仅当 a=cb=d

由此,我们可以用 惟一 的有序实数对 (a,b) 来表示复数 z=a+bi,可以得到 复数集与平面直角坐标系上的点集一一对应。这是复数的第一种几何意义。

我们称这种平面直角坐标系为 复平面x 轴为 实轴y 轴为 虚轴,则 复数集与复平面内全体点所构成的集合一一对应

联系到线性代数的知识,平面向量的坐标也可以用有序实数对 (a,b) 表示。

复数 z=a+bi 对应复平面内的点 Z(a,b),其亦对应向量 OZ=(a,b)。于是有 复数集与复平面内的全体向量所构成的集合一一对应。这是复数的第二种几何意义。

相应地,由向量中的模来定义 复数的模:复数 z=a+bi 的模 |z|=a2+b2。也就是说,复数的模为复数所对应的向量的模

通常地,我们将复数 z=a+bi 用点 Z 或向量 OZ 来表示,并规定相等的向量表示同一个复数。

由向量不能比较大小可知,虚数不可以比较大小(实数可以)。

2. 运算法则

加法与减法

加法法则

z1=a+bi,z2=c+di,则

z1+z2=(a+c)+(b+d)i

a,b,c,dR 可得 a+c,b+dR,故 两个复数的和仍为复数

我们发现复数的加法法则符合向量的加法法则,进一步证明了复数几何意义的正确性。

由加法法则可得 复数的加法满足交换律和结合律,在此略去证明。

减法法则

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

z1z2=z1+(z2)=(ac)+(bd)i

同样地,两个复数的差仍为复数

复数的减法法则依旧符合向量的减法法则。

乘法与除法

乘法法则

类似于多项式乘法,设 z1=a+bi,z2=c+di,则

z1z2=(a+bi)(c+di)=ac+adi+bci+bdi2=(acbd)+(ad+bc)i

复数的乘法与向量的向量积形式类似,是由于复数集是数环。

易知 复数乘法满足交换律、结合律和对加法的分配律

由于复数满足运算律,因此 实数域中的乘法公式在复数域中同样适用

除法法则

(1):解方程(略);

(2)

a+bic+di=(a+bi)(cdi)(c+di)(cdi)=(ac+bd)+(bcad)ic2+d2=ac+bdc2+d2+(bcad)c2+d2i

当然前提是分母 c+di0

由于向量没有除法,因此不讨论与向量的关系。

3. 共轭复数

在上文复数的除法法则中,为了 分母实数化,我们在上下同乘 (cdi),这与我们在初中进行的分母有理化类似。

对于复数 z=a+bi,称复数 z¯=abiz共轭复数conjugate complex number)。即两个实部相等,虚部互为相反数的复数互为共轭复数。

可以发现,共轭复数关于实轴对称

共轭复数的一些小性质:

(a+bi)(abi)=a2+b2|a+bi|=|abi|

第一条由平方差公式得到,用其可进行分母实数化;

第二条是关于模的性质,画个图就明白了。

三、Complex Number in OI

一个例子

FFT 中要使用到复数。

STL 中的 complex 库

万能的 STL 库中给出了 complex 库。

在使用前,我们需要引入头文件

#include <complex>

还需要 using namespace std; 或者用 std::

声明方式

complex<T> z;

声明一个实部与虚部的类型均为 T 的复数 zT 可为 int, double 等。

构造函数

complex<T> z(a, b);

定义一个复数 z=a+bi。可以没有第二个参数 b,此时默认 b=0

complex<T> (a, b)
(a, b)

构造一个实部为 a,虚部为 b 的复数,常用于赋值,如:

complex<int> z;
z = (1.14514, 0)

注意此时类型不同,会强转。

运算

一元运算符:

  • +(正号)和 -(符号);

二元运算符:

  • =, +=, -=, *=, /= 运算符后的数的类型可与运算符前的数不同;
  • +, -, *, /, ==, != 两数类型必须相同。

常用函数

  • .real():无参数时返回复数的实部;有参数时将复数实部赋值,无返回值;

  • .imag():同 real(),只不过对象变成虚部;

  • abs():返回复数的模;

  • conj():返回复数的共轭复数;

输入输出

  1. 使用流输入输出。复数的流输出是有序数对的形式;流输入可以只输入一个数(为实部,此时虚部默认为 0),或一个有序数对(数对也可以无第二个数,此时效果等同于只输入一个数)

  2. 通过 .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吃书使用指南 . 千叶繁华

posted @   mango09  阅读(723)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
-->
点击右上角即可分享
微信分享提示