裏 RjpWiki

文字通り,RjpWiki の裏を行きます
R プログラム コンピュータ・サイエンス 統計学

ハーディ・ラマヌジャン数

2017年06月09日 | ブログラミング

2 つの数の立方(3乗)の和として表す表し方が 2 通りある 4 桁の自然数を求めよ。

素直にプログラムしても,計算時間は無視できるほど。

mx = floor(9999^(1/3))                    # 1 から 21 までの 3 乗を調べればよい
res = integer(mx^3+(mx)^3)                # 2 数の 3 乗和をメモするためのベクトル
for (i in 1:(mx-1)) {
    for (j in (i+1):mx) {
        num = i^3+j^3                     # 2 数 i, j の 3 乗和
        res[num] = res[num]+1             # 表し方のカウントを増やす
        if (res[num] == 2) cat(num, "\n") # 2 通り目だったら,それが解
    }
}

結果は
1729
4104

for などを使わずに,既存の関数などを使って解を求める。

x = (1:9999^(1/3))^3               # 1 〜 21 の 3 乗を要素とするベクトル
result = outer(x, x, "+")          # 外積(和)を求める
result = result[upper.tri(result)] # 対称行列なので,上側三角行列(対角を除く)の要素を取り出す
tbl = table(result)                # 度数分布を調べる
print(tbl[tbl == 2])               # 度数が 2 のものを書き出す

print 関数で書き出すと答えは
result
1729 4104
   2    2
のようになる。cat ではだめ。

後者のプログラムは前者のものより 2 倍以上速い。

ジャンル:
ウェブログ
コメント   この記事についてブログを書く
この記事をはてなブックマークに追加
« 素因数分解で和が同じ | トップ | スミス数 »
最近の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。

あわせて読む