ハーディ・ラマヌジャン数の一般化


12

1729は、ハーディ–ラマヌジャン数として知られ、2つの方法で正の整数の2つの立方体の合計として表現できる最小の正の整数です(12^3+1^3=10^3+9^3=1729)。n(選択した言語にとって自然な形式の入力として)整数が与えられた場合n、2つの一意の方法で2のべき乗した正の整数の和として表現できる最小の正の整数を見つけます。外部ソースを使用しません。最も少ないキャラクターが勝ちます。

これは実際にはの未解決の問題あることに注意してくださいn>4。これらの数値については、プログラムを検索で永久に実行するか、試してみてください!無限の時間とリソースが与えられた場合に、プログラムが問題を解決するようにします。


2
あなたは(?)、「2つの合計を指定したい場合があり正の整数に上げn乗を」。それ以外の場合は、91(ない1729)のためのソリューションであるn=3ことから、6^3+(−5)^3=4^3+3^3=91。私はあなたのウィキペディアのリンクからこれを学んだので、多分あなたのHM参照はこれを慣例で不要にします。乾杯!
ダレンストーン

実際、1最初のソリューションです:1 = cbrt(0.5)^3 + cbrt(0.5)^3 = ...
ジョン・ドヴォルザーク

提案と編集をありがとう-2つの正の整数を意味します!
ベン・ライヒ

1
@JanDvorak、はい、はい。それは維持R EAL!
ダレンストーン

あなたは「最小の正の整数を見つける」と言います ...それあたかも1つあるかのようです-しかし、n > 4の場合、そのような数の存在は未解決の問題です。「最小の正の整数(ある場合)を見つける」と言う必要があるかもしれません...「答え」は、何も見つからない終了しないループである可能性があります。
解像度

回答:


3

APL  45  41

{⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1}

41文字のより短いが遅いバージョン:

{⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⍺:⍺⋄⍵∇⍨⍺+1}

オンラインで試すことができます。関数を貼り付けて、番号を付けて呼び出すだけです:

      {⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 2
50
      {⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 3
1729

(ただし、アルゴリズムは非常に愚かです。オンラインインタプリタがn = 4を計算することを期待しないでください)

n = 2の答えは50 =5²+5²=7²+1²です。これは、「2つの正の整数の2乗の合計として表現できます。

distinct句を追加する場合は、に変更(v∘.≤v)(v∘.<v)、同じ文字数にすると、n = 2は65になります。

      {⍺←1⋄2≤+/,⍺=(v∘.<v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 2
65

GolfScriptを破っていますか?できません!!


いいね!そして、私は明確な整数を意味しましたが、私は指定しなかったので、yaにもっと力があります!戻るGolfScript ...のための描画ボードへ
ベン・ライヒ

2

ルビー、132

n=$*[r=0].to_i;while r+=1
r.times{|a|r.times{|b|next if
a**n+b**n!=r;r.times{|c|r.times{|d|puts(r)if
c**n+d**n==r&&a!=c&&a!=d}}}}end

nコマンドライン引数として渡します。最初の行stdoutは解決策です。

パフォーマンスではなく、コードゴルフ用に最適化されています。(正常に実行されます。ただし、低速です。必要以上の作業を行います。)


これは、より長く、わずかに高速なCプログラムです。同じ正しいが恐ろしいアルゴリズム。(私は本当にもっと理論を勉強する必要があります!)

n= 2、n= 3 についてテスト済み。

C、234

#include<stdio.h>#include<math.h>
r,a,b,c,d;main(n){scanf("%d",&n);while(++r){for(a=0;a<r;++a){for(b=a;b<r;++b){if(pow(a,n)+pow(b,n)!=r)continue;for(c=a+1;c<r;++c){for(d=0;d<r;++d){if(pow(c,n)+pow(d,n)==r&&a!=d)printf("%d\n",r);}}}}}}

C版は取りnstdin。上記のように、最初の行stdoutは解決策です。


1

GolfScript 53

1\.{;\).,{}@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)

入力は、スタックの初期番号です。最後のスタックの一番上の数字が答えです。機会があれば、これについて詳しく説明します。

例えば

{1\.{;\).,@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)}:f
2 f -> 25 
3 f -> 1729

これは今かなり遅いです。また、カウント025がのための答えであるので、(n=2以来、25=5^2+0^2=3^2+4^22つの文字を追加し、0をカウントしていないために、(;最初の後,

1\.{;\).,(;{}@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)

それを見つけるために2 f=6565=8^2+1^2=5^2+6^2


1

GolfScript(30文字)

:N{).,{)N?}%:P{1$\-P?)},,3<}do

注:優先度キューのようなエレガントなものではなくブルートフォース検索を行うため、これは非常に低速です。これについて最もエレガントなことはN、検索の下限として再利用することです。これは1^N + 2^N > Nすべての理由で有効ですN

受け取りNスタック上に、スタック上の対応するタクシー数を残します。Nstdinから取得するには、を追加し~ます。

上記のバージョンは許可しますx^N + x^N(そのためN=2にを提供します50)。個別の番号を追加する必要がある(65代わりに与える)には、を変更34ます。0^N + x^N(与える25)を許可するには、)直前のを削除しN?ます。


0

Mathematica、58文字

生成関数を使用した非常に遅いソリューション:

0//.i_/;(D[Sum[x^(n^#),{n,1,i}]^2,{x,i}]/.x->0)/i!<4:>i+1&
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.