減法

減法（英語：subtraction、法語：soustraction）是四則運算之一。減法運算的本質，就是「逆著加法去尋找原數」。

例如：5-2 中，已知 $5$ 是 $2$ 和 $3$ 的和，其中一個加數是 $2$，求另一個加數 $3$。

其中，$5$ 稱為被減數，$2$ 稱為減數，$3$ 是 $5$ 和 $2$ 的差。

減法遵循幾個重要的規律：

減法不像加法那樣符合交換律，即改變運算順序會一同改變結果符號。它也不滿足結合律，也就是說，當需要連續減去兩個以上的數時，減法的執行順序會影響結果。由於 $0$ 是加法單位元，減去 $0$ 不會改變一個數的值。

此外，減法在涉及相關運算（如加法和乘法）時也遵循可預測的規則。所有這些規則皆可從整數減法開始進行證明，並推廣至實數、乃至更廣泛的數學對象。所有遵循這些規律的通用二元運算在抽象代數中都有研究。

## 定義

<image>

### 算術定義

已知兩個加數的和與其中一個加數，求另一個加數的運算，符號為「$-$」，結果為差。

### 集合論定義

在集合論中，減法通過差集定義。給定兩個集合 $A$ 和 $B$，它們的差集 $A \backslash B$ 包含所有屬於 $A$ 但不屬於 $B$ 的元素。例如：

若 $A = \{1,2,3\}$，$B=\{2,4\}$，則 $A \backslash B = \{1,3\}$。

此外，在可計算性理論中，由於減法在自然數上並非良定義，數與數之間的運算實際上是通過「截斷減法」或稱為monus的運算來定義的。

### 代數結構中的定義

在更抽象的代數系統中（如群、環、域）：

- 群：若 $G$ 是一個群，減法 $a-b$ 定義為 $a+(-b)$，其中 $-b$ 是 $b$ 的加法逆元。
- 環與域：減法是加法的逆運算，滿足封閉性、結合律及分配律的擴展性質。

例如，在整數環 $\mathbb{Z}$ 中，減法確保對任意 $a,b\in Z$，存在唯一的 $c$ 使得 $a = b + c$。

## 符號與表示

減法通常用被減數與減數之間的減號"-"來表示（中綴表示法的一種），運算結果則用等號「=」表示。例如：

$2 - 1 = 1$（2 減 1 等於 1）

$4 - 6 = -2$（4 減 6 等於 -2）

在某些情況下，即使沒有出現減號，減法運算亦可「約定俗成」。例如在記帳的一列數中，若下方數字以紅色顯示，則通常表示需要減去該列中較小的數，差值寫在該行下方橫線之下的位置。

英語單詞subtraction（減法，名詞）來源於拉丁語動詞「subtrahere」，而該動詞本身由前綴「sub」（意為「（從）下方」）和動詞「trahere」（意為「拉拽」）複合構成。因此，減法的字面含義就是「從下方拉出」或「取走」。而subtrahend（減數）則由添加動名詞後綴「-nd」派生（字面意義為「被拉出的事物」）。

minuend（被減數）則源於拉丁動詞「minuere」（意為「減少或縮小」），表示「被縮減的事物」。

## 性質

### 恆等性質

任何數減去 0 都等於其本身：$a - 0 = a$。

### 非運算性質

- 非交換律：$5 - 3 \neq 3 - 5$
- 非結合律：$(10 - 3) - 2 \neq 10 - (3 - 2)$

## 不同的減法運算

### 自然數減法

自然數集上的減法運算不滿足封閉性：只有當被減數大於或等於減數時，差值才是自然數。例如 $11$ 減去 $26$ 就無法得到自然數結果。對此有兩種處理方式：

- 偏函數法：直接假定 $11$ 不能減去 $26$，化減法為偏函數
- 整數擴展法：將結果表示為負整數，即 $11 - 26 = -15$

### 整數減法

<image>

想像一條長度為 $b$ 的線段，左端標記為 $a$，右端標記為 $c$。從 $a$ 點出發，向右移動 $b$ 個單位即可到達 $c$ 點。在數學上，這種右移通過加法運算建模：

$$a + b = c$$

而從 $c$ 點出發，向左移動 $b$ 個單位就能回到 $a$ 點。這種左移則通過減法運算建模：

$$c - b = a$$

<image>

再想像一條線段，這條線段則標有數字 $1$、 $2$、 $3$。現在從位置 $3$ 出發，向左移動 $0$ 個單位，仍停留在 $3$，因此 $3 - 0 = 3$；向左移動 $2$ 個單位，則到達位置 $1$，因此 $3 - 2 = 1$。

此線段的局限在於，無以描述從位置 $3$ 向左移動 $3$ 個單位後的情況，需延長數軸（即沿用整數數軸）方可。

### 分數減法

分數減法類似自然數和整數的減法，但要求分母相同。若兩分數分母不同，可用通分實現：

$$\frac a b - \frac c d = \frac{~{}ad - bc }{bd}$$

### 實數減法

實數域可通過僅定義兩個二元運算（加法與乘法）及兩個一元運算（求加法逆元與乘法逆元）來構建。此時，從被減數中減去減數的實數運算，可定義為被減數與該減數加法逆元的加法運算。例如：

$$3 - \pi = 3 + (-\pi)$$

若不依賴這些一元運算，亦可將減法與除法作為基本二元運算來處理。

### 抽象代數減法

#### 向量減法

在線性代數中，向量空間是一個允許向量相加及縮放的代數結構。所有實數的有序對組成的集合就是一個常見的向量空間：有序對 (a, b) 被解釋為歐幾里得平面上從原點到由 (a, b) 表示的點的向量。兩個向量的差是通過將對應的坐標相減完成的：1=(a, b) - (c, d) = (a - c, b - d)。

#### 矩陣減法

大小相同的兩個矩陣可以相減。兩個 m × n 矩陣 A 和 B 的差也是一個 m × n 矩陣，用 A - B 表示，由對應元素相加得到：

$$\begin{align} \mathbf{A} - \mathbf{B} & = \begin{bmatrix} <pre> a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \\ </pre> \end{bmatrix} - \begin{bmatrix} <pre> b_{11} & b_{12} & \cdots & b_{1n} \\ b_{21} & b_{22} & \cdots & b_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ b_{m1} & b_{m2} & \cdots & b_{mn} \\ </pre> \end{bmatrix} \\ & = \begin{bmatrix} <pre> a_{11} - b_{11} & a_{12} - b_{12} & \cdots & a_{1n} - b_{1n} \\ a_{21} - b_{21} & a_{22} - b_{22} & \cdots & a_{2n} - b_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} - b_{m1} & a_{m2} - b_{m2} & \cdots & a_{mn} - b_{mn} \\ </pre> \end{bmatrix} \end{align}$$

### 基於群論的減法

設 $(G, +)$ 為一個阿貝爾群。我們在 $G$ 中定義一個新的內合成法則，稱為「減法」並記作"−"，其定義為：

$$x - y = x + (-y)$$

其中 $-y$ 表示元素 $y$ 的逆元。

需要注意的是，既用"-"表示元素 $y$ 的逆元 $-y$，又表示二元運算 $x-y$，屬於符號的濫用。

一般的減法運算性質在此群論框架下依然成立。

### 範疇論中的減法

在範疇論中，減法並沒有統一的直接對應物，但可以藉助態射、核（kernel）、余核（cokernel）、差分對象等抽象概念來表達類似於「減法」的關係。

### 二進位減法

在電腦科學和數字邏輯中，減法是在二進位數之間進行的，通常使用補碼方法來簡化運算，詳見下文「電腦演算法」。

## 運算方法

### 豎式減法

#### 從右向左相減的方法

##### 美國豎式法

在美國所謂的「傳統教學」中，學生在一年級末（或二年級期間）會學習一種針對多位整數的特定豎式減法運算，該流程會在四年級或五年級時擴展至包含小數的分數表示形式。目前幾乎所有美國學校都教授一種使用借位（或稱為重組，即分解演算法）的豎式減法，並配合一套被稱為"輔助記號"（crutches）的標記系統。雖可能不願承認，中國國內的主流演算法卻正是這種「美帝演算法」。

用此法計算減法時，數從右向左逐位相減。具體操作步驟如下：

- 基本減法操作：用被減數（上方數字）的每一位減去減數（下方數字）對應位置的數字。
- 借位處理：當被減數的某一位數字小於減數對應位數字時（即"上方數字太小"），則：
- 先向該位"借10"（即在當前位數字上加10）
- 同時從其左邊相鄰的高位數字中"減去1"（即高位數字減1，相當於借出1個十）
- 連續運算：完成當前位的減法後，繼續處理下一數位，根據需要重複借位操作，直至完成所有數位的減法運算。

下面以計算 $753 - 491$ 為例：

<image>

- 先看被減數與減數的個位，分別是3和1。

<image>

- 3和1相減，結果是2，寫在個位上。

<image>

- 再看兩數的十位，分別是5和9。5減不了9，怎麼辦呢？

<image>

- 那就向百位「借10」！

<image>

- 15就可以減9了，結果是6，寫在十位上。

<image>

- 最後看兩數的百位，被減數餘6，減數是4。

<image>

- 6和4相減，結果是2，寫在百位上。

<image>

- 可得753和491的差是262。

美國豎式法還有一種變體，名為「先借位法」，其核心是：在進行任何減法運算之前，先完成所有的借位操作。

下面以計算 $751 - 493$ 為例：

<image>

- 依然先看被減數與減數的個位，分別是1和3。1減不了3，先從十位「借10」得11。

<image>

- 再看兩數的十位，被減數餘4，減數是9，同上操作得14。

<image>

- 11和3相減，結果是8，寫在個位上。

<image>

- 14和9相減，結果是5，寫在十位上。

<image>

- 最後看兩數的百位，餘下的6與4相減，結果是2，寫在百位上。可得751和493的差是258。

##### 歐洲豎式法

部分歐洲學校採用一種稱為歐洲法（或奧地利法）的豎式減法。此法不涉及借位運算，但會根據不同國家的習慣使用各種輔助記號（幫助記憶的標記）。

下面以計算 $753 - 491$ 為例：

<image>

- 先看被減數與減數的個位，分別是3和1。

<image>

- 3=1+2，所以結果是2，寫在個位上。

<image>

- 再看兩數的十位，9加什麼等於5呢？這沒有自然數解。

<image>

- 那就從百位「借10」！被減數「變成」了15。

<image>

- 顯然，15=9+6，所以結果是6，寫在十位上。

<image>

- 最後看兩數的百位。

<image>

- 7=(4+1)+2，所以結果是2，寫在百位上。

<image>

- 可得753和491的差是262。

#### 從左向右相減的方法

##### 補數法的變體

減法運算也可以從左到右進行。這種不常見的方法實際上是補數法的一種變體，其特點是在精確計算差值之前，先處理所有的借位（進位）問題。由於該方法既不需要記錄借位，也不需要記憶借位情況，因此不僅相對不易出現粗心錯誤，計算速度也非常快，甚至適用於心算。

下面以計算 $753 - 491$ 為例：

<image>

- 先看被減數與減數的百位，7和4相減，結果是3，寫在百位上。

<image>

- 再看兩數的十位，5減不了9，怎麼辦呢？

<image>

- 當然是從百位的3「借1」！15和9相減，結果是6，寫在十位上。

<image>

- 最後看兩數的個位。

<image>

- 3和1相減，結果是2。可得753和491的差是262。

##### 分步差減法

分步差減法與其他豎式減法的相異在於：它既不需要借位，也不需要進位。取而代之的是，根據被減數與減數的大小關係，在相應數位上標註正號或負號——若被減數大於減數則記為正，反之則記為負。最終，將所有數位上的分步差值（正負結果）相加，所得總和即為最終的差值結果。

下面以計算 $753 - 491$ 為例：

<image>

- 先看被減數與減數的百位，700-400=300，寫在橫線下。

<image>

- 再看兩數的十位，50-90=-40，寫在橫線下「300」的下方。

<image>

- 接著看兩數的個位，3-1=2，寫在橫線下「-40」的下方。

<image>

- 最後將得到的三個新數相加：300+(-40)+2=262。可得753和491的差是262.

### 非豎式減法

#### 遞增進數法

不同於逐位計算差值，遞增進數法通過計算減數與被減數之間的數值增量來求得差值。

示例：計算 $1234 - 567$ 可通過以下步驟：

$$567 + 3 = 570$$

$$570 + 30 = 600$$

$$600 + 400 = 1000$$

$$1000 + 234 = 1234$$

將各步驟的遞增值相加即得總差值：$3 + 30 + 400 + 234 = 667$

#### 分步拆解法

另一種適用於心算的方法是將減法運算拆分為多個小步驟進行計算。

示例：計算 $1234 - 567$ 可通過以下步驟：

$$1234 -500 = 734$$

$$734 - 60 = 674$$

$$674 - 7 = 667$$

#### 恆等變換法

該方法基於"對被減數和減數同時加減相同數值不改變差值結果"的數學原理，通過調整減數至零值來簡化計算。

示例：計算 $1234 - 567$ 可通過以下步驟：

$$1234 - 567$$

$$= 1237 - 570$$

$$= 1267 - 600$$

$$= 667$$