---
# System prepended metadata

title: Pigeonhole Principal and Its Application 鴿籠原理及應用

---

# Pigeonhole Principal and Its Application 鴿籠原理及應用

## 1. Art Gallery Problem

在計算幾何理論 (Computational Geometry) 中，畫廊原理說明現實生活中以安全和成本作為考量，將畫廊平面圖以多邊形呈現，攝影機是邊上的點，計算最少需要擺放幾個攝影機，可以同時間讓能見視角遍及每個角落。

>### Chvátal's art gallery theorem
>
>定義：簡單多邊形有 $n$ 個頂點，則 $\lfloor \frac{n}{3} \rfloor$ 個 360 度攝影機足夠涵蓋多邊形每個地方(每個地方至少有一個攝影機照視)

先以簡單圖形來觀察，假設有一個三角形(三條邊的凸多邊形)，則放置攝影機在任一頂點即可看到每個地方，這是因為任一頂點是兩條邊所組成，而由頂點延伸出去的兩邊會包含整個三角形。

所以接著可以將多邊形問題簡單化，也就是將多邊形切割成多個三角形 (triangulated)，再來使用圖著色問題 (Graph Coloring Problem) 的方法，讓每個三角形都由紅藍綠三色不重複組成。

![Minion](https://i.imgur.com/ayWFp3C.png =200x200)
>picture from Wiki

最後，使用鴿籠原理 (Pigeon Hole Principal)，若 $n$ 隻鴿子放在 $k$ 個鴿籠，則至少一個鴿籠必須不超過 $\frac{n}{k}$ 隻鴿子。在此 $n$ 為多邊形頂點， $k$ 為紅藍綠三色，依據鴿籠原理存在一個顏色出現必須不超過 $\lfloor \frac{n}{3} \rfloor$ 次。故得證。

參考資料：
- [Proofs from THE BOOK by Martin Aigner, Günter M. Ziegler](https://www.amazon.com/Proofs-BOOK-Martin-Aigner/dp/3642008550)
- [Wiki - Art gallery problem](https://en.wikipedia.org/wiki/Art_gallery_problem)
- [Wiki - Graph coloring](https://en.wikipedia.org/wiki/Graph_coloring)
---


## 2. Kolmogorov Complexity - Incompressiblity

演算法資訊理論 (Algorithmic Information Theory) 領域中，柯氏複雜性是用來衡量物件或演算法在最佳規格下的長度，也可以被解釋為演算法熵 (Algorithmic Entropy) 代表一個物件所擁有的訊息量。

舉例來說，下面字串可以用 Haskell 以『重複 16 個 01』表示
```
01010101010101010101010101010101
```
```Haskell
// Haskell Language
take 16 $ cycle "01"
```

而下面字串則無法再用更簡短的表達式去說明
```
4c1j5b2p0cv4w1x8rx2y39umgw5q85s7
```

所以可以解釋為第二個字串複雜度較高。接著，探討一個字串 $s$ 是否能被壓縮，同樣可以利用鴿籠原理推導，$d(s)$ 是 $s$ 字串的最短詮釋，$K(s)$ 是 $d(s)$ 的長度，若 $s$ 無法被壓縮，則代表 $K(s) ≥ s$。也就是對於所有 $n$ 位元字串，存在不可壓縮的字串 (長度大於等於 $n$)。根據鴿巢原理，有 $2^{n}$ 個長度為 $n$ 位元的字串，但是只存在 $2^{n} - 1$ 個長度小於 $n$ 位元的詮釋後字串，因為

$$\sum_{n=0}^{n-1} 2^{i} = 2^{n} - 1$$

說明每一個壓縮後的字串對應唯一的壓縮前的字串，所以不可壓縮的字串一定存在，且很可能大部分的字串無法被壓縮。

參考資料：
- [Wiki - Kolmogorov complexity](https://en.wikipedia.org/wiki/Kolmogorov_complexity)
- [Wiki - Lossless compression](https://en.wikipedia.org/wiki/Lossless_compression#Limitations)
- [一杯咖啡的「表觀複雜性」](https://www.gvm.com.tw/article/40880)
---

## 3. Erdős Szekeres Theorem

鴿籠原理也可以來證明此定理

>### Erdős Szekeres theorem
>定義：由不同數字組成 $n^2 + 1$ 長度的串列，則一定有一段遞增或遞減子串列，長度為 $n + 1$

首先，假設串列中每個元素為 $a_i$，其中 $1 \le i \le n^2 + 1$，$u(i)$ 代表最長遞增子字串結束在 $a_i$ 的長度，$d(i)$ 代表最長遞減子字串結束在 $a_i$ 的長度。若反假設子字串長度不到 $n + 1$ 則 $1 \le u(i) \le n$ 和 $1 \le d(i) \le n$，那 $(u(i), d(i))$ 會有 $n^2$ 種不同數字排序組合。因此根據鴿籠原理，在 $n^2 + 1$ 個元素裡面會有兩個相同，$i < j$ ， $a_i = a_j$ 即 $u(i)=u(j)$ 和 $d(i)=d(j)$，可是發現由於串列一定是不同的數字組成，所以經由反證得 $u(j) = u(i) + 1$ 或 $d(j) = d(i) + 1$。確認能找到一段長度為 $n + 1$ 的遞增或遞減的子串列。

參考資料：
- [Wiki - Erdős–Szekeres theorem](https://en.wikipedia.org/wiki/Erd%C5%91s%E2%80%93Szekeres_theorem)
- [EECS at UC Berkeley - Pigeonhole principle](https://people.eecs.berkeley.edu/~oholtz/191/pigeonhole.pdf)
- [CS at Purdue - Pigeonhole principle](https://www.cs.purdue.edu/homes/hmaji/teaching/Spring%202016/lectures/01.pdf)
---


## 4. Chinese Remainder Theorem

數論 (Number Theory) 中，著名的中國剩餘定理提供必要條件，使多重等式有共同正整數解，可參考

>### Chinese Remainder Theorem
>定義：若 $m$ 和 $n$ 為互值的正整數，則存在 $x$ 使得 $x=a(mod \space m)$ 和 $x=b(mod \space n)$

首先考慮 $n$ 個正整數 $a, m + a, 2m + a, \ldots,(n-1)m + a$ 除以 $m$ 的餘數都是 $a$，假設其中兩數 $im + a,$ $jm + a$ $(0 ≤ i < j ≤ n - 1)$ 除以 $n$ 有相同餘數 $r$，則有兩個整數 $p, q$ 使得 $im + a = pn + r$ 和 $jm + a = qn + r$，相減得 $(j - i) m = (p - q) n$ 且 $\gcd(m, n) = 1$，故得 $n$ 是 $j - i$ 的因子。然而 $0 ≤ j - i ≤ n - 1$ 有矛盾，所以假設不成立。
即上述 $n$ 個整數除以 $n$ 都有不同的餘數，依據鴿籠原理 $0, 1, 2, \ldots , (n-1)$ 都會出現，且 $0 ≤ b ≤ n - 1$ ，所以 $b$ 會是餘數。使 $k$ 為整數，$0 ≤ k ≤ n - 1$，$km + a$ 除以 $n$ 的餘數是 $b$，則有 $f$ 使以下成立：

$$x = km + a = fn + b$$

有此 $x$ 除以 $m$ 餘 $a$，除以 $n$ 餘 $b$。


參考資料：
- [Wiki - Chinese remainder theorem](https://en.wikipedia.org/wiki/Chinese_remainder_theorem)
- [Cut the knot - Chinese Remainder Theorem](https://www.cut-the-knot.org/blue/chinese.shtml)
---

## 5. Birthday problem

參考生日問題的計算公式：

$$1-\frac{365×364×⋯×(366−n)}{365^n} = 1 - \frac{365!}{(365-n)!365^n}$$

會發現在不超過 $365$ 人的情況下，兩人生日為相同的機率違反直覺地高，如 $23$ 人則機率超過 $50\%$，而 $70$ 人機率就高達 $99\%$，此現象稱作生日悖論 (birthday paradox)。另透過鴿籠原理，可以很直觀的知道若人數超過 $365$ 人，則其中兩人生日相同的機率為 $100\%$。

在密碼學 (Cryptography) 中利用雜揍程式 (hash function) 處理訊息，攻擊者可以透過碰撞 (collision) 獲取訊息，生日攻擊 (birthday attack) 就是在計算雜湊程式的防碰撞能力。

$$p_M(n) = 1 - \frac{M!}{(M - n)!M^n}$$

攻擊者在碰撞機率超過 $p_M(n) = 0.5$ 之前需要計算多少數值，雜湊範圍在 $32$ 位元時 $(M = 2^{32})$ 約 $4 \times 10^9$，而 $64$ 位元時約 $10^{19}$。實際應用上，更大的雜湊範圍可降低弱點。

參考資料：
- [Wiki - Birthday problem](https://en.wikipedia.org/wiki/Birthday_problem)
- [Wiki - Cryptography](https://en.wikipedia.org/wiki/Cryptography)
---










