Erdős–Strausの予想を検証するプログラムを書く


15

Erdős–Straus予想を検証するプログラムを作成します。
プログラムは、入力としてひとつの整数を取るべきであるn3 <= n <= 1 000 000)とアイデンティティを満たす整数の三重印刷します4/n = 1/x + 1/y + 1/z0 < x < y < z

最短のコードが優先されます。

いくつかの例:

3 => {1, 4, 12}
4 => {2, 3, 6}
5 => {2, 4, 20}
1009 => {253, 85096, 1974822872}
999983 => {249996, 249991750069, 62495875102311369754692}
1000000 => {500000, 750000, 1500000}

複数の解決策があるため、プログラムはこれらの数値に対して他の結果を出力する場合があることに注意してください。


プログラムは可能なソリューションをすべて出力する必要がありますか、それとも1つだけを出力する必要がありますか?たとえば、n = 5には2つの可能性があります。
izlin 14

1
1つだけで十分です。
ソムニウム14

2
あなたの唯一のテストケースが仕様に従って有効な入力ではないことはやや誤解を招きます。
ピーターテイラー

変更します。例ではdurron597を追加しました。
ソムニウム

私の研究がそれを行うのが特に難しいものであると示唆したので、私はその例を追加しました。最も難しいものは、{1, 121, 169, 289, 361, 529}モジュロ840に一致する素数です。
durron59714

回答:


12

ルビー、119 106文字

f=->s,c,a{m=s.to_i;c<2?m<s||(p a+[m];exit):(1+m...c*s).map{|k|f[s/(1-s/k),c-1,a+[k]]}}
f[gets.to_r/4,3,[]]

コードは、各変数に対して最小の境界を使用n/4<x<3n/4yます。最後の例でも瞬時に戻ります(ここで試してください)。

例:

> 12
[4, 13, 156]

> 123
[31, 3814, 14542782]

> 1234
[309, 190654, 36348757062]

> 40881241801
[10220310451, 139272994276206121600, 22828913614743204775214996005450198400]

クールなソリューションですが、1 000 000のプログラムがより優れたソリューションを見つけるため、限界は少し厳しくなります(私の例を参照)。
ソム

1
@ user2992539私のコードは辞書式に最初のソリューション(250001 <500000)を返します。
ハワード14

7

Mathematica 62

ほとんどの場合、この単純なバニラソリューションは正常に機能します。

f@n_ := FindInstance[4/n == 1/x + 1/y + 1/z && 0 < x < y < z, {x, y, z}, Integers]

例とタイミング(秒)

AbsoluteTiming[f[63]]
AbsoluteTiming[f[123]]
AbsoluteTiming[f[1003]]
AbsoluteTiming[f[3003]]
AbsoluteTiming[f[999999]]
AbsoluteTiming[f[1000000]]

{0.313671、{{x-> 16、y-> 1009、z-> 1017072}}}
{0.213965、{{x-> 31、y-> 3814、z-> 14542782}}}
{0.212016、{{x -> 251、y-> 251754、z-> 63379824762}}}
{0.431834、{{x-> 751、y-> 2255254、z-> 5086168349262}}}
{1.500332、{{x-> 250000、y- > 249999750052、z-> 1201920673328124750000}}}
{1.126821、{{x-> 375000、y-> 1125000、z-> 2250000}}}


しかし、それは完全なソリューションを構成するものではありません。解決できない数値がいくつかあります。例えば、

AbsoluteTiming[f[30037]]
AbsoluteTiming[f[130037]]

{2.066699、FindInstance [4/30037 == 1 / x + 1 / y + 1 / z && 0 <x <y <z、{x、y、z}、整数]}
{1.981802、FindInstance [4/130037 = = 1 / x + 1 / y + 1 / z && 0 <x <y <z、{x、y、z}、整数]}


適切な仕事に最適なツール。+1
ウィリアムバルボサ14

3
@WilliamBarbosa私は主張したいFindInstanceことは、結果を保証することはできませんので、適切なツールではありません...
ハワード

2
@Howard私は実際にはMathematica話していた
ウィリアム・バルボサ

Reduce頑固なケースを解決するようですが、多くの場合時間がかかります。たとえば、n = 10037の82個のソリューションを見つけるには15分です。
DavidC 14

3

C#

Disclamer:これは深刻な答えではありません

これは、1から1 << 30のすべての可能性を強引に操作します。それは巨大で、遅く、正しく動作するかどうかさえわかりませんが、毎回条件をチェックするので、文字通り仕様に従っています。イデオンにはプログラムの5秒の時間制限があり、したがって実行が終了しないため、これをテストしていません。

(誰かが疑問に思っていた場合:これはなんと308バイトの長さです)

static double[]f(double n)
{
    for(double x=1;x<1<<30;x++)
    {
        for(double y=1;y<1<<30;y++)
        {
            for(double z=1;z<1<<30;z++)
            {
                if(4/n==1/x+1/y+1/z)
                    return new[]{x,y,z};
            }
        }
    }
    return null;
}

更新:実際に機能するように修正しました


2
機能しません(ヒント:整数除算)。
ハワード14

丸め誤差のために動作しない可能性があります。
ソムニウム14

@ user2992539それは私の作品、私はそれをテスト5入力として、それが正しい結果(た2, 4, 20
クリストフBöhmwalder

@HackerCowは、大きな整数では機能しない場合があります。
ソムニウム14

1
@HackerCowでは、y = x + 1およびz = y + 1で開始することで確実に時間を節約できます。おそらく同等のチェック4xyz = n(xy + yz + xz)を使用する方が高速になりますが、これはより長い表現であり、丸めの問題もあります。
アルキミスト14

3

Python 2、171バイト

from sympy import*
def f(n):
 for d in xrange(1,n*n):
  for p in divisors(4*d+n*n):
   q=(4*d+n*n)/p;x=(n+p)/4;y=(n+q)/4
   if (n+p)%4+(n+q)%4+n*x*y%d<1:return x,y,n*x*y/d

オンラインでお試しください!

最初の回答は徹底的にテストされるのに十分な速さです。これは、すべての3のための解決策を見つけることができる≤ N ≤約24分で1000000は、合計約1.4ミリ秒毎の平均のために、。

使い方

4 / n = 1 / x + 1 / y + 1 / zz = nxy / dとして書き換えます。ここでd = 4・xy - nx - nyです。次に、4・d + n 2 =(4・xn)・(4・yn)を因数分解できます。これにより、dがあればxyをより高速に検索できます。小さいです。所与のX < Y < Z、我々は、少なくとも証明することができ、D <3・N 2実際には時間の%はるか95より小さいなる傾向にあるが、我々が使用することができ、/ 4(従って外部ループに結合された)Dを = 1、2、または3。最悪の場合はn = 769129で、最小のdは1754です(この場合、約1秒かかります)。


1

Mathematica、99バイト

f[n_]:=(x=1;(w=While)[1>0,y=1;w[y<=x,z=1;w[z<=y,If[4/n==1/x+1/y+1/z,Return@{x,y,z}];++z];++y];++x])

これはかなり単純なブルートフォースであるため、実際にはうまく拡張できません。私は間違いなく百万に達するつもりです(したがって、当面はこれを無効とみなしてください)。n = 1000.5 n = 300秒かかりますが、すでに12秒かかります。


1

ゴルフルア 75

n(ターミナルでの呼び出し後)プロンプトから読み取りますが、基本的にはCalvinのHobbiesソリューションが行うように繰り返します。

n=I.r()z=1@1~@y=1,z-1~@x=1,y-1?4*x*y*z==n*(y*z+x*z+x*y)w(n,x,y,z)~$$$z=z+1$

上記の未使用のLuaバージョンは

n=io.read()
z=1
while 1 do
   for y=1,z-1 do
      for x=1,y-1 do
         if 4*x*y*z==n*(y*z+x*z+x*y) then
            print(n,x,y,z)
            return
         end
      end
   end
   z=z+1
end

例:

n=6     -->     3      4     12
n=12    -->     6     10     15
n=100   -->    60     75    100
n=1600  -->  1176   1200   1225

1

Python、117

n=input();r=range;z=0
while 1:
 z+=1
 for y in r(z):
  for x in r(y):
    if 4*x*y*z==n*(y*z+x*z+x*y):print x,y,z;exit()

例:

16 --> 10 12 15

特別なことは何もありません。


1
一度しか呼び出さないのに、なぜ関数を定義するのですか?
isaacg 14

@isaacgなんとか停止する必要がありますが、exit()代わりに使用すると短縮されます。
カルビンの趣味14

0

C#-134

さて、私は以前ここに答えを投稿しましたが、それはそれほど深刻ではありませんでした。それが起こると、私は非常に退屈することが非常に多いので、少しゴルフをしました。

すべての例が技術的に正しく計算されます(ここでも、2つは5秒の時間制限を強制するため、最後の2つは試していません)が、最初の例では正しい結果が得られます(必ずしも計算した結果ではなく、正しい結果です)。それは不思議な秩序の外に数を出力する(私はなぜ見当もつかない)、それが与えられる10, 5, 2ため5(ウィキペディアによると有効な回答です)。

現時点では134バイトですが、もう少しゴルフをすることができます。

float[]f(float n){float x=1,y,z;for(;x<1<<30;x++)for(y=1;y<x;y++)for(z=1;z<y;z++)if(4/n==1/x+1/y+1/z)return new[]{x,y,z};return null;}

0

Haskell-150文字

main = getLine >>= \n -> (return $ head $ [(x,y,z) | x <- [1..y], y <- [1..z], z <- [1..], (4/n') == (1/x) + (1/y) + (1/z)]) where n' = read n

これは機能するはずですが、まだコンパイルしていません。それはほぼ確実に非常に非常に遅いです。有効な整数の考えられるすべてのトリプレットをチェックし、機能するセットが見つかったら停止する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.