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"; } }