虚数单位

在数学、物理及工程学里，虚数单位是指二次方程$x^2 + 1 = 0$的解。虽然没有这样的实数可以满足这个二次方程，但可以通过虚数单位将实数系统$\mathbb{R}$延伸至复数系统$\mathbb{C}$。延伸的主要动机为有很多实系数多项式方程式无实数解。例如刚才提到的方程式$x^2 + 1 = 0$就无实数解。可是倘若我们允许解答为虚数，那么这方程式以及所有的多项式方程式都有解。虚数单位通常标记为$i$，但在涉及电气、电机工程等电学相关领域时，则往往标记为$j$，这是为了避免与电流（记为$i(t)$或$i$）相混淆。

## 定义

$$\ldots$$ i^-3 i^-2 i^-1 i^0 i^1 i^2 i^3 i^4 i^5 i^6 $$\ldots$$

虚数单位$i$定义为二次方程式$x^2 + 1 = 0$的两个根中的一个。这方程式又可等价表达为：

hide(x←i);x^2。

由于实数的平方绝不可能是负数，我们假设有这么一个数目解答，给它设定一个符号$i$。很重要的一点是，-1是一个良定义的数学构造。

另外，虚数单位同样可以表示为：

sqrt(-1)

然而sqrt(-1)往往被误认为是错的，他们的证明的方法是：

因为$-1 = i\cdot i=\left(\sqrt{-1}\right)\times\left(\sqrt{-1}\right)=\sqrt{\left(-1\right)\times\left(-1\right)}=\sqrt{1}=1$，但是-1不等于1。

但请注意：$\sqrt{a \cdot b}=\sqrt{a}\cdot\sqrt{b}$成立的条件有$a$,$b$不能为负数。

实数运算可以延伸至虚数与复数。当计算一个表达式时，我们只需要假设$i$是一个未知数，然后依照$i$的定义，替代任何$i^2$的出现为-1。$i$的更高整数幂数也可以替代为$-i$，$1$，或$i$，根据下述方程式：

$i^3 = i^2 i = (-1) i = -i$。

$i^4 = i^3 i = (-i) i = -(i^2) = -(-1) = 1$。

$i^5 = i^4 i = (1) i = i$。

一般地，有以下的公式：

$$i^{4n} = 1$$

$$i^{4n+1} = i$$

$$i^{4n+2} = -1$$

$$i^{4n+3} = -i$$

$$i^n = i^{n \bmod 4}$$

其中$\bmod 4$表示被4除的余数。

## 补充定义

虚数单位 $i$ 是复数域 $\mathbb{C}$ 中的一个基本元素，其核心性质由以下等价方式之一定义：

### 代数定义

作为二次方程 $x^2 + 1 = 0$ 的一个解。即，$i$ 是满足方程

$$i^2 = -1$$

数。由于该方程在实数域 $\mathbb{R}$ 内无解，引入 $i$ 是构造更广的数系——复数域的关键步骤。

### 作为有序对

在复数严格的公理化构造中，复数定义为有序对 $(a, b)$，其中 $a, b \in \mathbb{R}$。在此框架下，虚数单位 $i$ 被定义为有序对

$i := (0, 1)$。

而复数的乘法规则定义为 $(a, b) \cdot (c, d) = (ac - bd, ad + bc)$。由此可验证：

$i^2 = (0, 1) \cdot (0, 1) = (0\cdot0 - 1\cdot1, 0\cdot1 + 1\cdot0) = (-1, 0) = -1$。

这一定义完全绕开了“负数的平方根”这一初始概念，从而在逻辑上更为基础。

## i和-i

方程$x^2 = -1$有两个不同的解，它们都是有效的，且互为共轭虚数及倒数。更加确切地，一旦固定了方程的一个解$i$，那么$-i$（不等于$i$）也是一个解，由于这个方程是$i$的唯一的定义，因此这个定义表面上有歧义。然而，只要把其中一个解选定，并固定为$i$，那么实际上是没有歧义的。这是因为，虽然$-i$和$i$在数量上不是相等的（它们是一对共轭虚数），但是$i$和$-i$之间没有质量上的区别（-1和+1就不是这样的）。在任何的等式中同时将所有i替换为-i，该等式仍成立。

$$-i^2 = 1$$

$$-i = i^{-1} = \frac{1}{i}$$

## 正当的使用

虚数单位有时记为$\sqrt{-1}$。但是，使用这种记法时需要非常谨慎，这是因为有些在实数范围内成立的公式在复数范围内并不成立。例如，公式$\sqrt{a} \cdot \sqrt{b} = \sqrt{a \cdot b}$仅对于非负的实数$a$和$b$才成立。

假若这个关系在虚数仍成立，则会出现以下情况：

$-1 = i \cdot i = \sqrt{-1} \cdot \sqrt{-1} = \sqrt{(-1) \cdot (-1)} = \sqrt{1} = 1$（不正确）

$-1 = i \cdot i = \pm \sqrt{-1} \cdot \pm \sqrt{-1} = \pm \sqrt{(-1) \cdot (-1)} = \pm \sqrt{1} = \pm 1$（不正确）

$\frac{1}{i} = \frac{\sqrt{1}}{\sqrt{-1}} = \sqrt{\frac{1}{-1}} = \sqrt{-1} = i$（不正确）

### 与主平方根的关系

在复数域中，“平方根”是一个多值函数。对于非负实数 $a$，符号 $\sqrt{a}$ 通常指其唯一的非负实平方根（称为算术平方根或主平方根）。然而，对于负数或一般的复数，符号 $\sqrt{z}$ 必须明确其分支的选择。通常，复数的主平方根函数定义为其辐角落在区间 $(-\pi, \pi]$ 内的那个根。

在这种约定下，$\sqrt{-1}$ 的主值是 $i$（而非 $-i$）。即便如此，涉及多个复数的主平方根的恒等式也普遍不成立。因此，在处理复数时，最安全且清晰的做法是直接使用符号 $i$ 及其基本性质 $i^2 = -1$ 进行计算，避免对负数直接应用根号运算法则。

## i的运算

<image>

利用复数的运算规则和欧拉公式，可以对虚数单位 $i$ 进行各种数学运算，包括平方根、幂、对数和三角函数。以下运算除特殊说明外，均为与 $i$ 有关的多值函数，在实际应用时必须指明函数的定义选择在黎曼面的哪一支。下面列出的仅仅是最常采用的黎曼面分支的计算结果。

### 基本运算与幂循环

虚数单位 $i$ 的整数幂遵循一个周期为4的循环：

$$\begin{align} i^1 &= i, \\ i^2 &= -1, \\ i^3 &= -i, \\ i^4 &= 1, \end{align}$$

一般地，对任意整数 $n$，有：

$$i^n = i^{n \bmod 4}$$

其中 $\bmod 4$ 表示被4除的余数。

### 平方根

$i$ 的平方根为：

$$\sqrt{i} = \pm \left( \frac{\sqrt{2}}{2} + \frac{\sqrt{2}}{2} i \right) = \pm \frac{\sqrt{2}}{2}(1 + i)$$

使用算术平方根符号表示其主值：

$$\sqrt{i} = \frac{\sqrt{2}}{2}(1 + i)$$

其解法为先假设两实数 $x$ 及 $y$，使得 $(x + iy)^2 = i$，然后求解 $x, y$。

### 一般幂运算

利用欧拉公式 $e^{i\theta} = \cos \theta + i \sin \theta$，可以将虚数单位表示为指数形式：

$i = e^{i\left(\frac{\pi}{2} + 2k\pi\right)}$，其中 $k \in \mathbb{Z}$ 为任意整数。

由此可推导出更一般的幂运算公式。设 $a, b, c \in \mathbb{R}$，且 $a > 0$，则有：

$$a^{i} = e^{i \ln a} = \cos(\ln a) + i \sin(\ln a)$$

这是一个模为1的复数，其几何意义是在复平面上将点1旋转 $\ln a$ 弧度。

$$a^{b i} = e^{b i \ln a} = \cos(b \ln a) + i \sin(b \ln a)$$

$$a^{b + c i} = a^{b} \cdot a^{c i} = a^{b} \left[ \cos(c \ln a) + i \sin(c \ln a) \right]$$

此公式清晰地分离了结果在复平面上的伸缩因子 $a^b$ 和旋转因子 $a^{c i}$。

- 最为人熟知的特例：$i$ 的 $i$ 次幂

$i^i = \left[ e^{i (\frac{\pi}{2} + 2k \pi)} \right]^i = e^{i^2 (\frac{\pi}{2} + 2k \pi)} = e^{-(\frac{\pi}{2} + 2k \pi)}$，$k \in \mathbb{Z}$

代入不同的 $k$ 值，可计算出无限多的解。当 $k = 0$ 时，得到其主值 $e^{-\frac{\pi}{2}} \approx$ 0.207879576...

### 对数

对于正实数 $x > 0$，有：

$\log_i x = {{2 \ln x} \over i\pi} = -i \cdot \frac{2 \ln x}{\pi}$（取主值）

- 更一般地，对于正实数 $a > 0$ 且 $a \neq 1$，以 $i$ 为底的对数可由换底公式导出：

$\log_i a = \frac{\ln a}{\ln i} = \frac{\ln a}{i\left(\frac{\pi}{2} + 2k\pi\right)} = -i \cdot \frac{2 \ln a}{(4k+1)\pi}$， $k \in \mathbb{Z}$。

这是一个纯虚数，且由于 $\ln i$ 的多值性，其结果也有无穷多个值。

### 三角与双曲函数

以下恒等式揭示了虚数单位如何联系三角函数与双曲函数，这是欧拉公式的直接推论。对于实数 $x$：

$$\begin{align} \cos(i x) &= \cosh x \\ \sin(i x) &= i \sinh x \\ \tan(i x) &= i \tanh x \end{align}$$

这些公式表明，对虚自变量的三角函数求值，会转化为实自变量的双曲函数。

作为直接应用，可以计算：

$$\cos i = \cosh 1 = {{e + \frac{1}{e}} \over 2} = {{e^2 + 1} \over 2e} \approx 1.54308064...$$

$$\sin i = i\sinh 1 = {{e - \frac{1}{e}} \over 2} i = {{e^2 - 1} \over 2e} i \approx (1.17520119...) i$$

## 在程式语言

- 大部分的程式语言都不提供虚数单位，且平方根函数(大多为sqrt或Math.Sqrt)的引数不可以是负数，因此，必须自行建立类别后方可使用。
- 但Lisp的许多实现与方言，如Common Lisp，内建虚数和复数的支持。不少动态语言受其影响，也在语言本身或标准库中支持虚数和复数，如Python、Ruby。
- 一些传统编程语言，如C语言，也从C99开始支持虚数和复数。
- 在Matlab，虚数单位的表示方法为i或j，但i和j在for循环可以有其他用途。
- 在Mathematica，虚数单位的表示方法为I、𝕚或𝕛。
- 在Maple，必须启用虚数功能，并选择用i还是j表示虚数单位。
- Go语言于第 1.0 版就内建虚数和复数的支持，变数类型为 `complex64`和`complex128`。

### 代码示例

以下是一些编程语言中定义虚数单位 $i$ 及进行基本复数运算的方法：

编程语言｜示例代码 (定义虚数单位与基础运算)｜备注与输出示例

Python｜、Python 原生支持复数类型，属于 `complex` 类。、虚部使用后缀 j 或 J 表示。、可用 `real` 和 `imag` 属性获取实部与虚部。、`cmath` 模块提供复变函数。

```python
# 虚数单位用后缀 j 表示
i = 1j
print(f"虚数单位 i = {i}")
print(f"i 的平方 i² = {i ** 2}")
# 输出：虚数单位 i = 1j
# 输出：i 的平方 i² = (-1+0j)

# 复数构造与运算
z1 = 3 + 4j    # 复数字面量
z2 = complex(1, -2)  # complex(实部, 虚部) 函数
print(f"复数 z1 = {z1}")
print(f"复数 z2 = {z2}")
print(f"z1 + z2 = {z1 + z2}")  # 加法：(4+2j)
print(f"z1 * z2 = {z1 * z2}")  # 乘法：(11-2j)

# 使用 cmath 模块进行更多运算
import cmath
print(f"e^(i*π) = {cmath.exp(1j * cmath.pi)}")  # 欧拉公式，近似 (-1+1.2246467991473532e-16j)
```

C语言 (C99标准)｜、需包含 `<complex.h>` 头文件，并使用标准宏 I 表示虚数单位。、复数类型为 `double complex`、`float complex` 等。、运算符号（+,、, -）与普通算术一致。、使用 `creal()` 和 `cimag()` 函数提取复数的实部与虚部。、编译时需支持C99标准（如使用 `gcc -std=c99`）。

```c
#include <complex.h>
#include <stdio.h>

int main(void) {
    // 宏 I 表示虚数单位 i
    double complex i = I;
    double complex z1 = 3.0 + 4.0 * I;
    double complex z2 = 1.0 - 2.0 * I;

    // 基本运算
    double complex i_squared = i * i;
    double complex sum = z1 + z2;
    double complex product = z1 * z2;

    // 输出结果，creal()和cimag()分别提取实部和虚部
    printf("i² = %.2f %+.2fi\n", creal(i_squared), cimag(i_squared));
    // 输出：i² = -1.00 +0.00i
    printf("z1 + z2 = %.2f %+.2fi\n", creal(sum), cimag(sum));
    // 输出：z1 + z2 = 4.00 +2.00i
    printf("z1 * z2 = %.2f %+.2fi\n", creal(product), cimag(product));
    // 输出：z1 * z2 = 11.00 -2.00i

    return 0;
}
```

## 外部链接

- 欧拉对多项式的复数根的研究
- i作为-1的平方根（英文视频）
- $i^{7321}$的计算方法举例（英文视频）