昨天晚上看到《怎樣解題:數學競賽攻關寶典(第2版)》第7章“數論”7.4節“丟番圖方程”的如下習題:

今天早上 7:15 從家里出發,步行去上班,7:50 到達單位(其間還在單位食堂吃了早餐)。路上反正沒事做,閑著也是閑著,就思考這道題,進行心算。以下是解題過程:

  1. 首先思考兩變量的情況,即:
  2. 因為 是無理數, a = b 是不可能的。
  3. 心算化簡:
    • (a + 1)(b + 1) = 2ab
    • a + b + 1 = ab
    • a + 1= (a - 1)b
    • b = (a + 1) / (a - 1)
  4. 很顯然,(a, b) = (2, 3) 是一組解。
  5. 既然兩變量的情況有解,三變量的原題也可能有解。
  6. 先固定 c = 2,得到
  7. 再試試 c = 3,得到
  8. 繼續試 c = 4,得到
  9. 嗯,還是 c = 3 的情況最簡單。
  10. 類似地心算化簡:
    • 2(a + 1)(b + 1) = 3ab
    • 2a + 2b + 2 = ab
    • 2a + 2= (a - 2)b
    • b = 2(a + 1) / (a - 2)
  11. 顯然,原方程有以下解:
    • (a,b,c) = (3,8,3)
    • (a,b,c) = (4,5,3)
    • (a,b,c) = (5,4,3)
    • (a,b,c) = (8,3,3)

此時,我到達單位了。停止思考,寫了下這篇文章。

在單位,繼續,這次用筆算 c = 2 的情況,得到以下解:

  • (a,b,c) = (4,15,2)
  • (a,b,c) = (5,9,2)
  • (a,b,c) = (6,7,2)

然后,用 C 語言寫了一個非常簡單的程序:

#include <stdio.h>

int main(void)
{
  const int n = 1000;
  for (int a = 2; a <= n; a++)
    for (int b = a; b <= n; b++)
      for (int c = b; c <= n; c++)
        if (2L*a*b*c == (a+1L)*(b+1)*(c+1))
          printf("%d,%d,%d\n", a, b, c);
}

運行結果:

2,4,15
2,5,9
2,6,7
3,3,8
3,4,5

現在我們來證明這些就是原方程的全部解。

不失一般性,假設 2 ≤ a ≤ b ≤ c,(請讀者自己思考 a 為什么不能小于 2)則:

也就是說,a = 2 或 a = 3。

當 a = 2 時,我們有:

也就是說,當 a = 2 時,b 只能是 2, 3, 4, 5, 6 中的一個,這就唯一確定了 c 。

當 a = 3 時,同樣的論證過程可以得出 b 只能是 3 或 4,這也唯一確定了 c 。

證畢。