---
title: 【數學理論】 07. 毛巾挑戰的終極解法—拓撲學 (Topology)
tags:
- 【數學理論】
url: https://hackmd.io/wcTj6mztR7K-q-_Tpnb7Tg
lastSync: 2025-05-25T08:45:51.812Z
hackmd:
url: https://hackmd.io/wcTj6mztR7K-q-_Tpnb7Tg
title: 【數學理論】 07. 毛巾挑戰的終極解法—拓撲學 (Topology)
lastSync: 2025-05-25T08:52:03.477Z
---
毛巾挑戰的終極解法
===
<font size=4><font color=gray>拓撲學 (Topology)</font><br></font><br>
---
<!-- 20250524 -->
按照慣例,開頭先來說一個故事。
<br>
前陣子偶然在網路上刷到國外很紅的「**毛巾挑戰**」
<br>
不囉嗦,先來看看挑戰內容是什麼。
{%youtube lJd0a_lAV4s %}
<br>
所以我們可以看到,毛巾挑戰的內容是:
- 兩個人雙手分別握住毛巾兩端,並且兩條毛巾互相扣住。
- 在手不放開毛巾的情況下,能否讓兩個人分開?
<br>
起初我看到這個挑戰的第一直覺是認為**絕對不可能成功**,但隨著越來越多挑戰成功的影片,抱持著一絲懷疑的同時,也開始漸漸相信其實說不定這是真的?
<br>
對於這種討論幾何、扭結等問題,只能搬出我認為數學當中最難的**拓撲學 (Topology)**
<br>
## 拓撲學 (Topology)
**拓撲學**主要是一門研究在拓撲空間內,物體連續變化(例如拉伸、扭轉,但並非剪斷、黏貼)下維持不變的學科。其中還可以細分成以下幾個分支:
>[!Important] **一般拓樸學(點集拓樸學)**
研究拓樸空間的基本概念和性質,例如連續性、緊緻性和連通性等。它為其他拓樸學分支提供了基礎,涉及對開集、閉集、鄰域等概念的研究。
>[!Important] **代數拓樸學**
利用抽象代數的方法研究拓樸空間,旨在通過代數不變量(如同調群、同倫群)來分類和分析拓樸空間的性質。其目標是尋找代數不變量,以分類在同胚意義下的拓樸空間。
>[!Important] **微分拓樸學**
研究具有光滑結構的流形上的可微函數,關注微分結構與拓樸性質之間的關係。它與微分幾何密切相關,主要研究在微分流形上的可微函數及其應用。
>[!Important] **幾何拓樸學**
主要研究低維流形及其與幾何的互動,尤其關注三維和四維空間中的拓樸性質。它透過幾何方法研究拓樸空間的性質,是低維流形研究的核心領域之一。
<br>
記得高中的數學老師曾說過:「如果學會了拓樸學就能成為數學大師。」
<br>
當時對於數學有濃厚興趣的我來說,宛如化身成**數學界真新鎮的小智**~~障~~,踏上**目標是成為數學大師**之路。
<br>
然而很快我就被現實打臉了,因為以下兩個原因:
1. 我的幾何學很爛。
2. 拓樸學非常的**抽象**。
<br>
舉例來說,你能相信在拓樸的世界裡**一個馬克杯跟一個甜甜圈**是一樣的嗎?
<br>
如果你跟我一樣不相信、不知道這到底是在公三X的話,那恭喜你我們是同類人。
<br>
但如果你深信不疑,甚至去咖啡廳時會跟店員要甜甜圈裝咖啡,然後津津樂道的開始啃馬克杯,那你肯定有成為**拓樸學家**的資質。
<br>
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/07/01.jpg" alt="圖片描述" style="display: block; margin: 0 auto;" width="600">
> <font size=1><font color=gray>photo credit by: https://www.facebook.com/share/p/15rExYF7ZD/</font></font>
<br>
事實上,**一個馬克杯跟一個甜甜圈**在拓樸學家眼裡確實是一樣的,因為在拓樸學當中,這兩個物體的形狀是同胚(Homeomorphism)。
---
### 同胚(Homeomorphism)
<br>
**同胚**是拓樸學中的一個基本概念,用來描述兩個拓樸空間在拓樸結構上的等價性。直觀上,同胚兩個空間在拓樸性質上是相同的,只是形狀可能不同。
<br>
首先我們先來看看為甚麼**一個馬克杯跟一個甜甜圈是一樣的**。
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/07/02.gif" alt="圖片描述" style="display: block; margin: 0 auto;" width="500">
> <font size=1><font color=gray>photo credit by: 由 Lucas Vieira - 自己的作品, 公有領域, https://commons.wikimedia.org/w/index.php?curid=1236079</font></font>
<br>
上面這個動畫可以看到馬克杯跟甜甜圈可以互相變換。
<br>
下面我們多舉一些例子:
>[!Tip] **例如:**
> - **一個咖啡杯和一個甜甜圈(三維環面)** 在拓樸學上是同胚的,因為它們都具有一個空洞,可以通過變形將它們轉換成彼此。
> - **一個圓和一個橢圓**在拓樸學上是同胚的,因為可以通過拉伸將**圓**變成**橢圓**。
> - **一條橡皮筋和一條直線**在拓樸學上是同胚的,因為**橡皮筋**可以拉直成**一條直線**。
> - **一顆圓球和一個盤子**在拓樸學上是同胚的,因為**圓球**可以壓扁成**一個盤子**。
**同胚**可以看作是將一個物體**拉伸**、**扭曲**或**彎曲**成另一個物體,但不允許**剪切**或**黏貼**。這種情況叫做**可逆的連續變形**。
<br>
>[!Note] **可逆的連續變形(Homotopy)**
>**可逆連續變形**是拓撲學中的一個核心概念,是指在破壞與重組結構的情況下,通過一系列連續變化將一個拓撲空間變為另一個拓撲空間。如果兩個空間之間存在這種變形,它們被稱為同倫等價。
<br>
另外**同胚**具有以下的定義,對於這篇專欄不是太重要,只要知道有這個概念就好。
<br>
>[!Note] **同胚**
設 $X$ 和 $Y$ 為兩個拓樸空間。如果存在一個函數
$$f: X \to Y$$
滿足以下條件,則稱 $f$ 是一個**同胚**,並且 $X$ 和 $Y$ 是**同胚的**(Homeomorphic):
>1. **連續性**:$f$ 是連續函數。
>2. **雙射性**:$f$ 是一個雙射,即 $f$ 是一一對應且滿射的函數。
>3. **逆連續性**:$f^{-1}: Y \to X$ 也是連續的。
如果 $f$ 滿足這三個條件,就可以說 $X$ 和 $Y$ 的拓樸結構完全相同。
<br>
以上定義參考即可。現在我們了解了拓樸學中兩個重要的概念:**同胚**以及**可逆的連續變形**,而且他們的關係是:
$$同胚 \subset 可逆的連續變形$$
也就是只有**同胚**的物體才能進行**可逆的連續變形**,然而可以進行**可逆的連續變形**的物體不一定是**同胚**。
<br>
---
### 拓樸結構分析
接下來我們就可以針對毛巾挑戰進行拓樸結構的分析了。
<br>
首先對兩個正在進行毛巾挑戰的人進行簡化的數學建模,我們可以把**兩個人的手臂+毛巾當作是環**,而**其餘部分就簡化成一根直線**,於是就可以利用以下程式進行建模。
:::spoiler **點擊查看程式碼**
```python=
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 定義參數
t = np.linspace(0, 2*np.pi, 200)
radius = 1.0
# 直線1與直線2的座標
z = np.linspace(-2, 2, 100)
x_line1 = np.zeros_like(z)
y_line1 = np.zeros_like(z)
z_line1 = z
x_line2 = np.ones_like(z) * 2
y_line2 = np.zeros_like(z)
z_line2 = z
# 環1的參數方程(躺在xz平面上)
x_ring1 = radius * np.cos(t)
y_ring1 = np.zeros_like(t)
z_ring1 = radius * np.sin(t)
# 環2的參數方程(垂直於環1)
x_ring2 = radius + radius * np.cos(t)/2
y_ring2 = radius * np.sin(t)
z_ring2 = radius * np.cos(t)/2
# 建立圖形
fig = plt.figure(figsize=(12, 10))
ax = fig.add_subplot(111, projection='3d')
# 繪製直線
ax.plot(x_line1, y_line1, z_line1, 'b-', linewidth=4, label='Body_1')
ax.plot(x_line2, y_line2, z_line2, 'g-', linewidth=4, label='Body_2')
# 分段繪製環1以創建深度效果
for i in range(len(t)-1):
if abs(y_ring2[i]) < radius/2 and x_ring1[i] > 0:
color1 = 'lightcoral' # 被環2穿過的部分用淺色
else:
color1 = 'blue'
ax.plot(x_ring1[i:i+2], y_ring1[i:i+2], z_ring1[i:i+2],
color=color1, linewidth=4)
# 分段繪製環2以創建深度效果
for i in range(len(t)-1):
if abs(y_ring2[i]-0.8*radius) < radius/2 and x_ring1[i] > 0:
color2 = 'lightcoral' # 被環1穿過的部分用淺色
else:
color2 = 'green'
ax.plot(x_ring2[i:i+2], y_ring2[i:i+2], z_ring2[i:i+2],
color=color2, linewidth=4)
# 設定視圖範圍
ax.set_xlim(-1.5, 2.5)
ax.set_ylim(-1.5, 1.5)
ax.set_zlim(-1.5, 1.5)
# 設定比例相等
ax.set_box_aspect([4, 3, 3])
# 調整視角以更好地展示環的相互穿過
ax.view_init(elev=20, azim=45)
# 添加標籤和標題
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')
ax.legend()
plt.title('Towel Challenge Modelling')
plt.show()
```
:::
執行以上程式就可以得到以下輸出:
<br>
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/07/03.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="600">
其中可以看到,我特別將兩個環相互扣著的部分用不同顏色標記出來以便展示。
<br>
接下來為了方便分析拓樸結構,我們做一些簡化。我們都知道線段是可以伸縮的,所以在環上的線段(也就是人的身體的部分)收縮到環上,變成下圖。
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/07/04.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="600">
<br>
我們會發現,原本的結構被簡化成兩個環了,而且這個簡化方式是可逆的連續變形,也就是沒有破壞、重組其結構的變形。<font color=red>**但是!這並不代表變形前後的結構是同胚的哦!**</font>
<br>
現在我們有兩個互相扣著的環了,而事實上這種類型的拓樸結構有一個特別的名稱**霍普夫連結**。
<br>
>[!Note] **霍普夫連結 (Hopf Link)**
> **霍普夫連結**是由兩個閉環組成的拓撲結構,其特點是兩個環互相穿過一次。
<br>
另外,當兩個環沒有相互扣著,這種類型的拓樸結構也有一個特別的名稱叫**平凡連結**。
<br>
>[!Note] **平凡連結 (Unlink)**
> **平凡連結**也是由兩個閉環組成的拓撲結構,但是兩個環並沒有互相穿過。
<br>
有了這些概念,要證明毛巾挑戰是不是真的可以挑戰成功就簡單了。下面來說說我的證明思路:
<br>
>[!Tip] **證明思路**
>**1.** 因為在挑戰開始前(兩個人還沒分開)的狀態可以被簡化成**霍普夫連結**
>**2.** 可以用 **1.** 的簡化過程,將挑戰成功後(兩個人分開了)的狀態簡化成**平凡連結**
>**3.** 所以只要我們能夠證明**霍普夫連結**跟**平凡連結**是同胚
>**4.** 就代表**霍普夫連結**跟**平凡連結**可以進行可逆的連續變形
>**5.** 可以進行**可逆的連續變形**代表**挑戰就可以成功**
<br>
我相信聰明的你一定看出這個證明思路的重點在於 **3.**,所以接下來就讓我們來證明**霍普夫連結**跟**平凡連結**是不是同胚。
---
## **證明**
<br>
首先對於繩結類的拓樸,有發展出另外一套理論叫做**扭結理論 (Knot Theory)**,其中有將這些扭結給分門別類,而其中一種分類方式就是利用連結 (Link)。
<br>
鏈結(link)是指兩個或多個閉合曲線(通常是圓環)在三維空間中的互相纏繞方式,各種連結鏈結可能有不同連結數量,這個數量就被稱做是連結數 (Linking Number)。
>[!Note] **連結數 (Linking Number)**
>若有兩條閉曲線 $C_1$ 和 $C_2$,其**連結數**可以利用**高斯連結數的積分公式**計算:
$$
Lk(C_1, C_2) = \frac{1}{4\pi} \int_{C_1} \int_{C_2} \frac{\mathbf{r}_1 - \mathbf{r}_2}{\|\mathbf{r}_1 - \mathbf{r}_2\|^3} \cdot (\mathrm{d}\mathbf{r}_1 \times \mathrm{d}\mathbf{r}_2)
$$
其中:$\mathbf{r}_1$ 和 $\mathbf{r}_2$ 是分別在兩個環上移動的點的位置向量。
>這個積分公式是雙重積分,意味著:
>
>1. $\mathbf{r}_1$ 遍歷第一個環上的所有點
>2. $\mathbf{r}_2$ 遍歷第二個環上的所有點
>3. 對於每一對點,計算它們的相互影響的大小
>
>而 $\mathrm{d}\mathbf{r}_1 和 \mathrm{d}\mathbf{r}_2$ 是這些點對應的切向量(表示曲線在該點的方向)。
這個公式的物理意義可以理解為:
>
>計算兩個環上所有點對之間的「相互作用」
$(\mathbf{r}_1 - \mathbf{r}_2)$ 表示兩點之間的位置差
$\|\mathbf{r}_1 - \mathbf{r}_2\|^3$ 在分母上類似於重力或電場的平方反比定律
$\mathrm{d}\mathbf{r}_1 \times \mathrm{d}\mathbf{r}_2$ 考慮了兩條曲線在這些點的相對方向
<br>
連結數定義的公式看起來有點複雜,但其實有個更直觀的計算方式:
<br>
>[!Tip] **計算連結數**
>1. **選擇投影平面:** 將兩個閉合曲線投影到某個平面上,使它們的交叉點清晰可見,並且設定環旋轉的方向。
>2. **標記交叉點方向:** 在每個交叉點上,根據右手規則標記正負號。
>3. **計算總和:** 將所有交叉點的正負號相加,得到的總和的一半即為鏈結數。
<br>
接下來我們分別計算**霍夫普連結**以及**平凡鏈結**的連結數看看。
---
### 1. **霍夫普連結的連結數**
首先將**霍夫普連結**投影到 $xy$ 平面上,接著設定兩個環都是順時針轉:
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/07/05.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="500">
<br>
>也可以逆時針轉,只要兩個環的方向一致即可。給予兩個環一致的定向(比如都是逆時針)是為了確保連結數的計算是有意義且一致。如果不給定一致的定向,同一個霍夫連結可能得到不同的連結數。且當我們改變其中一個環的定向時,連結數的符號會改變。
<br>
接著標記交叉點方向。因為我們可以看到,右邊<font color=blue>**藍色的環**</font>從下面往上穿過左邊<font color=green>**綠色的環**</font>,共有兩個交叉點,我們將上面的交叉點標記成 <font color=red>**A點**</font>,下面的交叉點標記成 <font color=red>**B點**</font>。
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/07/06.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="500">
<br>
接著我們先放大來看 <font color=red>**A點**</font>,可以看到這個交叉點是<font color=blue>**藍色的環**</font>在上,<font color=green>**綠色的環**</font>在下,而這邊有箭頭方向,我們可以發現,<font color=blue>**藍色的箭頭**</font>要**往順時針方向**才會跟<font color=green>**綠色的箭頭**</font>同方向。因為是**往順時針方向**,根據右手定則是遠離觀察者,標記為 $-1$。
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/07/07.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="500">
<br>
接著我們先放大再來看 <font color=red>**B點**</font>,可以看到這個交叉點是<font color=green>**綠色的環**</font>在上,<font color=blue>**藍色的環**</font>在下,而這邊的箭頭方向可以發現,<font color=green>**綠色的箭頭**</font>也是要**往順時針方向**才會跟<font color=blue>**藍色的箭頭**</font>同方向。因為是**往順時針方向**,根據右手定則是遠離觀察者,標記為 $-1$。
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/07/08.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="500">
<br>
最後計算總和,因為兩個交叉點的值都是 $-1$ ,所以計算結果為
$$
Lk(C_1, C_2) = \frac{1}{2} \cdot [(-1) + (-1)] = -1
$$
<br>
所以**霍夫普連結**的連結數等於 $-1$。
---
### 2. **平凡連結的連結數**
接著我們再將**平凡連結**投影到 $xy$ 平面上,且一樣設定兩個環都是順時針轉:
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/07/09.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="500">
>注意這邊兩個圓圈只是**重疊**哦!
<br>
接著標記交叉點方向。因為我們可以看到,右邊<font color=blue>**藍色的環**</font>重疊在<font color=green>**綠色的環**</font>上方,共有兩個交叉點,為了跟**霍夫普連結**有所區隔,我們將上面的交叉點標記成 <font color=red>**C點**</font>,下面的交叉點標記成 <font color=red>**D點**</font>。
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/07/10.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="500">
<br>
接著我們先放大來看 <font color=red>**C點**</font>,可以看到這個交叉點是<font color=blue>**藍色的環**</font>在上,<font color=green>**綠色的環**</font>在下,而這邊有箭頭方向,我們可以發現,<font color=blue>**藍色的箭頭**</font>要**往順時針方向**才會跟<font color=green>**綠色的箭頭**</font>同方向。因為是**往順時針方向**,根據右手定則是遠離觀察者,標記為 $-1$。
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/07/11.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="500">
<br>
接著我們先放大再來看 <font color=red>**D點**</font>,可以看到這個交叉點是<font color=blue>**藍色的環**</font>在上,<font color=green>**綠色的環**</font>在下,而這邊有箭頭方向,我們可以發現,<font color=blue>**藍色的箭頭**</font>要**往逆時針方向**才會跟<font color=green>**綠色的箭頭**</font>同方向。因為是**往逆時針方向**,根據右手定則是靠近觀察者,標記為 $+1$。
<img src="https://raw.githubusercontent.com/lewisjjj800soic/HackMD-images-backup/main/Mathematic-Theorems/07/12.png" alt="圖片描述" style="display: block; margin: 0 auto;" width="500">
<br>
最後計算總和,因為交叉點的值分別是 $-1$ 以及 $+1$ ,所以計算結果為
$$
Lk(C_1, C_2) = \frac{1}{2} \cdot [(-1) + (+1)] = 0
$$
<br>
所以**平凡連結**的連結數等於 $0$。
<br>
>[!Note] 註
如果你的數感夠敏銳的話,會發現其實在計算連結數時,透過「箭頭方向與順逆時針」搭配右手定則得判斷方法,就是高中時學過的**外積**,而當你回頭看連結數的定義時也會發現裡面有外積的概念 $(\mathrm{d}\mathbf{r}_1 \times \mathrm{d}\mathbf{r}_2)$ 。
<br>
現在我們已經個別計算出兩個連結的連結數,**霍普夫連結**的連結數等於 $-1$ ,表示兩個環彼此穿過一次;**平凡連結**的連結數等於 $0$ ,表示兩個環彼此之間並無相互穿過。
<br>
在拓撲學中,**連結數**是用來描述兩個閉曲線之間纏繞次數的重要**拓樸不變量**。
---
### 3. 拓撲不變量
<br>
什麼是拓撲不變量?
<br>
>[!Note] **拓樸不變量(Topological Invariant)**
**拓樸不變量**是拓樸學中的一個性質,能夠在拓樸空間進行連續變形(如拉伸或彎曲,但不包括撕裂或切割)時保持不變。這些不變量用於分類和區分不同的拓樸空間。常見的拓樸不變量包括:
>
> - **基本群(Fundamental Group)**:描述空間中環路的同倫類。
> - **歐拉示性數(Euler Characteristic)**:與空間的幾何結構相關。
> - **鏈結數(Linking Number)**:用於描述兩個環的纏繞關係。
<br>
這時你會發現,**鏈結數**也是拓樸不變量,這代表**只要不剪斷環或破壞其結構,連結數 $Lk(C_1, C_2)$ 就不會改變**。
<br>
這意味著,「連結數為 $-1$ 的**霍普夫連結**」無法利用不剪斷環或破壞其結構的方法變成「連結數為 $0$ 的**平凡連結**」。
<br>
同時也代表,在毛巾挑戰中,兩個人將毛巾扣在一起時,無法以不鬆開手或破壞其結構的方法,讓兩人分開。
<br>
所以毛巾挑戰**不可能在不作弊的情況下挑戰成功**。
---
### 4. 小結
<br>
回顧一下,我們先是理解了**拓樸學**中的**同胚**以及**可逆的連續變形**,接著利用建模與簡化的方式,將毛巾挑戰時兩人成功前後的狀態分別簡化成**霍夫普連結**以及**平凡連結**並計算出個別的**連結數**,由於**連結數**為**拓撲不變量**,而霍普夫連結與平凡連結的**拓撲不變量**不同,所以這兩種連結不同胚,從而在毛巾挑戰中無法在不鬆開手或破壞其結構的情況下分開。
---
<br>
## 結論
看到這邊可能有些人會好奇:**可是有些影片挑戰成功了**,其實仔細看會發現很少有人發出真正解法,或是用錯位遮擋的方式來掩飾偷偷放開毛巾的行為,所以**毛巾挑戰終究還是一場騙局**。
<br>
在這篇專欄中,我們從觀察到的現象開始,到蒐集資料、推導並證實,最後得知真相。仔細想想生活中不乏很多現象值得我們去探求真相,無論是真是假,都會讓我們更加趨近於真理,保持實事求是的態度才能在這個資訊爆炸的時代,辨別真假,避免被混淆視聽。
<br>
我是Lewis,我們[**下一篇**](https://hackmd.io/@lewisjjj800/r1U-OQefxl)專欄見!