골드 바흐의 추측


15

사용자에게 2보다 큰 정수를 요구하는 프로그램을 작성하십시오.

Goldbach는 2보다 큰 모든 정수가 2 개의 소수의 합으로 표현 될 수 있다고 추측하면, 2 개의 소수를 합산하여 요청 된 짝수를 제공합니다. 편집 : 프로그램은 전부가 아닌 소수의 PAIR 만 인쇄하면됩니다. 예를 들면 다음과 같습니다.

4 : 2 + 2

6 : 3 + 3

8 : 3 + 5

10 : 5 + 5 또는 3 + 7


"한 쌍의 소수만 인쇄해야합니다" 더 많은 쌍을 인쇄 할 수 있습니까?
Ayiko

코드 길이가 짧아 지
합리성

답변:


11

APL, 34 또는 44 바이트

첫 번째 버전은 34 개의 기호이며 Dyalog APL에서 여전히 지원되는 것과 같은 원래 단일 바이트 APL 문자 세트의 문자로 제한됩니다.

↑c/⍨n=+/¨c←,∘.,⍨v/⍨~v∊v∘.×v←1↓⍳n←⎕

설명:

                               n←⎕   ⍝ ask for a number, store as n
                          v←1↓⍳n     ⍝ generate all integers from 2 to n
                      v∘.×v          ⍝ compute the product table of any two such integers
                v/⍨~v∊               ⍝ select those that don't appear in the product table 
         c←,∘.,⍨                     ⍝ generate all possible pairs of these primes
    n=+/¨c                           ⍝ check which pairs have a sum equal to n
↑c/⍨                                 ⍝ take the first that does

두 번째 버전은 소수를 확인 하는 기능을 이용하기 때문에 22 기호 길이 π입니다.하지만 유니 코드를 사용하는 NARS2000 에서만 사용할 수 있으므로 UCS-2에서 바이트 수는 44 입니다.

2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1

설명:

                   ⎕    ⍝ ask for a number N
                  ⍳ -1  ⍝ generate all naturals from 1 to N-1
             (⍪,⌽)      ⍝ arrange it into a table of all pairs of naturals with sum N
     {∧/0π⍵}            ⍝ check which pairs are made of all primes
2⍴(⌿⍨       )           ⍝ return the first pair that does

(⎕ : 숫자를 묻는 프롬프트입니다)

      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      4
2 2
      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      6
3 3
      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      8
3 5
      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      124
11 113

겠습니까 ¯2π⍳2πn주요 발전기로 작동?
Oberon

@Oberon π운영자는 정확히 무엇을합니까?
primo

이항 π스위치는 : ¯2πx상기 x 번째 소수를 산출 ¯1πx제 프라임 적은 X가보다 0πx, 시험 소수성에 대한 X 1πx, X보다 제 프라임 큰이며 2πx, 소수의 수 X보다 작은 10πx, X의 약수의 개수 11πx합인 x의 모든 제수 12πx13πxMöbius 및 totient 함수입니다. 마지막으로, 모나드 πx는 x의 소인수 분해를 반환합니다.
Oberon

NARS2000에만 해당되는 @Oberon 아닌가요? 흥미로운 통역 인 것 같습니다. 나는 그것을 시도하고 내 대답을 수정합니다.
Tobia

@Tobia 그것은? 미안하지만. 나는 그것이 어딘가에서 참조되는 것을 보았지만 결코 NARS2000을 언급하지 않았다. 알아 둘만 한.
Oberon

6

파이썬 2, 75 71 바이트

n=input();k=m=1;p={0}
while{n-k,k}-p:m*=k*k;k+=1;p|={m%k*k}
print n-k,k

Ideone에서 테스트하십시오 .

작동 원리

우리는 윌슨 정리의 목록을 사용합니다 .

corollary of Wilson's theorem

항상 변수 mk-1 계승의 제곱과 같습니다 . k 는 값 1 에서 시작 하고 m 은 값 0! ² = 1에서 시작 합니다. 집합 p0 과 현재 소수 k 까지의 모든 소수 로 구성됩니다 .

각 반복에서 먼저 n-kk 가 모두 p 에 속 하는지 확인합니다 . 이는 {nk, k}p 의 설정 차이 가 비어있는 경우에만 해당됩니다 . 그럴 경우 조건이 거짓이며 루프가 계속됩니다.

참고 K> 0 , 및 {- K, K, N}가 어떤 양의 값의 조건을 만족시키는 K - N 소위 (골드 바흐의 추측이 참이라고 가정)을 0 에서 P는 위양성 이어질 않는다.

루프에서 km 을 업데이트 합니다. 의 새로운 값 m은 이다 ² ² × k² = K! - m × k² = (1 K) 과의 새로운 값 K는K + 1 그래서, m = (K - 1)! ² 정지 전후 보유 업데이트.

그런 다음, set union을 수행하여 m % k × k 값p에 더 합니다. Wilson의 정리에 따르면 k 가 소수 이면 1 × k = k 가되고 그렇지 않으면 0 × k = 0이 됩니다.

루프가 끝나면 n-kk 의 마지막 값을 인쇄합니다.이 값은 sum n 으로 소수입니다 .


이 주요 생성 알고리즘은 어떻게 작동합니까?
Leaky Nun

@LeakyNun 설명을 추가했습니다.
Dennis

아 .. 천재 야
Leaky Nun

5

루비 2.0 (65)

require'prime'
n=gets.to_i
Prime.find{|i|p [i,n-i]if(n-i).prime?}

4

PHP-73 바이트

<?for(;@($n%--$$n?:$o=&$argv[1]>$$n=++$n)||${++$b}^${--$o};);echo"$b+$o";

입력은 명령 행 인수로 사용됩니다.

샘플 사용법 :

$ php goldbach.php 7098
19+7079

4

GolfScript 41 33 32

~(,2>.-1%]zip{{.,2>\{\%!}+,},!}?

명령 줄 인수를 받아들입니다. 예 :

echo "14" | ruby golfscript.rb goldbach.gs
-> [2 12]

다음을 사용하여 입력 번호의 모든 관련 파티션을 찾습니다.

(,2>.-1%]zip  #If only zip were a one-character command!  It is so often useful.

그런 다음 숫자가 소수가 아닌 첫 번째 파티션을 찾습니다.

{np,!}? #For each partition, filter down to elements that are not prime, and only accept if there are no such results (since [] is falsey).

복합 검사 블록 np은 다음과 같습니다.

{.,2>\{\%!}+,}

이 블록은 주어진 숫자를 균등하게 나누는 모든 숫자로 필터링합니다. 이러한 숫자가 없으면 (숫자가 소수) 결과 []는 GolfScript에서 거짓입니다.


3

펄 6:69

$/=get;for grep &is-prime,^$/ {exit say $_,$_-$/ if ($/-$_).is-prime}

3

170 화 (112) 83 개 문자

a=scan();b=2:a;p=b[rowSums(!outer(b,b,`%%`))<2];q=p[(a-p)%in%p][1];cat(a,":",q,a-q)

들여 쓰기 :

a=scan() #Take user input as a numeric
b=2:a
p=b[rowSums(!outer(b,b,`%%`))<2] #Find all primes from 2 to user input
q=p[(a-p)%in%p][1] #Check which a-p also belong to p and takes the first one
cat(a,":",q,a-q)

용법:

> a=scan();b=2:a;p=b[rowSums(!outer(b,b,`%%`))<2];q=p[(a-p)%in%p][1];cat(a,":",q,a-q)
1: 72
2: 
Read 1 item
72 : 5 67 

후손을위한 112 자로 된 오래된 솔루션

a=scan();b=2:a;p=b[rowSums(!outer(b,b,`%%`))<2];w=which(outer(p,p,`+`)==a,T);cat(a,":",p[w[1,1]],p[w[1,2]])

들여 쓰기 :

a=scan()
b=2:a
p=b[rowSums(!outer(b,b,`%%`))<2]
w=which(outer(p,p,`+`)==a,T) #Find the index of valid combinations
cat(a,":",p[w[1,1]],p[w[1,2]]) #Prints the first valid combination

이것은 미쳤고 온화합니다!
Tomas

3

파이썬-107

기본적으로 nutria의 답변의 두 번째 부분에서 개선되었습니다 (2.7에서 실행했지만 3.x에서도 작동해야한다고 생각합니다)

p=lambda x:all(x%i!=0 for i in range(2,x))
n=input()
for i in range(2,n-1):
    if p(i)&p(n-i): print i,n-i

줄 바꿈과 공백은 :필수입니까?
nini

탭을 공백으로 줄일 수 있고 인쇄 전의 공백을 제거 할 수 있습니다 (4 바이트 제거).
clismique

3

자바 스크립트 (ES6) (정규표), 105

a=/^(xx+?)(?!(xx+)\2+$)x*(?=\1$)(?!(xx+)\3+$)/.exec("x".repeat(prompt()));alert(a[1].length+"+"+a[0].length)

이제 특수 기능 (기본 역 참조 지원, 긍정적 및 부정적 예측)에 대한 요구 사항이 적은 Goldbach 추측을 테스트하는 정규식이 있습니다.

이것은 String.prototype.repeat()EcmaScript 6th edition 제안의 일부인을 사용합니다 . 현재이 코드는 Firefox에서만 작동합니다.

정규식으로 작업 할 때 간결한 명령이있는 더 나은 언어가 정말로 필요합니다 ...


2

스칼라 286 192 172 148 문자

가장 빠르지는 않지만 작동합니다. g (10)을 호출하여 10의 goldbach 쌍 목록을 얻습니다.

def g(n:Int)={def p(n:Int,f:Int=2):Boolean=f>n/2||n%f!=0&&p(n,f+1)
s"$n : "+(for(i<-2 to n/2;j=n-i if p(i)&&p(j))yield s"$i + $j").mkString(" or ")}

C ++ 로의 변환은 간단합니다.


2

C- 139129

a,b;i(x,y){return x>y?x%y?i(x,y+1):0:x>1;}main(){scanf("%i",&a);for(b=a/2;b-->1;)i(b,2)&&i(a-
b,2)&&printf("%i:%i+%i\n",a,b,a-b);}

int함수 에서 선언 을 제거하여 8자를 면도 할 수 있습니다 i. 를 제거하고 if다른 이중 앰퍼샌드를 추가하여 다른 2자를 저장할 수 있습니다 .i(b,2)&&i(a-b,2)&&printf(...)
Josh

감사! 생각하지 않았다 &&. (나는 인수 유형 침묵에 익숙해지지 않을 것입니다 ...)
Oberon

중첩 된 삼항을 사용하는 것이 좋습니다.
Josh

2

newLISP - 169 개 148 문자

(define(p n)(=(length(factor n))1))
(define(g n)(when(even? n)(for(i 3 n 2)
(and(p i)(p(- n i))(println n {: } i { }(- n i))))))
(g(int(read-line)))

그것을 실행하는 코드를 포함합니다. 결과는 너무 관대합니다 ...

72: 5 67
72: 11 61
72: 13 59
72: 19 53
72: 29 43
72: 31 41
72: 41 31
72: 43 29
72: 53 19
72: 59 13
72: 61 11
72: 67 5

2

세이지, 60

점수가 비슷하고 해상도를 결정하는 느낌이 들지만 게시하기에는 다른 것으로 생각합니다.

i=n=input()
while not{i,n-i}<set(primes(n)):i-=1
print i,n-i

2

세이지 , 65 62

n=input()
i=0
p=is_prime
while p(i)*p(n-i)==0:i+=1
print i,n-i

위의 file goldbach.sage에서 터미널에서 Sage를 실행하여 실행하십시오.

sage: %runfile goldbach.sage 

p=is_prime아이디어에 대한 @boothby에게 감사합니다 .


을 설정하여이 값을 62로 낮출 수 있습니다 p=is_prime.
boothby

2

하스켈, 97C

g n=head[(a,b)|let q=p n,a<-q,b<-q,a+b==n]
p n=filter c[2..n]
c p=null[x|x<-[2..p-1],p`mod`x==0]

설명:

  • g"goldbach"기능입니다. 호출 g n하면에 추가되는 소수 쌍이 제공됩니다 n.
  • p 보다 적은 소수 목록을 생성하는 함수입니다. n .
  • c 정의하는 데 사용되는 주요 체커 함수입니다. p 입니다.

예제 실행 :

*Main> g 4
(2,2)
*Main> g 6
(3,3)
*Main> g 8
(3,5)
*Main> g 10
(3,7)
*Main> g 12
(5,7)
*Main> map g [4,6..100]
[(2,2),(3,3),(3,5),(3,7),(5,7),(3,11),(3,13),(5,13),(3,17),(3,19),(5,19),(3,23),(5,23),(7,23),(3,29),(3,31),(5,31),(7,31),(3,37),(5,37),(3,41),(3,43),(5,43),(3,47),(5,47),(7,47),(3,53),(5,53),(7,53),(3,59),(3,61),(5,61),(7,61),(3,67),(5,67),(3,71),(3,73),(5,73),(7,73),(3,79),(5,79),(3,83),(5,83),(7,83),(3,89),(5,89),(7,89),(19,79),(3,97)]

2

매스 매 티카 56

입력 정수에 대한 모든 솔루션을 반환합니다.

Select[Tuples[Prime@Range@PrimePi[n = Input[]], 2], Tr@# == n &]

예를 들어, 1298이 입력되면 ...

{{7, 1291}, {19, 1279}, {61, 1237}, {67, 1231}, {97, 1201}, {127, 1171}, {181, 1117}, {211, 1087}, { 229, 1069}, {277, 1021}, {307, 991}, {331, 967}, {379, 919}, {421, 877}, {439, 859}, {487, 811}, {541, 757}, {547, 751}, {571, 727}, {607, 691}, {691, 607}, {727, 571}, {751, 547}, {757, 541}, {811, 487} , {859, 439}, {877, 421}, {919, 379}, {967, 331}, {991, 307}, {1021, 277}, {1069, 229}, {1087, 211}, { 1117, 181}, {1171, 127}, {1201, 97}, {1231, 67}, {1237, 61}, {1279, 19}, {1291, 7}}

작성된대로 각 솔루션을 두 번 반환합니다.

Union[Sort/@ %]

{{7, 1291}, {19, 1279}, {61, 1237}, {67, 1231}, {97, 1201}, {127, 1171}, {181, 1117}, {211, 1087}, { 229, 1069}, {277, 1021}, {307, 991}, {331, 967}, {379, 919}, {421, 877}, {439, 859}, {487, 811}, {541, 757}, {547, 751}, {571, 727}, {607, 691}}


입력 2, oracle에게 중단 여부, 트윈 프라임 추측 추측 / 증거 입증, 승리
Filipq

1

줄리아, 62 문자 (85 프롬프트)

julia> g(n)=collect(filter((x)->sum(x)==n,combinations(primes(n),2)))
g (generic function with 1 method)

julia> g(88)
4-element Array{Array{Int64,1},1}:
 [5,83] 
 [17,71]
 [29,59]
 [41,47]

이것은 (필요한 경우) 사용자에게 프롬프트하지 않습니까?
입술

아뇨. 줄리아는 지금 많은 캐릭터를 추가 할 것입니다. g(int(readline(STDIN)))
gggg

1

GTB , 31

TI-84 계산기 용

`A:.5A→B@%;A,4)4$~B+1,B-1#~B,B&

주요 내장 기능이 없습니다.

예제 실행

?4
               2
               2
?6
               3
               3
?8
               3
               5
?10
               5
               5

1

자바 스크립트, 139 137 136

a=prompt();function b(n){for(i=2;i<n;i++)if(n%i<1)return;return 1}for(c=2,r=1;c<a&&r;c++)if(b(c)&&b(a-c))alert(a+": "+c+" + "+(a-c)),r=0

return;return 0;

1

파이썬 3- 150 143 자

이전 버전 (150 자) :

p=lambda n:0 in[n % i for i in range(2,n)]
n=int(input())
[print('%d+%d'%(a, b))for b in range(2,n)for a in range(2,n)if not(a+b!=n or p(a) or p(b))]

새 버전 (ProgramFOX 덕분에) :

p=lambda n:0 in[n%i for i in range(2,n)]
n=int(input())
[print('%d+%d'%(a,b))for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))]

모든 조합을 인쇄합니다 (예 :
4 2 + 2
10 7 + 3 5 + 5 3 + 7).


|부울 형식과 함께 안전하게 사용할 수 있으므로(a+b!=n)|p(a)|p(b)
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

를 사용하면 더 짧아집니다 print([(a,b)for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))])(합이 n 인 튜플 목록을 인쇄 함). 8 바이트를 저장합니다.
agtoever

또한 사용 r=range(2,n)하고 참조 r하면 더 많은 비용을 절약 할 수 있습니다.
agtoever

1

q [116 자]

y where all each{{2=count where 0=(x mod)each til x+1}each x}each y:{a where x=sum each a:a cross a:til x}"I"$read0 0

소수를 찾는 내장 함수가 없습니다.

입력

72

산출

5  67
11 61
13 59
19 53
29 43
31 41
41 31
43 29
53 19
59 13
61 11
67 5

1

파이썬-206

파티에 조금 늦었지만 골프 기술을 연습하고 있습니다.

이 질문을 찾기 전에 실제로 이것을 코딩했습니다! 그래서 내 파이썬에는 다른 파이썬 솔루션이 사용하는 아름다운 람다가 포함되어 있지 않습니다.

import math
def p(n):
    if n%2==0&n>2:return False
    for i in range(3,n):
        if n%i==0:return False
    return True 
X=int(input())
for i in range(2,X):
    if p(i)&p(X-i):print i,X-i;break

1

J- 35 32 자

"사용자 프롬프트"는 모든 J 골퍼의 골칫거리입니다. 힘들게 얻은 모든 캐릭터가 있습니다!

p:(n,n)#:i.&n,+/~p:i.n=:".1!:1]1

설명 :

  • ".1!:1]1- 1!:1입력 (파일 핸들 1) 에서 문자열 ( )을 읽고 숫자 ( ".) 로 변환하십시오 .
  • p:i.n=:-이 숫자를 변수에 할당 n한 다음 첫 번째 n소수 를 가져옵니다 .
  • +/~- n넓고 n높은 추가 테이블을 만듭니다 .
  • i.&n,-표를 단일 목록으로 바꾸고 nGoldbach의 추측이 참인 경우 의 첫 번째 색인을 찾습니다 .
  • p:(n,n)#: -인덱스에서 행과 열을 검색하고 해당 소수를 가져옵니다.

용법:

   p:(n,n)#:i.&n,+/~p:i.n=:".1!:1]1
666
5 661
   p:(n,n)#:i.&n,+/~p:i.n=:".1!:1]1
1024
3 1021

프롬프트가 요구 사항이 아닌 경우 25 자 동사는 다음과 같습니다.

(,~p:@#:]i.~&,+/~@:p:@i.)


1

줄리아, 50 49 바이트

~=primes;n=ARGS[]|>int
(n-~n)∩~n|>extrema|>show

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

함수가 허용 가능한 경우 코드가 32 바이트 로 단축 될 수 있습니다 .

~=primes
!n=(n-~n)∩~n|>extrema

작동 원리

~=primes내장 소수 함수 에 대한 별명을 작성하여 인수까지 모든 소수 목록을 리턴합니다. n=ARGS[]|>int첫 번째 명령 줄 인수를 구문 분석하여 저장합니다. N .

적합한 소수 쌍을 찾으려면 먼저 위에서 언급 한 소수 범위를로 계산합니다 ~n. 그런 다음 n-~n이러한 소수의 모든 차이점을 산출합니다. n .

결과를 소수 범위와 교차 ( ) 함으로써 나머지 소수 pn-p 도 소수가되도록합니다.

마지막으로 extrema교차점에서 가장 낮고 가장 높은 소수를 취하므로 합은 n 이어야합니다 .


0

SQL, 295 284

postgresql에서 :

create function c(c int) returns table (n int, m int) as $$ 
with recursive i(n) as
(select 2 union all select n+1 from i where n<c), 
p as (select * from i a where not exists 
(select * from i b where a.n!=b.n and mod(a.n,b.n)=0))
select * from p a, p b where a.n+b.n=c 
$$ language sql;

"재귀에 왼쪽 외부 조인 없음", "재귀에 하위 쿼리 없음"과 같은 것이 아니라면 절반의 공간에서 할 수 있어야합니다 ...

출력은 다음과 같습니다.

postgres=# select c(10);
   c   
-------
 (3,7)
 (5,5)
 (7,3)
(3 rows)

postgres=# select c(88);
   c    
---------
 (5,83)
 (17,71)
 (29,59)
 (41,47)
 (47,41)
 (59,29)
 (71,17)
 (83,5)
(8 rows)

0

배치-266

@echo off&setLocal enableDelayedExpansion&for /L %%a in (2,1,%1)do (set/aa=%%a-1&set c=&for /L %%b in (2,1,!a!)do set/ab=%%a%%%%b&if !b!==0 set c=1
if !c! NEQ 1 set l=!l!%%a,)&for %%c in (!l!)do for %%d in (!l!)do set/ad=%%c+%%d&if !d!==%1 set o=%%c + %%d
echo !o!

깔끔하게 설정-

@echo off
setLocal enableDelayedExpansion
for /L %%a in (2,1,%1) do (
    set /a a=%%a-1
    set c=
    for /L %%b in (2,1,!a!) do (
        set /a b=%%a%%%%b
        if !b!==0 set c=1
    )
    if !c! NEQ 1 set l=!l!%%a,
)
for %%c in (!l!) do for %%d in (!l!) do (
    set /a d=%%c+%%d
    if !d!==%1 set o=%%c + %%d
)
echo !o!

0

펄 5, 58 바이트

57, 플러스 1 -nE

/^(11+?)(?!(11+)\2+$)1*(?=\1$)(?!(11+)\3+$)/;say for$1,$&

입력과 출력은 단항입니다. 예:

$ perl -nE'/^(11+?)(?!(11+)\2+$)1*(?=\1$)(?!(11+)\3+$)/;say for$1,$&'
1111111111
111
1111111

모자 끝.


0

Oracle SQL 11.2, 202 바이트

WITH v(x,y,s)AS(SELECT LEVEL,LEVEL,0 FROM DUAL CONNECT BY LEVEL<=:1 UNION ALL SELECT x,y-1,s+SIGN(MOD(x,y))FROM v WHERE y>1),p AS(SELECT x FROM v WHERE x-s=2)SELECT a.x,b.x FROM p a,p b WHERE:1=a.x+b.x;   

언 골프

WITH v(x,y,s) AS
(
  SELECT LEVEL,LEVEL,0 FROM DUAL CONNECT BY LEVEL<=:1 
  UNION ALL 
  SELECT x,y-1,s+SIGN(MOD(x,y))FROM v WHERE y>1
)
,p AS (SELECT x FROM v WHERE x-s=2)
SELECT a.x,b.x 
FROM p a,p b 
WHERE :1=a.x+b.x;   

0

파이썬 3, 107 바이트

b=lambda x:all(x%y for y in range(2,x))
g=lambda x,i=2:((i,x-i)if b(i)&b(x-i)else g(x,i+1))if(i<x)else 0

b (x)는 x에 대한 원시성 테스트이며 g (x)는 숫자를 통해 되풀이하여 적합한 두 소수를 찾습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.