600个世界著名数学征解问题》(冯贝叶编译,哈尔滨工业大学出版社,2017 年 1 月第 1 版)第 1 章第 5 题:

1-5. (AMM 5324) 自从哈代(Hardy)去看当时住在帕特尼的拉马努金(Remanujian)以来,已经众所周知 1 729 是最小的可用两种不同的方式表示为两个正整数的立方和的正整数。
(1) 证明 3 367 可用三种不同的方式表示为两个正整数的立方差。
(2) 什么数是最小的可用三种不同的方式表示为两个正整数的立方和的正整数?

令 c = a + b,则 a3 + b3 = c(c2 - 3a(c-a)) 。我们使用以下 C# 程序来解答第 (2) 小题:

 1    using System;
 2    using System.Collections.Generic;
 3    
 4    static class M105
 5    {
 6      static int CubeRoot(long z)
 7      { // z > 0
 8        double a = Math.Pow(z, 1/3.0), b = Math.Round(a);
 9        if (Math.Abs(a - b) > 1e-9) return -1;
10        return (int)b;
11      }
12    
13      static void Out(long z)
14      {
15        Console.Write("{0,18:N0}:", z);
16        for (int b, a = 1; ; a++) {
17          long v = z - (long)a*a*a;
18          if (v < z / 2) break;
19          if ((b = CubeRoot(v)) < 0) continue;
20          Console.Write(" ({0,5},{1,5})", a, b);
21        }
22        Console.WriteLine();
23      }
24    
25      static void Main()
26      {
27        try {
28          var dict = new Dictionary<long, byte>();
29          for (int c = 2; ; c++)
30            for (int a = c >> 1; a > 0; a--) {
31              long z = ((long)c * c - 3L * a * (c - a)) * c;
32              byte n; dict.TryGetValue(z, out n);
33              dict[z] = (byte)(++n);
34              if (n >= 3) Out(z);
35            }
36        }
37        catch (OutOfMemoryException) { }
38        Console.WriteLine("End");
39      }
40    }

这个程序在一台 16 GB 内存的计算机的运行结果如下所示:

$ mcs 600-1-05.cs && mono 600-1-05.exe

        87,539,319: (  167,  436) (  228,  423) (  255,  414)
       119,824,488: (   11,  493) (   90,  492) (  346,  428)
       143,604,279: (  111,  522) (  359,  460) (  408,  423)
       175,959,000: (   70,  560) (  198,  552) (  315,  525)
       327,763,000: (  300,  670) (  339,  661) (  510,  580)
       804,360,375: (   15,  930) (  198,  927) (  295,  920)
       700,314,552: (  334,  872) (  456,  846) (  510,  828)
       958,595,904: (   22,  986) (  180,  984) (  692,  856)
     1,148,834,232: (  222, 1044) (  718,  920) (  816,  846)
 ...
 6,212,251,773,000: ( 3375,18345) ( 5580,18210) (10215,17265)
 5,383,741,263,992: ( 5195,17373) ( 6336,17246) (12872,14814)
End

这个 C# 程序其实是搜索用三种及以上方式表示为两个正整数的立方和的数。它无限运行下去,直到耗尽计算机的内存。或者,如果你有巨量的内存,则因整数溢出导致逻辑错误。

书上的答案:

(1) 3 367 = 153 - 23 = 163 - 93 = 343 - 333
(2) 87 539 319 = 4143 + 2553 = 4233 + 2283 = 4363 + 1673
这是用计算机搜索所得的最小的可能的数。见 Some Solutions of Diophantine Equations, Proc. Cambridge Phil. Soc., 53(1957), 779.

顺便说一下,拉马努金的 1 729 = 13 + 123 = 93 + 103

附:Mathematical Proceedings of the Cambridge Philosophical Society:
Some solutions of Diophantine equations

进阶

将上述 C# 程序的 Main 方法修改为(指定 Dictionary 的容量以节省内存):

static void Main()
{
  var capacity = 550 * 1024 * 1024; // 16 GB memory
  var dict = new Dictionary<long, byte>(capacity);
  for (int c = 2; ; c++)
    for (int a = c >> 1; a > 0; a--) {
      if (dict.Count >= capacity) goto exit;
      long z = ((long)c * c - 3L * a * (c - a)) * c;
      byte n; dict.TryGetValue(z, out n);
      dict[z] = (byte)(++n);
      if (n >= 4) Out(z, n);
    }
  exit: Console.WriteLine("End ({0:N0})", dict.Count);
}

在同一台 16 GB 内存的计算机上运行 2 分 53 秒后,得到以下结果:

 6,963,472,309,248: ( 2421,19083) ( 5436,18948) (10200,18072) (13322,16630)
12,625,136,269,928: ( 4275,23237) ( 7068,23066) (10362,22580) (12939,21869)
21,131,226,514,944: ( 1539,27645) ( 8664,27360) (11772,26916) (17176,25232)
26,059,452,841,000: ( 4170,29620) (12900,28810) (14577,28423) (21930,24940)
End (576,716,800)

由此可见:

6 963 472 309 248 = 24213 + 190833 = 54363 + 189483 = 102003 + 180723 = 133223 + 166303

这是最小的可用四种不同的方式表示为两个正整数的立方和的数。