# 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) ---