Erdős-Straus 추측을 검증하는 프로그램 작성


15

Erdős-Straus 추측 을 검증하는 프로그램을 작성하십시오 .
프로그램은 입력으로서 하나 개의 정수를 취한다 n( 3 <= n <= 1 000 000) 및 신원을 만족하는 정수 배 출력 4/n = 1/x + 1/y + 1/z, 0 < 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}

여러 해가 있으므로 프로그램에서이 숫자에 대한 다른 결과를 인쇄 할 수 있습니다.


프로그램은 가능한 모든 솔루션 또는 하나만 출력해야합니까? 예를 들어 n = 5에 대해 두 가지 가능성이 있습니다.
izlin

1
하나만으로 충분합니다.
Somnium

2
유일한 테스트 사례가 사양에 따라 올바른 입력이 아니라고 오해의 소지가 있습니다.
피터 테일러

durron597을 추가 한 예를 변경하겠습니다.
Somnium

나는 그 연구가 특히 어려운 일이라고 제안했기 때문에 그 예를 덧붙였다. 가장 어려운 것은 {1, 121, 169, 289, 361, 529}모듈로 840 과 일치하는 소수입니다 .
durron597

답변:


12

루비, 119106

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/4와 유사) y. 마지막 예제조차도 순간적으로 리턴합니다 ( 여기 시도 ).

예 :

> 12
[4, 13, 156]

> 123
[31, 3814, 14542782]

> 1234
[309, 190654, 36348757062]

> 40881241801
[10220310451, 139272994276206121600, 22828913614743204775214996005450198400]

그러나 멋진 솔루션, 그러나 한계는 약간 빡빡합니다. 1000000에 대한 프로그램이 더 큰 솔루션을 찾았 기 때문입니다 (내 예제 ​​참조).
Somnium

1
@ user2992539 내 코드는 사전 식으로 첫 번째 솔루션 (250001 <500000)을 반환합니다.
Howard

7

매스 매 티카 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
William Barbosa

3
@WilliamBarbosa 나는 FindInstance그것이 결과를 보장 할 수 없기 때문에 그것이 올바른 도구가 아니라고 주장 할 것이다 ...
Howard

2
@Howard 내가 실제로 Mathematica에 대해 이야기했습니다
William Barbosa

Reduce완고한 경우를 해결하는 것 같지만 종종 시간이 걸립니다. 예 : 15 분 동안 n = 10037에 대한 82 개의 솔루션을 찾으십시오.
DavidC

3

씨#

Disclamer : 이것은 심각한 답변이 아닙니다

이것은 1에서 1 << 30까지의 모든 가능성을 무차별 적용합니다. 그것은 거대하고, 느리고, 제대로 작동하는지조차 모르겠지만 매번 조건을 확인하기 때문에 문자 그대로 사양을 따릅니다. 그래서 좋습니다. ideone에 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
작동하지 않습니다 (힌트 : 정수 나누기).
Howard

반올림 오류로 인해 작동하지 않을 수 있습니다.
Somnium

@ user2992539 그것은 나를 위해 일하고 5입력으로 테스트 했으며 올바른 결과를 얻었습니다 ( 2, 4, 20)
Christoph Böhmwalder

@HackerCow 큰 정수에서는 작동하지 않을 수 있습니다.
Somnium

1
@HackerCow는 y = x + 1 및 z = y + 1로 시작하여 확실히 시간을 절약 할 수 있습니다. 4xyz = n (xy + yz + xz)에 해당하는 검사를 사용하는 것이 더 빠를 것입니다.하지만 더 긴 표현이며 반올림 문제도 있습니다.
Alchymist

3

파이썬 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

온라인으로 사용해보십시오!

첫 번째 답변은 철저히 테스트 할 수있을 정도로 빠릅니다. 이를 통해 약 24 분 만에 3 ≤ n ≤ 1000000의 솔루션을 각각 약 1.4 밀리 초 동안 찾을 수 있습니다.

작동 원리

4 / n = 1 / x + 1 / y + 1 / zz = n · x · y / d로 다시 씁니다 . 여기서 d = 4 · x · y - n · xn · y 입니다. 그리고 우리가 인수 분해 할 수 4 · D + N 2 = (4 · X - N ) · (4 · Y - N ) 우리에게 훨씬 빠르게 검색하는 방법을 제공, XY를 만큼으로 D작다. 감안 X < Y < Z는 , 우리는 적어도 증명할 수 D <3 · N 2 / 4 (따라서 외부 루프에 결합), 비록 실제로는 대단히 작게 95 시간 %지는 경향이, 우리가 사용할 수있는 (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(터미널에서 호출 후) 프롬프트에서,하지만 기본적으로 반복 할 칼빈의 취미 솔루션을 수행합니다

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$

위의 Ungolfed 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

파이썬, 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

@isaacg 어떻게 든 중지해야하지만 exit()대신 사용 하면 짧아집니다.
Calvin 's Hobbies

0

C #-134

글쎄, 나는 전에 여기에 답변을 게시했지만 실제로 그렇게 심각하지는 않았습니다. 그렇게되면서 나는 종종 매우 지루해서 골프를 조금 했어요.

그것은 모든 예제를 기술적으로 올바르게 계산 합니다 (다시 한번, 5 초의 시간 제한을 적용하기 때문에 마지막 두 가지를 시도하지는 않았지만). 첫 번째는 올바른 결과를 산출합니다 (반드시 계산 한 결과는 아니지만 정확한 결과). 그것은 이상하게 순서가 수를 출력 (I 왜 단서가 없다) 그리고 제공 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

하스켈-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.