1 から 2000 までの数字が何通りの立方数の和で表せるか

1729がつまらない数字だって?そんなことはないよ - みずぴー日記からですが、シュリニヴァーサ・ラマヌジャン - Wikipedia にあるように 1729 はつまらない数字ではないそうです。

1729がつまらない数字だって?そんなことはないよ - みずぴー日記では Perlで整数判定がしたい - みずぴー日記から分かるように立方根を計算する際の int() の挙動を含めて読むと楽しめますが、ここでは立方根を使わず普通にループで計算させます。

#! /usr/local/bin/nawk -f
# 1729_2.awk
# 1 から 2000 までの数字が何通りの立方数で表されるかを表示する

BEGIN {
    for (i = 1; i <= 2000; i++) {
        for (j = 0; j <= i ^ (1 / 3) + 1; j++) {
            for (k = 0; k <= i ^ (1 / 3) + 1; k++) {
                if (j ^ 3 + k ^ 3 == i && j <= k) {
                    arr[i, j, k] = i " = " j " ^ 3 + " k " ^ 3";
                    print arr[i, j, k];
                }
            }
        }
    }
}

for 文の 3 重ループは見た目に良くありませんが、比較的高速に計算してくれます。

$ time nawk -f 1729_2.awk
1 = 0 ^ 3 + 1 ^ 3
2 = 1 ^ 3 + 1 ^ 3
8 = 0 ^ 3 + 2 ^ 3
9 = 1 ^ 3 + 2 ^ 3
16 = 2 ^ 3 + 2 ^ 3
27 = 0 ^ 3 + 3 ^ 3
28 = 1 ^ 3 + 3 ^ 3
35 = 2 ^ 3 + 3 ^ 3
54 = 3 ^ 3 + 3 ^ 3
64 = 0 ^ 3 + 4 ^ 3
65 = 1 ^ 3 + 4 ^ 3
72 = 2 ^ 3 + 4 ^ 3
91 = 3 ^ 3 + 4 ^ 3
125 = 0 ^ 3 + 5 ^ 3
126 = 1 ^ 3 + 5 ^ 3
128 = 4 ^ 3 + 4 ^ 3
133 = 2 ^ 3 + 5 ^ 3
152 = 3 ^ 3 + 5 ^ 3
189 = 4 ^ 3 + 5 ^ 3
216 = 0 ^ 3 + 6 ^ 3
217 = 1 ^ 3 + 6 ^ 3
224 = 2 ^ 3 + 6 ^ 3
243 = 3 ^ 3 + 6 ^ 3
250 = 5 ^ 3 + 5 ^ 3
280 = 4 ^ 3 + 6 ^ 3
341 = 5 ^ 3 + 6 ^ 3
343 = 0 ^ 3 + 7 ^ 3
344 = 1 ^ 3 + 7 ^ 3
351 = 2 ^ 3 + 7 ^ 3
370 = 3 ^ 3 + 7 ^ 3
407 = 4 ^ 3 + 7 ^ 3
432 = 6 ^ 3 + 6 ^ 3
468 = 5 ^ 3 + 7 ^ 3
512 = 0 ^ 3 + 8 ^ 3
513 = 1 ^ 3 + 8 ^ 3
520 = 2 ^ 3 + 8 ^ 3
539 = 3 ^ 3 + 8 ^ 3
559 = 6 ^ 3 + 7 ^ 3
576 = 4 ^ 3 + 8 ^ 3
637 = 5 ^ 3 + 8 ^ 3
686 = 7 ^ 3 + 7 ^ 3
728 = 6 ^ 3 + 8 ^ 3
729 = 0 ^ 3 + 9 ^ 3
730 = 1 ^ 3 + 9 ^ 3
737 = 2 ^ 3 + 9 ^ 3
756 = 3 ^ 3 + 9 ^ 3
793 = 4 ^ 3 + 9 ^ 3
854 = 5 ^ 3 + 9 ^ 3
855 = 7 ^ 3 + 8 ^ 3
945 = 6 ^ 3 + 9 ^ 3
1000 = 0 ^ 3 + 10 ^ 3
1001 = 1 ^ 3 + 10 ^ 3
1008 = 2 ^ 3 + 10 ^ 3
1024 = 8 ^ 3 + 8 ^ 3
1027 = 3 ^ 3 + 10 ^ 3
1064 = 4 ^ 3 + 10 ^ 3
1072 = 7 ^ 3 + 9 ^ 3
1125 = 5 ^ 3 + 10 ^ 3
1216 = 6 ^ 3 + 10 ^ 3
1241 = 8 ^ 3 + 9 ^ 3
1331 = 0 ^ 3 + 11 ^ 3
1332 = 1 ^ 3 + 11 ^ 3
1339 = 2 ^ 3 + 11 ^ 3
1343 = 7 ^ 3 + 10 ^ 3
1358 = 3 ^ 3 + 11 ^ 3
1395 = 4 ^ 3 + 11 ^ 3
1456 = 5 ^ 3 + 11 ^ 3
1458 = 9 ^ 3 + 9 ^ 3
1512 = 8 ^ 3 + 10 ^ 3
1547 = 6 ^ 3 + 11 ^ 3
1674 = 7 ^ 3 + 11 ^ 3
1728 = 0 ^ 3 + 12 ^ 3
1729 = 1 ^ 3 + 12 ^ 3
1729 = 9 ^ 3 + 10 ^ 3
1736 = 2 ^ 3 + 12 ^ 3
1755 = 3 ^ 3 + 12 ^ 3
1792 = 4 ^ 3 + 12 ^ 3
1843 = 8 ^ 3 + 11 ^ 3
1853 = 5 ^ 3 + 12 ^ 3
1944 = 6 ^ 3 + 12 ^ 3
2000 = 10 ^ 3 + 10 ^ 3
nawk -f 1729_2.awk  0.31s user 0.00s system 98% cpu 0.322 total

さて、他に 2 とおりの 2 つの立方数の和で表すことができる数字はないのでしょうか? 日本の「タクシーのナンバー」は 4 桁ですので、もう少し範囲を広げてみましょう。

#! /usr/local/bin/nawk -f
# 1729_3.awk
# 1 から 9999 までの数字が何通りの立方数で表されるかを表示する

BEGIN {
    for (i = 1; i <= 9999; i++) {
        for (j = 0; j <= i ^ (1 / 3) + 1; j++) {
            for (k = 0; k <= i ^ (1 / 3) + 1; k++) {
                if (j ^ 3 + k ^ 3 == i && j <= k) {
                    arr[i, j, k] = i " = " j " ^ 3 + " k " ^ 3";
                    print arr[i, j, k];
                }
            }
        }
    }
}

実行してみますが、ここでは必要なものだけを抜き取ります。

$ nawk -f 1729_3.awk | nawk '$0=$1' | uniq -c | nawk '$1>1'
      2 1729
      2 4104

つまり 4104 も 2 とおりの立方数の和で表すことができます。

もっとも普通の企業で「そんなことはありません。とても興味深い数字です。それは2通りの 2 つの立方数の和で表せる数です」と言っても「で?」と言われて話が弾むことはないと思います。

修正しました (2009/05/30)

実は思いっきり整数化で引っかかっていましたので、修正しました。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png