1729がつまらない数字だって?そんなことはないよ

30分プログラム、その594。wikipedia:シュリニヴァーサ・ラマヌジャンのエピソードで有名な1729が、ホントに2通りの2つの立方数の和で表せる最小の数かを確かめてみよう。

1729な有名なエピソードはこんな感じのやつ。

1918年2月ごろ、ラマヌジャンは療養所に入っており、見舞いに来たハーディは次のようなことを言
った。
「乗ってきたタクシーのナンバーは1729だった。さして特徴のない、つまらない数字だったよ」
これを聞いたラマヌジャンは、すぐさま次のように言った。
「そんなことはありません。とても興味深い数字です。それは2通りの2つの立方数の和で表せる最小の数です」

というわけで、1から2000までの数字が何通りの立方数の和で表せるかを調べてみた。

使い方

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

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# 1729.pl -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/05/30 07:54:10
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#
use strict;
use warnings;
use POSIX;

sub cube_root($) {
    my ($n) = @_;

    $n ** (1/3);
}

sub is_int($){
    my ($n) = @_;

    "$n" eq sprintf("%d",POSIX::ceil($n))
}

sub ramanujan($){
    my ($n) = @_;

    grep { $_->[0] > $_->[1] && is_int($_->[1]) }
         map { [$_,cube_root($n - $_**3)] }
         (1..POSIX::ceil(cube_root($n)));
}

use Data::Dumper;
foreach my $n (1..2000) {
    my @ram = ramanujan($n);
    if(@ram){
	print $n;
	foreach (@ram){
	    print ' = ',$_->[0],'^3 + ',$_->[1],'^3';
	}
	print "\n";
    }
}