주요 격차 찾기


27

주요 차이는 두 개의 연속 소수의 차이입니다. 보다 구체적으로, pqp < q 이고 p +1, p +2, ..., q -1이 소수 인 경우, 소수 pqn = q - p 의 간격을 정의합니다 . 간격은 p 에 의해 시작 되고 길이 n이라고 합니다.

임의로 큰 격차가 존재하는 것으로 알려져 있습니다. 즉, n 이 주어지면 길이 n 이상의 소수 간격이 존재한다 . 그러나 길이가 정확히 n 인 소수 는 존재하지 않을 수 있습니다 (그러나 더 큰 것).

도전

양의 정수가 주어지면 n길이 n이상의 간격을 시작하는 첫 번째 소수를 출력하십시오 .

예를 들어, 입력의 4경우 출력은이어야합니다 7. 7과 11은 최소 4만큼 차이가 나는 첫 번째 연속 소수이므로 (이전 간격은 1, 2에서 3, 2에서 3에서 5, 2에서 5에서) 7). 입력의 3경우 답변도 있어야합니다 7(길이 3의 간격이 없음).

중재 규칙

테스트 사례

Input -> Output

1        2
2        3
3        7
4        7
6        23
10       113
16       523
17       523
18       523
30       1327
50       19609
100      370261
200      20831323


pq는 qp를 의미합니까?
아웃 골퍼 에릭 18

@EriktheOutgolfer 예; 고마워요!
Luis Mendo


답변:


3

가이아 , 6 바이트

zṅọ⊃∆ṇ

이것은 매우 비효율적입니다 ( 16테스트 케이스는 컴퓨터에서 계산하는 데 1 시간 이상 걸렸습니다).

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

설명

시퀀스에는 a (n) <= 2 ^ n 속성이 있는 것 같습니다 .

z       Push 2^input.
 ṅ      Get the first 2^input prime numbers.
  ọ     Get the deltas of the list.
   ⊃∆   Find the index of the first that is greater than or equal to the input.
     ṇ  Push the index-th prime number.

9

젤리 , 10, 9, 8 10 바이트

Æn_$:ð1#»2

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

@Dennis 덕분에 2 바이트가 절약되었습니다! (가장자리로 인해 다시 추가됨)

설명:

Æn          #   The next prime after 'P'
  _$        #   Minus 'P'
    :       #   Divided by 'N'
            #
            # This will give a falsy value unless the distance to the next prime is >= N
            #
     ð      # Treat all of that as a single dyad (fucntion with two arguments). 
            # We'll call it D(P, N)
            #
      1#    # Find the first 'P' where D(P, input()) is truthy
        »2  # Return the maximum of that result and 2

결과가 항상 입력보다 크거나 같다는 것을 알고 있습니까? (유효한# 가정의 경우 하나가 아무 생각이하지만 난을 가정하는 것이 합리적 보인다 여기에 입력로부터 계산됩니다). 편집 : 참고로 수정 (필요한 경우)
Jonathan Allan

5
@JonathanAllan Bertrand의 가정 은 소수의 격차가 소수 자체보다 엄격하다는 것을 암시합니다.
Dennis

@Dennis 화려한 감사합니다! TMYK ...
Jonathan Allan

4

Mathematica, 30 바이트

2//.x_ /;NextPrime@x-x<#:>x+1&

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

Mathematica, 35 바이트

(t=2;While[NextPrime@t-t<#,t++];t)&

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

Mathematica, 77 바이트

Prime@Min@Position[s=Differences@Prime@Range[(r=#)^3+1],#&@@Select[s,#>=r&]]&

영리한 영리은 ... 당신도 확인해야 모두가 없습니다 pq주요 있습니다 ... 당신이 명시 적으로 인수를 공급하지 않는 한 그것은 단지 65535 상승하기 때문에 첫 번째 코드는하지만, 유효하지 않은 것 같다 MaxIterations.
JungHwan Min

또한 35 바이트 버전의 경우 -2 바이트 :(For[t=2,NextPrime@t-t<#,t++];t)&
JungHwan Min

4

하스켈 , 106102 93 77 73 72 바이트

이를 통해 무한의 소수 목록을 먼저 생성 한 다음 소수 간격을 찾습니다. 주요 목록은 여기 에서 가져 왔습니다 . 아마 단축 될 수는 있지만 아직 방법을 찾지 못했습니다.)

-4 바이트의 경우 @BruceForte와 -1 바이트의 경우 @Zgrab 덕분입니다!

f n=[x|(y,x)<-zip=<<tail$[n|n<-[2..],all((>0).rem n)[2..n-1]],y-x>=n]!!0

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


물론 몇 가지 모나드 마술이 있습니다. :)
flawr

zip=<<tail$[...]바이트를 저장합니다.
Zgarb

"이것은 무한한 프라임 목록을 먼저 생성 한 다음에 ..." (즉, 그것은 무한히 오랜 시간이 지난 후에야, 절차 상 무한의 프라임 목록을 "처음으로 생성하는"시간)
Olivier Dulac

1
Haskell은 지연 평가를 사용하므로 실제로 사용되는 목록의 항목 수만큼만 생성됩니다. 그래서 그 소수는 우리가 실제로 점을 찾는 지점까지 생성됩니다. 당신이 그것을 시도하면 당신은 n유한 시간 후에 중단됩니다 것을 볼 수 있습니다 :) (Haskell은 절차 적이 지 않지만 평가가 느린 기능적 언어입니다.)
flawr

1
글쎄요, 그것은 무한한 목록입니다. 정의상 그것은 끝이 없습니다. 내가 설명 한 것은 일반적인 통역사의 후드에서 일어나는 일이지만 언어의 일부로 지정되지 않았으므로 말할 수 없습니다!
flawr

3

Pyth-14 바이트

[1, inf)에서 필터링하고 primality ( P_)로 필터링하고 (n, inf)에서 필터링 된 다음 소수는 입력과 다른> =를 갖습니다.

f&P_T<tQ-fP_Yh

테스트 스위트 .


3

PowerShell , 97 96 91 바이트

param($n)for($a=$b=2){for(;'1'*++$b-match'^(?!(..+)\1+$)..'){if($b-$a-ge$n){$a;exit}$a=$b}}

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

입력 취하고 $n, 세트 $a$b동일한 2다음 무한대 들어간다 for루프. 내부 에서 다음 프라임에 도달 할$b 때까지 계속 반복합니다 . 그런 다음 (즉, 간격)이 reaterthanor qual인지 확인합니다 . 이 경우, 우리는 출력 과 . 그렇지 않으면 우리는 설정 으로 하고 증가 하고 우리의 다음 검색을 시작합니다.$b-$a-ge$n$aexit$a$b$b

경고 : 큰 입력 에서는 느립니다 . 실제로 50TIO에서 60 초 시간 초과 이내에 테스트를 완료 할 수 없습니다 . 오 잘



3

Mathematica, 39 바이트

(For[i=2;p=NextPrime,i+#>p@i,i=p@i];i)&
(* or *)
(For[i=1;p=Prime,p@i+++#>p@i,];p[i-1])&

33 바이트 버전 (65535 번째 소수까지만 유효하므로 유효하지 않음)

p=NextPrime;2//.i_/;p@i-i<#:>p@i&



2

수학, 37 바이트

gNestWhile[p=NextPrime,2,p@#-#<g&]

Function첫 번째 인수로 g. 로 시작하여 주어진만큼만 2기능을 p=NextPrime반복적으로 적용 p@#-#<g&합니다 True(현재 소수와 다음 소수 사이의 간격이보다 작음 g).


2

R + gmp, 55 바이트

gmp 라이브러리에서 nextprime 함수를 사용합니다

s=2;n=scan();while((x=gmp::nextprime(s))-s<n)s=x;cat(s)

cat(s)끝에 추가해야합니다 . 암시 적 인쇄는 전체 프로그램에서 작동하지 않습니다.
JAD


2

C = 141109 바이트; C ++, D = 141 바이트; C #, Java = 143 바이트

경고 : 낮은 성능 알고리즘

이 코드는 g(200)10 분 이내에 소수 간격을 계산할 수 없습니다 . 의 경우 g(100)10 초가 필요했습니다 (C ++ 버전)

C ++ 및 D 버전 :

int p(int d){for(int i=2;i<=d/2;++i){if(!(d%i))return 0;}return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do{++n;}while(!p(n));}return f;}

C # 및 Java 버전 :

int p(int d){for(int i=2;i<=d/2;++i){if(d%i==0)return 0;}return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do{++n;}while(p(n)==0);}return f;}

C 버전, ceilingcat 덕분에 -32 바이트 :

i;p(d){for(i=2;d/2/i;)if(!(d%i++))return 0;return 1;}f;n;g(d){for(f=2,n=3;n-f<d;)for(f=n;!p(++n););return f;}

C # / Java와 C / C ++ / D 버전의 차이점 : !p(n)<==>p(n)==0


return 0; return 1!p(++n)
천장 고양이를 뒤집고

d%i==0그리고 !(d%i)될 수 있습니다 d%i<0. 또한 D의 템플릿 시스템을 사용하면 D의 솔루션은 다음과 같습니다 T p(T)(T d){for(T i=2;i<=d/2;++i)if(d%i<1)return 0;return 1;}T g(T)(T d){T f=2,n=3;while(n-f<d){f=n;do++n;while(!p(n));}return f;. ( for과 뒤에 중괄호를 제거 do하면 C ++에도 적용됩니다)
Zacharý

C / C ++ / C # / Java에서 찾을 수없는 D 특정 트릭을 사용하는 별도의 D 버전을 게시했습니다.
Zacharý

int p(int d){for(int i=2;i<=d/2;++i)if(!(d%i))return 0;return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do++n;while(!p(n));}return f;}<-C ++ 버전에서 작동해야합니다
Zacharý

2

D, 127 , 125 122 바이트

경고 : 낮은 성능 알고리즘 !!

T p(T)(T d){T r;for(T i=2;i<=d/2;)r=d%i++<1||r;return r;}T g(T)(T d){T f=2,n=3;while(n-f<d){f=n;while(p(++n)){}}return f;}

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

방법?

다시 HatsuPointerKun하지만 D 특정 마법을 할 것입니다.

  • 템플릿 시스템은 유형을 유추 할 수 있으며 T p(T)(T d)C ++보다 짧습니다.
  • r=d%i++<1||rD 특정 shenanigans는 C / C ++에서 작동 할 수 있지만 잘 모르겠습니다.
  • p(++n)위와 동일하지만 C / C ++에서 작동하는지 확실하지 않습니다.
  • while(p(++n)){}, 여기 D는 왜 골프에 나쁜지 ;, 빈 문장으로 사용할 수없는 이유를 알 수 있습니다 .

2

펄 6 , 41 37 바이트

{+(1...(^$_+*)>>.is-prime eqv!<<^$_)}

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

설명

{                                   }  # Block taking n as $_
   1...   # Sequence 1,2,... until
       (^$_+*)  # Range [i,i+n)
              >>.is-prime  # is-prime for each
                          eqv!<<^$_  # Equals (True,False,False,False,...)?
 +(                                )  # Length of sequence

1

QBIC , 28 바이트

{~µs||~s-r>=:|_Xr\r=s]]s=s+1

설명

{         DO
~µs||     IF s is prime THEN (note, s starts as 3)
~s-r>=:   IF the gap between s (current prime) and r (prev prime) is big enough
|_Xr      THEN QUIT, printing prev prime r
\r=s      ELSE (gap too small, but s is prime), set r to prime s
]]        END IF x2, leaving us in the WHILE
s=s+1     increment s, retest for primality ...

1

05AB1E , 9 바이트

∞<ØD¥I@Ïн

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 . TIO가 시간 초과되기 때문에 Test Suite에는 마지막 두 테스트 사례가 포함되어 있지 않습니다.

이후 다른 질문이 하나의 잘 속는 사람으로 닫혀 , 나는 게시하도록하겠습니다 내 대답을 뿐만 아니라 여기에.

설명:

           # Get an infinite list in the range [1, ...]
 <          # Decrease it by one to make it in the range [0, ...]
  Ø         # Get for each the (0-indexed) n'th prime: [2,3,5,7,11,...]
   D        # Duplicate this list of primes
    ¥       # Get all deltas (difference between each pair): [1,2,2,4,2,...]
     I@     # Check for each if they are larger than or equal to the input
            #  i.e. 4 → [0,0,0,1,0,1,0,1,1,0,...]
       Ï    # Only keep the truthy values of the prime-list
            #  → [23,31,47,53,61,...]
        н   # And keep only the first item (which is output implicitly)
            #  → 23

1

자바 8, 99 92 바이트

n->{int a=2,b=3,f,k;for(;b-a<n;)for(f=0,a=b;f<2;)for(f=++b,k=2;k<f;)f=f%k++<1?0:f;return a;}

온라인으로 사용해보십시오. (가장 큰 테스트 사례는 TIO에서 시간 초과되므로 제외됩니다.)

설명:

n->{               // Method with integer as both parameter and return-type
  int a=2,b=3,     //  Prime-pair `a,b`, starting at 2,3
      f,           //  Prime-checker flag `f`, starting uninitialized
      k;           //  Temp integer, starting uninitialized
  for(;b-a         //  Loop as long as the difference between the current pair of primes
          <n;)     //  is smaller than the input
    for(f=0,       //   (Re)set the prime-checker flag to 0
        a=b;       //   Replace `a` with `b`, since we're about to search for the next prime-pair
        f<2;)      //   Inner loop as long as the prime-checker flag is still 0 (or 1)
                   //   (which means the new `b` is not a prime)
      for(f=++b,   //    Increase `b` by 1 first, and set this value to the prime-checker flag
          k=2;     //    Set `k` to 2
          k<f;)    //    Inner loop as long as `k` is still smaller than the prime-checker flag
        f=         //     Change the prime-checker flag to:
          f%k++<1? //      If the prime-checker flag is divisible by `k`
           0       //       Set the prime-checker flag to 0
          :        //      Else:
           f;      //       Leave it unchanged
                   //    (If any integer `k` in the range [2, `b`) can evenly divide `b`,
                   //     the prime-checker flag becomes 0 and the loop stops)
  return a;}       //  And finally after all the nested loops, return `a` as result

1

깔끔한 33 바이트

{x:({v:⊟v<=-x}↦primes+2)@0@0}

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

또는 28 자 / 34 바이트 : {x:({v:⊟v≤-x}↦primes+2)@0@0}

이에 해당하는 ASCII 동등 항목을 사용하여이를 설명하겠습니다.

{x:({v:(-)over v<=-x}from primes+2)@0@0}
{x:                                    }    lambda w/ parameter `x`
                          primes+2          overlapping pairs of primes
                                            [[2, 3], [3, 5], [5, 7], ...]
    {v:             }from                   select prime pairs `v = [a, b]`...
       (-)over v                            ...where `a` - `b`...
                <=-x                        is <= `x`
   (                              )@0@0     select the first element of the first pair

1

APL (NARS), 36 자, 72 바이트

∇r←h w;k
r←2
→0×⍳w≤r-⍨k←1πr⋄r←k⋄→2
∇

1π는 "다음 프라임"기능입니다. 테스트:

  h¨1 2 3 4 6 10 16 17 18 30 50 100 200
2 3 7 7 23 113 523 523 523 1327 19609 370261 20831323  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.