跳到主要內容

發表文章

目前顯示的是 9月, 2024的文章

序可序非常序

排序(Sorting) 是資料處理常用的演算法,目的是把一群物件,照特定規則排成一列。例如: $$ M = \{4,67,2,13\} $$ 照數字大小,由小到大的規則排序,排序的結果為: $$ S_{value}(M) = [2,4,13,67] $$ 當然這只是一種排序規則,我們可以定義各式各樣的規則,例如: $$ S_{digits}(M) = [4,2,67,13] $$ 是根據數字的位數,由少到多排序,4、2 都是 1 位數,67、13 都是 2 位數。 任何規則都可以用來排序嗎?不行。排序規則要定義出 順序 關係,順序關係是定義在兩個物件上的,$a$,$b$ 兩物件,在一個排序規則 $T$ 中,最多有三種可能: $a$ 在 $b$ 之前 $a$ 與 $b$ 順序相同 $b$ 在 $a$ 之前 也就是說,$T$ 將一個物件對應到一個實數,且對於任意物件 $a$,$b$ $T(a) \lt T(b)$ $T(a) = T(b)$ $T(b) \lt T(a)$ 三種情況中只有一種成立。 透過排序規則 $T$,任兩個物件 $a$,$b$ 可以比較,而得到兩者的順序關係。這種透過比較的方式做排序的演算法,理論上最快的演算法,其運算數量級是 $O(n\log n)$,也就是說,再怎麼做最佳化,再怎麼尋找方法,對於 $n$ 個物件,一般的情況,要做最多 $k \cdot n\log n$ 次規則 $T$ 比較、資料搬移等運算,頂多能把 $k$ 盡量變小。這裡一般的情況是指資料是隨機的,且排序前不具有特定順序。 比較式排序法有非常多種,如 Bubble sort,Insertion sort,Quick sort,Heap sort 等等,可參考[ Wikipedia ]。 排序太常用了,C stdlib 實做了 Quick sort: qsort()。C++ STL 實作的 std::sort(),更是結合了 Insertion sort, Quick sort 和 Heap sort,根據資料的特性切換不同演算法。 就運算量最佳化來說,資料的特性會大大地影響排序演算法的選擇。例如,在某個應用場景,要維護一份名單,名單按照名字的字母順序,由小到大排列。在這個應用,每次會增加或...

Johan de Ruiter 送給 Donald Knuth 的生日謎題

Johan de Ruiter 在 Donald Knuth 2020 年生日時,送了一個謎題給他,如上圖。[ 原始連結 ] 從 Start 開始,依序把所有蠟燭吹熄,必須沿著連線到下一根蠟燭,且每根蠟燭只能吹一次。因此,答案會是一個蠟燭的序列。 我們嘗試用電腦程式來解。以下範例使用 python 語言。 先把蠟燭編號(A-N): 把蠟燭之間的連接性用 dictionary (即 key-value hash table) 表示: net = { 'A': ['B'], 'B': ['A','D','L'], 'C': ['D','F','G','H','I','K'], 'D': ['B','C','E','F','G','H','J','K','N'], 'E': ['D','C','N','L','K','I','H','F'], 'F': ['E','D','C','L','K'], 'G': ['D','C','K'], 'H': ['E','D','C','K','I'], 'I': ['H','E','C','N','L','K'], ...

想不開的蜜蜂

問題: 兩台火車相距 10 km,在同一條鐵軌上,同時以等速 10 km/h 向對方衝過去。此時一隻想不開的蜜蜂停在其中一台火車頭的前端,以等速 20 km/h 向另一台火車飛去,一碰到另一台火車,馬上轉向,繼續飛,碰到對向火車後一樣瞬間掉頭,如此不斷重複。問:從蜜蜂開始飛到兩台火車撞上,飛行的總距離為何? 分析: 既然蜜蜂是等速飛行,只要知道蜜蜂飛了多久,就能算出總距離。蜜蜂飛行的時間,就是兩台火車從開始往對方衝,到兩台火車對撞的時間。兩台火車各以 10 km/h 的速度前行,可以把其中一台火車視為靜止,另一台以 20 km/h 的速度衝向靜止的這台。總距離 10 km,需時 $$ 10~\text{km} \div 20~\text{km/h} = 0.5~\text{h} $$ 蜜蜂以 20 km/h 飛了 0.5 h,因此總飛行距離是 10 km,這不難理解。 蜜蜂在兩個方向上,分別累積的飛行距離為何?一樣的想法,先考慮飛行時間: 階段 1,蜜蜂與對向火車相距 $d=10$ km,相對速度 10+20 = 30 km/h,飛行時間為 $10 \div 30 = \frac{1}{3}$ h, 此時兩台火車以相對速度 20 km/h 互相靠近了 $\frac{1}{3}$ h,距離變成 $10 - 20 \times \frac{1}{3} = \frac{10}{3}$ km。 階段 2,$d = \frac{10}{3}$ km,相對速度 30 km/h,飛行時間為 $\frac{10}{3} \div 30 = \frac{1}{9}$ h, 此時兩台火車以相對速度 20 km/h 互相靠近了 $\frac{1}{9}$ h,距離變成 $\frac{10}{3} - 20 \times \frac{1}{9} = \frac{10}{9}$ km。 以此類推: $$ \begin{array}{c|c|c|c} \text{Stage} & \text{Direction} & d & \text{Time} \\ \hline 1 & + & 10 & \frac{1}{3} \\ 2 & - & \frac{10}{3} &...

圓周率長話短說

圓周率有什麼好說的? 上網查一下,圓周率是圓的周長與直徑的比率,對任何的圓,比率為定值,約為 3.141592653589...。 知道了圓周率,可以算圓的周長,圓的面積,球的表面積,球的體積,...等等。 圓周率怎麼求出來的?早在西元前,阿基米德用圓的內接正多邊形,與圓的外接正多邊形,來逼近圓的周長: $$ 內接正多邊形周長 \lt 圓周長 \lt 外接正多邊形周長 $$ 使用正 96 邊形,得到近似值 $ \pi \approx \frac{22}{7} \approx 3.142$ 。 數百年後,中國的祖沖之也算出了 約率 $\frac{22}{7}$,及使用更多邊的正多邊形算出的 密率 $\frac{355}{113} \approx 3.141592$ 這個密率值得一提,它準確到小數點以下第 6 位。若把 $\pi$ 表示為分數近似值 $$ \pi \approx \frac{p}{q}~~~p,q~\text{為正整數} $$ 則密率是所有 4 位數 $q$ 中,誤差最小的表示式: $$ \begin{array}{c|r|r|l} \text{q 位數上限} & p & q & \frac{p}{q} \\ \hline 1 & 22 & 7 & 3.14... \\ 2 & 311 & 99 & 3.141... \\ 3 & 355 & 113 & 3.141592... \\ 4 & 355 & 113 & 3.141592... \\ 5 & 312689 & 99532 & 3.141592653... \\ 6 & 3126535 & 995207 & 3.14159265358... \\ 7 & 5419351 & 1725033 & 3.141592653589... \end{array} $$ 更有趣的一點是,$\frac{355}{113}$ 使用 6 個數字將圓周率正確的表示出 7 ...

何時該賣車

何時該把手上的車子賣掉?這個問題要探討的究竟是什麼? 車子與其他商品相同,需要花錢購買,並會隨著時間折損其價值,車子的零件也有其壽命,除了耗材需要定期更換,非耗材的零件,如空調、引擎、變速箱等等,都可能在正常使用下損壞。 目標是花費最少的錢,使用最久的時間。 假設一個理想的情況,車子只會折舊,不會損壞,那麼最好的策略就是一直使用下去,不要賣!隨著時間拉長,單位時間的使用成本(扣除耗材費用)會越來越低。 假設車子在 20 年後殘值歸零,車價平均每年的支出為: $$ \frac{100}{20} = 5~\text{(萬元/年)} $$ 假設每年殘值是前一年的 85%,每年的殘值如下: 問題是車子會壞,而維修費用可能很高,使用成本因而提高。 一般汽車零件的零整比(Parts-to-whole ratio),即零件價格與整車價格的比例,約在 200% 至 800% 不等。零件價格是指,整台車拆開來,以零件購買的總價。進口車的零整比通常比國產車高。 假設一台車,其中 4 分之 1 壞了 ,置換的零件費用約在整車價格的 50% 至 200%。100 萬元的車子,要花 50 萬元至 200 萬元維修,這還只有算零件的費用,沒有算工資!好像提早把車賣掉,購置新車更划算。 那什麼時候該停損?假設新車價 100 萬元,在第 6 年壞了零件 A,維修 3 萬元。假設未來車子的使用方式沒有改變,這表示有極高的機率,在未來的 2、3 年,甚至 3、4 年內,同樣的零件不會壞,而在未來的第 5、6 年,同樣的零件再度損壞的機率極高。因此平均每 6 年都需增加 3 萬元的維修費用, $$ \frac{3}{6} = 0.5~\text{(萬元/年)} $$ 感覺上,維修費用累積超過車價平均年支出的一定比例,先假設是 30%,似乎可考慮將車子賣出了?賣出的時間點,保險一點最好在維修周期來到之前較佳,我們抓 20% 好了,以避開下一次的維修。若有多個零件損壞,則取最貴零件的維修週期。但真的是這樣嗎? 承上例,假設在第 8 年又壞了零件 B,維修 10 萬元,年平均維修費為 $$ \frac{10}{8} = 1.25~\text{(萬元/年)} $$ 加上零件 A 的支出,來到 1.75 萬元/年,超過 20 年攤提均價的 30% ($5 \time...

加起來多一次

等差級數的公式,大家耳熟能詳,其實就是梯形面積公式: $$ 梯形面積 = (上底+下底) \times 高 \times \frac{1}{2} $$ $$ 等差級數 = (首項 + 末項) \times 項數 \times \frac{1}{2} $$ 高斯小時候,已經了解等差級數的公式,快速計算 $$ 1+2+3+\cdots+n=(1+n)n \times \frac{1}{2} $$ 讓老師驚嘆連連。 中學時,我們學了以下公式,計算二次方數列的和: $$ 1^2+2^2+3^2+\cdots+n^2=\frac{n(n+1)(2n+1)}{6} $$ 甚至三次方數列的和: $$ 1^3+2^3+3^3+\cdots+n^3=\frac{n^2(n+1)^2}{4} $$ 而相當奇妙的是,三次方數列的和,恰巧等於一次方數列的和(等差級數)的平方: $$ 1^3+2^3+3^3+\cdots+n^3=\frac{n^2(n+1)^2}{4} = \left[\frac{n(n+1)}{2}\right]^2 = (1+2+3+\cdots+n)^2 $$ 我們可以用數學歸納法證明以上公式。 對於數列 {$n^p$} 的和,也可以用聯立方程式求出,以 $p=2$ 為例,可以假設 $$ 1^2+2^2+3^2+\cdots+n^2=an^3+bn^2+cn+d $$ 一共有 $a,b,c,d$ 4 個變數,帶入 4 個不同的 $n(1,2,3,4)$,可得到 4 個聯立方程式: $$ \begin{eqnarray} \left\{ \begin{array}{rl} 1 &= a+b+c+d \\ 5 &= 8a+4b+2c+d \\ 14 &= 27a+9b+3c+d \\ 30 &= 64a+16b+4c+d \end{array} \right. \end{eqnarray} $$ 可得 \begin{eqnarray} \left\{ \begin{array}{rl} a &= \frac{1}{3} \\ b &= \frac{1}{2} \\ c &= \frac{1}{6} \\ d &= ...

計算機比看到的更多一點

拿一台工程計算機,或是手機上的計算機 App,計算 $1 \div 3$,得到 $$ 0.333333333 $$ 接著按 $\times 3$,得到 $$ 1. $$ 這一番的操作,$1 \div 3 \times 3$ 等於 1,符合預期。 清除結果,按下 $0.333333333 \times 3$,得到 $$ 0.999999999 $$ 亦符合預期。仔細看這兩個運算,是不是有些怪異? $ 1 \div 3$ 顯示 0.333333333,手動輸入也是 0.333333333,為什麼乘 3 之後,結果不同? 原因在於,工程計算機為了控制誤差,內部的數字位數超過可顯示的數字位數,並在顯示數字時,對無法顯示的第一位進行四捨五入。 上述的例子,可顯示的位數為 10 位,內部的數字位數為 11 位,因此 $1\div 3$ 的內部結果為 $$ 0.333333333\underline3 $$ 最後一位 (底線 3) 不顯示,並且四捨五入後,顯示前 10 位 $$ 0.333333333 $$ 接著 $\times 3$,內部數字變成 $$ 0.999999999\underline9 $$ 顯示時,對第 11 位做四捨五入後,顯示前 10 位 $$ 1. $$ 若內部數字的位數更多,則可利用內部數字的最後一位做四捨五入,進而做到不只是顯示的數字誤差小,內部的數字就控制了誤差。 可用以下方法查出內部數字的位數: $$ 1\div 3 - 0.333333333 $$ 即把一個循環小數,減去可顯示位數的部分。 若結果為 0,則內部數字與顯示數字有相同位數;若結果不為 0,則可看出內部數字的位數。 例如,CASIO 簡易非工程用計算機,內部數字與顯示數字位數相同。而 CASIO 工程用計算機,內部數字比顯示數字多出 1 ~ 5 位數。 一般計算機也能做平行處理?例如,要計算以下數字的和 $$ \begin{array}{l} 23 + 39 \\ 213 + 37 \\ 75 + 127 \\ \end{array} $$ 一般的做法,當然就是三次的加法運算。 可以只用一次加法運算,同時得到三個式子的結果: $$ \beg...

無獨有偶

問題: 朋友隨意認養了兩隻貓或狗當寵物,但你不知道貓或狗的數量,且朋友沒有養其他寵物。有一天,在路上,你遇到這位朋友正在遛一隻狗,你問:這是你養的嗎?朋友點頭。求朋友養的兩隻寵物都是狗的機率。 分析: 朋友養的兩隻寵物可能的組合: $$ \begin{array}{c|c|c} \text{No} & \text{寵物1} & \text{寵物2} \\ \hline 1 & Dog & Dog \\ 2 & Dog & Cat \\ 3 & Cat & Dog \\ 4 & Cat & Cat \end{array} $$ 排除 No.4,否則你不可能看到朋友溜狗。 接下來,你看到的狗可能是寵物 1,也可能是寵物 2。 若你看到的狗是寵物 1,那有兩種情況:No.1,No.2 $$ \begin{array}{c|c|c} \text{No} & \text{寵物1} & \text{寵物2} \\ \hline 1 & Dog & Dog \\ 2 & Dog & Cat \\ \end{array} $$ 另一隻寵物(寵物 2)也是狗的機率是:$\frac{1}{2}$。 若你看到的狗是寵物 2,那一樣有兩種情況:No.1,No.3 $$ \begin{array}{c|c|c} \text{No} & \text{寵物1} & \text{寵物2} \\ \hline 1 & Dog & Dog \\ 3 & Cat & Dog \\ \end{array} $$ 則另一隻寵物(寵物 1)也是狗的機率一樣是:$\frac{1}{2}$。 因此,無論如何,朋友的兩隻寵物都是狗的機率為 $\frac{1}{2}$。 另一種更簡單的想法:已經知道朋友有一隻狗了,則朋友有兩隻狗的機率,等同於另一隻寵物是狗的機率。因為是隨意認養,兩隻寵物的種類之間並沒有任何關係,朋友對...

見著知微

問題: 三張數字撲克牌(1-10)分別發給三個人,每個人在心中記下數字,牌收回,洗牌,再次發給這三個人,每個人把拿到的數字和上一次加起來。如此重複了數次,三個人說出各自的總和是:15,17,25。假設三人都沒說謊,心算加總也都正確,求三張撲克牌的數字。(類似的問題可於網路上找到) 分析: 假設三張撲克牌的數字分別為 $x,y,z$,$1\le x,y,z \le 10$。假設發牌 $n$ 次,則 $$ n(x+y+z) = 15 + 17 + 25 = 57 $$ 因為 $n$,$x+y+z$ 都是正整數,把 57 做質因數分解,得 $57 = 3\times19$,所以 $n$,$x+y+z$ 有以下幾種可能: $$ \begin{array}{c|c|c} No & n & x+y+z \\ \hline 1 & 1 & 57 \\ 2 & 3 & 19 \\ 3 & 19 & 3 \\ 4 & 57 & 1 \end{array} $$ 只有 No.2 是合理的,其他不是不符合 $1\le x,y,z \le 10$ 的條件,就是不符合三人加總的結果。因此,發牌 3 次且 $x+y+z = 19$。 接下來,只要找出所有 $x,y,z$ 的排列,套入符合條件的 $x,y,z$,就可以找到解。這工作交給電腦即可。 我們使用 Mathematica 來解。 三張牌重複發 3 次,共有 9 個數字,$x,y,z,x,y,z,x,y,z$ 的每一種排列,分成三組,代表三個人被發到的數字, 定義 $f[v,n]$ 為三人加總 $n$ 次的排列,並以 $v$ 代入 $x,y,z$ 實際的值: f[v_, n_] := Map[Function[x, Map[Total, Partition[x, 3]]], Permutations[Flatten[ConstantArray[{x, y, z}, n]]]] /. v 定義 $g[v,n,a,b,c]$ 來篩選在 $x,y,z$ 的實際值為 $v$ 的情況下,$f[v,n]$ 的結果列表中,符合三人總和分別為 $a,b,c$ 的排列: ...

克難接送

問題: 爸爸載兩個小孩到同一間學校,但車壞了,只能騎速克達載。速克達同時只能載一個人。爸爸要怎麼快速把兩個小孩送到學校? 分析: 假設從家到學校 2 km,速克達不論有沒有載人,時速恆定為 40 km/h,小孩快步走的時速恆定為 4km/h。 一個直接的想法,先騎車送一個到學校,另一個先用走的,爭取一些時間。一個送到學校後,再回頭接另一個。這樣要花 $$ \text{時間} = \frac{\text{距離}}{\text{速度}} \\ t_1 = \frac{2}{40} = 0.05 \text{(hr)} \\ t_2 = \frac{2 - 4t_1}{40+4} \approx 0.04 \text{(hr)} $$ $t_1$ 為速克達載第一個小孩到學校花的時間,$t_2$ 為速克達從學校回頭往第二個小孩的方向騎的時候開始計算,至兩者相遇所花的時間,相對速度為 $40+4$ km/h,距離為 2 km 減去小孩以 4 km/h 速度步行 $t_1$ 時間的距離 $4t_1$。 爸爸騎速克達接到第二個小孩後,再花相同 $t_2$ 的時間將小孩載到學校,因此總時間為 $t_1+2t_2 \approx 0.13 \text{ hr}$,約 7.8 分鐘。過程如下圖 G1~G3,橘、藍箭頭分別表示速克達與小孩的路徑。 這樣是最快的方法嗎? 如果爸爸送第一個小孩時,不要直接送到學校,送到某個地方就折返回去載奮力行走的第二個,情況會如何? 假設爸爸載第一個小孩騎了 $t$ 小時後,放下小孩讓他自己走,折返回去載第二個。 分別看兩個小孩到學校花的時間,過程如下圖 G4~G6: $$ \text{小孩 1 花的時間:} t + t_1\\ ~\\ = t + \frac{2-40t}{4} \\ = \frac{1}{2} - 9t\\ ~\\ ~\\ \text{小孩 2 花的時間:} t + u + t_2\\ ~\\ = t + \frac{40t - 4t}{40+4} + \frac{2 -4(u+t)}{40}\\ = t + \frac{40t - 4t}{40+4} + \frac{2 -4(\frac{40t - 4t}{40+4}+...

平均非線性

問題: 末代燃油車 Eliter,能源局標示,市區油耗 12 km/L,高速油耗 21 km/L,平均油耗 15km/L。小麥開著三年的 Eliter, 上次儀表歸零後,累積開了 195km,平均油耗 10.5 km/L,假設高速行駛可以達到能源局標示的油耗,要再開多少 km 高速,才能達到 總平均油耗 15 km/L? 分析: $$ \text{平均油耗} = {\text{總行駛里程} \over \text{總消耗油量}} $$ 195km,平均油耗 10.5 km/L,用了 $195\div10.5 \approx 18.57$L 的油。 假設要再開 $x$ km 高速,才能達到總平均油耗 15 km/L, $$ 15 = \frac{195 + x}{\frac{195}{10.5}+\frac{x}{21}} $$ 可得 $x \approx 295.43$km,約為高速行駛前累積里程數的 1.5 倍,是不是比預期要多很多? 看看增加的高速里程和平均油耗的關係,定義 $f_{avg}(x)$ 為增加 $x$km 高速里程對應的總平均油耗 $$ f_{avg}(x) = \frac{195 + x}{\frac{195}{10.5}+\frac{x}{21}} $$ 函數圖形如下 但大部分的人會預期一種線性關係,如下圖中的橘線 然而實際上是藍線,速度慢得多。下次在高速公路上,看見平均油耗提升緩慢,不要覺得車子壞了,是正常現象。 若前 195km 平均油耗是 20 km/L,接著開市區,要再開幾公里,總平均油耗掉到 15 km/L?答案是再開 195 km。升的慢,降的倒是很快,後段又變慢,函數圖形如下藍線 $$ g_{avg}(x) = \frac{195 + x}{\frac{195}{20}+\frac{x}{12}} $$

火車座位

問題: 對號座列車有 100 個座位,有 100 位乘客,車票全數賣出。100 位乘客都要上車,須依座位順序上車,對號入座。1號座位是個任性的小朋友,上車後,隨便挑選一個座位就坐下。後續其他人若發現自己的座位沒人坐,就坐自己的位置;若自己的位置被坐了,就隨便挑一個座位坐。問:每個人坐到自己位置的機率為何? 分析: 這題和[ 心臟病(撲克牌遊戲) ]有些相似。 先考慮簡單的情況。 如果只有 1 個座位,1 個小朋友,那一定能坐到自己的位置,機率為 1。 如果有 2 個座位 2 位乘客,最多有 2 種情況: $$ \begin{array}{c|c|c} 排列 & 1 & 2 \\ \hline 12 & \circ & \circ \\ 21 & \\ \hline p & 1\over2 & 1\over2 \end{array} $$ 1 號任性小朋友(簡稱小任)坐對的機率是 $1\over2$,2 號乘客坐對的機率也是 $1\over2$。 如果有 3 個座位 3 位乘客,最多有 6 (3!) 種情況: $$ \require{cancel} \begin{array}{c|c|c|c|l} 排列 & 1 & 2 & 3\\ \hline 123 & \circ & \circ & \circ & \\ \cancel{132} & & & & 不可能 \\ 213 & & & \circ \\ 312 & \\ \cancel{231} & & & & 不可能 \\ 321 & & \circ & \\ \hline p & 1\over4 & 2\over4 & 2\over4 \end{array} $$ 只有 4 種是合理的。 再看一個例子,4 個座位 4 位乘客,最多有 2...

料事如神

問題: 小陳負責採買烤肉食材。豆腐一盒 34元,玉米一包 119元,啤酒一瓶 190元,豬肉一盒 85元,每一種都有買。回程接到小林電話,問他買了多少錢,小陳回答 4200元,小林想了一下說,啤酒 6 瓶不夠啦,再去多買一點!小陳有些驚嚇,小林怎麼知道他買了 6 瓶啤酒? 分析: 小林可能很快了寫了一個程式: # python for a in range(1,112): for b in range(1,112): for c in range(1,112): for d in range(1,112): if (34*a+119*b+190*c+85*d == 4200): print(a,",",b,",",c,",",d) 發現前幾行印出的結果, $c$ 都是 6,因而斷定小陳買了 6 罐啤酒。為什麼每層迴圈只要試 1..111?因為最便宜的豆腐,最多也只能買 111 盒 $(4200-119-190-85)\div34 \approx 111.9$,更貴的品項能買的數量就更少了。 為何如此?我們先把原問題數學化。假設豆腐、玉米、啤酒、豬肉分別買了 $a,b,c,d$ 的量,則 $$ 34a+119b+190c+85d=4200~~~a,b,c,d\in\mathbb{Z},~a,b,c,d \gt 0 $$ 是一個線性整數方程式,求線性整數方程式的解,須判斷其最大公因數 (參考 用5公升和3公升水桶量1公升水 )。先作質因數分解: $$ 2\cdot71a+7\cdot17b+2\cdot5\cdot19c+5\cdot17d=4200 \\ \Rightarrow 17(2a+7b+5d)+190c=4200 \\ \Rightarrow 17k+190c=4200 $$ 因為 17 和 190 互質,因此 $17k+190c=1$ 有整數解,所以 $17k+190c=4200$ 也有整數解。先以輾轉相除法求 $17k+190c=1$ 的一個解, $$ 190 = 17\times11 + 3 \\ 17 = 3 \times 5 + 2 \\ 3 = 2 + 1 \\ (...

後發先至

問題: 一條馬拉松訓練跑道,阿甘第一天跑 5km,第二天接著跑 8km,每天增加 3km,最後一天跑了 3km 到達終點。凱文是馬拉松選手,第一天跑 14km,第二天接著跑 17m,一樣每天增加 3km,最後一天跑了 4km 到達終點,求跑道長度。 分析: 假設跑道長 $L$km,則 $$ \begin{array} \text{阿甘}:L &= 5 + 8 + \dots + 3 \\ \text{凱文}:L &= 14 + 17 + \dots + 4 \end{array} $$ 很明顯,拿掉最後一項,就成了等差級數,公差都是 3。帶入等差級數公式,假設阿甘跑了 $n+1$ 天,凱文跑了 $m+1$ 天,則 $$ \begin{array} \text{阿甘}:L &= \frac{5+5+3(n-1)}{2}n+3 \\ \text{凱文}:L &= \frac{14+14+3(m-1)}{2}m+4 \end{array} $$ 整理後得到 $$ 3m^2+25m+2 = 3n^2+7n \\ \Rightarrow (6m+25)^2-(6n+7)^2=552\label{1}\tag{1} $$ 這是一個形如 $Ax^2+By^2=C$ 的二次整數方程式,一般解法有點複雜,有興趣可參考[ Diophantine Equation--2nd Powers ]。現今的數學軟體已經能解這類的問題,如 WolframAlpha: 合理的答案是 $m=4, n=6$。 但是,這題真有這麼難嗎?是不是有什麼線索沒有用到? 既然兩人都是每天增加 3km,而且凱文開始的日行距離,出現在阿甘的日行距離序列中,我們重新排列式子,讓兩人的日行距離對齊,而非時間對齊: $$ \begin{array} \text{阿甘}:&L = 5 + 8 + 11 + &14 + 17 + \dots + 3 \\ \text{凱文}:&L = &14 + 17 + \dots + x + 4 \end{array} $$ 可以發現兩個序列有重疊的部分,把重疊的部分消去,得到...