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)
実は思いっきり整数化で引っかかっていましたので、修正しました。




