베르트랑의 프라임


24

Bertrand의 Postulate에 따르면 모든 정수 n ≥ 1에 대해 n <p ≤ 2n 과 같이 적어도 하나의 소수 p가 있습니다. n <4000에 대해이 정리를 검증하기 위해 우리는 4000 건을 확인할 필요가 없습니다. Landau 트릭 은이를 확인하기에 충분하다고 말합니다.

2, 3, 5, 7, 13, 23, 43, 83, 163, 317, 631, 1259, 2503, 5003

모두 프라임입니다. 이들 각각의 숫자는 이전의 두 배보다 작기 때문에 각 간격 {y : n <y ≤ 2n} 은 그 소수 중 적어도 하나를 포함합니다.

이 일련의 숫자는 Bertrand Primes (OEIS A006992) 이며 다음과 같이 정의됩니다.

a(1) = 2
a(n) = largest prime below 2a(n-1)

도전

이 순서를 구현하십시오. 당신은 쓸 수 있습니다

  • 일부 n 을 부여한 함수 또는 프로그램 은 a (n) (0 또는 1 색인)을 리턴 합니다 .
  • 일부 n 을 부여한 함수 또는 프로그램 은이 시퀀스 의 첫 번째 n (또는 n-1 또는 n + 1 ) 항목을 반환합니다 .
  • 언어 목록에서 무한 목록 또는 스트림 또는 생성기 또는 이와 동등한 항목.

답변:


8

옥타브 , 32 바이트

k=2
do k=primes(k+k)(end)until 0

값을 무기한으로 인쇄합니다 (각 값 앞에 k =).

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


옥타브 , 42 바이트

k=2
for i=2:input('')k=primes(k+k)(end)end

n 을 입력으로 취하고 n 개의 첫 번째 값을 출력 합니다 (각 값 앞에 k =).

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


옥타브 , 51 바이트

k=2;for i=2:input('')k=primes(k+k)(end);end
disp(k)

Luis Mendo의 MATL answer 와 유사합니다 . n 을 입력으로 취하고 a (n) (1 색인)을 출력 합니다 .

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


옥타브 , 60 바이트

k=2;for i=2:input('')k*=2;while~isprime(--k)
end
end
disp(k)

n 을 입력으로 취하고 a (n) (1 색인)을 출력 합니다 .

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




6

05AB1E , 14 7 6 바이트

$F·.ØØ

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


1 인덱스 답변 (0이 1을 출력하지 않는 한), 설명 :

$       # Push 1 and input (n)...
 F      # n-times do... 
  ·     # Double the current prime (first iteration is 1*2=2).
   .ØØ  # Find prime slightly less than double the current prime.

모든 반복에는와 함께 '더미'반복이 있기 때문에 1 인덱싱됩니다 n=1.


Fx.ØØ너무 가깝습니다 ... 위의 모든 항목에 적용 n > 2됩니다.
Magic Octopus Urn

1
나는 $F·ÅPθ같은 바이트 수를 가지고있었습니다 .
Emigna

@Emigna는? 0 % 같은 haha입니다. 기술적으로는 같지만 그렇지 않습니다. 여전히 게시 할 수 있음; P.
Magic Octopus Urn


5

젤리 , 6 바이트

2ḤÆp$¡

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

인덱스가 0입니다.

설명

2ḤÆp$¡  Main link. Input: n
2       Constant 2
    $¡  Repeat n times
 Ḥ        Double
  Æp      Find the largest prime less than the double

poke 당신은 지금 또 다른 바이트 가 필요하다 ;) ...
Magic Octopus Urn

@MagicOctopusUrn 0을 입력하면 2, 1은 3 등을 반환합니다. 문제가 없습니다.
마일

나는 당신이 6 바이트로 묶었 기 때문에이 대답에 바이트를 저장해야한다는 것을 의미했습니다. 당신의 대답 자체는 괜찮습니다.
매직 문어 Urn

5

MATL , 9 바이트

1i:"EZq0)

n을 입력 하고 1 인덱싱 된 a ( n )를 출력 합니다 .

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

설명

1       % Push 1
i       % Push input n
:"      % Do the following that many times
  E     %   Multiply by 2
  Zq    %   Primes up to that
  0)    %   Get last entry
        % End (implicit). Display (implicit)

5

Stax , 10 바이트

ü☼┌τ,æ▒ìn(

테스트 사례 실행

이 문제는 stax의 구현에 버그를 노출 시켰는데 :p, 이는 입력보다 가장 적은 소수를 얻는 명령입니다. 제대로 작동하면 5 6 바이트 솔루션이 있습니다. 그러나 아아, 그렇지 않습니다. 언어의 제작자로서 나는 그것을 고칠 것이지만, 문제가 게시 된 후에 그것을 고치고 사용하는 것은 싼 것 같습니다.

어쨌든, 위의 프로그램에 해당하는 ASCII 표현이 있습니다.

ODH{|p}{vgs

문제 설명을 비교적 간단하게 구현합니다. 흥미로운 점은 gs생성기 양식을 사용하는 것입니다 . 제너레이터는 초기 조건, 변환 및 필터를 결합하여 하나 이상의 만족스러운 값을 생성하는 일련의 구성입니다. 이 경우 깨진 :p명령 대신 사용됩니다 .

O               Push integer 1 underneath the input number.
 D              Pop the input and repeat the rest of the program that many times.
  H             Double number.
   {|p}         Predicate block: is prime?
       {vgs     Decrement until the predicate is satisfied.
                Output is implicitly printed.

편집 : 여기 에 6 바이트 솔루션이 있지만이 챌린지를 게시 한 후에 만 ​​적용되는 버그 수정이 필요합니다.


좋은 언어! 내 골프 랭글 목록에 추가했습니다 . 문제가 있거나 추가하고 싶은 것이 있으면 알려주세요.
ETHproductions

@ETHproductions : 감사합니다! 마음에 들지 않으면 인터프리터 URL을 staxlang.xyz로 변경할 수 있습니까 ?
재귀

1
와, 골프 언어만을위한 전체 도메인? 럭키 esolang;) 업데이트!
ETHproductions

@recursive WOW, 각 xyz 도메인 당 $ 1.99? 난 ..
Magic Octopus Urn

4

파이썬 2 , 63 바이트

r=m=k=P=2
while k:
 P*=k;k+=1
 if k>m:print r;m=r*2
 if P%k:r=k

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

영원히 인쇄합니다.

소수를 앞으로 생성하는 것이이 문제에 대해 어수선한 경우에도 Wilson의 정리 소수 생성기를 사용합니다. 현재 가장 큰 소수 r와 배가되는 경계를 추적합니다 m.

유일한 효과는 4가 소수이고 배가 순서가 누락되었다고 주장하는 것이 유일한 효과이므로 평소가 P*=k아닌 2 바이트가 저장 P*=k*k됩니다.


4

CJam (15 바이트)

2{2*{mp},W=}qi*

온라인 데모 . 이 인덱스는 0입니다.


보다 효율적인 방법은 뒤로 검색하는 것이지만 암시 적 ,(범위)을 사용할 수 없으므로 한 문자 이상이 필요합니다 .

2{2*,W%{mp}=}qi*

4

Japt , 16 14 13 12 바이트

하나의 가격에 대한 두 가지 솔루션, 둘 다 1- 색인.


N 학기

마지막으로,를 사용하기위한 효과적인 솔루션을 작성할 수있는 과제 F.g()입니다.

_ôZ fj Ì}g°U

시도 해봐

                 :Implicit input of integer U
_       }g       :Starting with the array [0,1] take the last element (Z),
                 :pass it through the following function
                 :and push the returned value to the array
 ôZ              :  Range [Z,Z+Z]
    fj           :  Filter primes
       Ì         :  Get the last item
          °U     :Repeat that process U+1 times and return the last element in the array

첫 번째 N 조건

ÆV=ôV fj ̪2

시도 해봐

                 :Implicit input of integer U
                 :Also makes use of variable V, which defaults to 0
Æ                :Create range [0,U) and pass each through a function
  ôV             :  Range [V,V+V]
     fj          :  Filter primes
        Ì        :  Get the last item
         ª2      :  Logical OR with 2, because the above will return undefined on the first iteration
 V=              :  Assign the result of the above to V





2

C (gcc) , 97 87 86 80 79 바이트

  • P우선 점검 기능 을 메인 루프 에 인라인하여 10 바이트를 절약했습니다 .
  • printf호출 을 이동하여 바이트를 저장했습니다 .
  • i끝없는 스트림을 출력하는 대신-번째 시퀀스 항목 (0 인덱스) 을 반환하여 6 바이트를 절약했습니다 .
  • ceilingcat 덕분에 바이트를 절약했습니다 .
f(p,r,i,m,e){for(r=2;p--;)for(e=0,i=r+r;e=m=!e;r=i--)for(;i-++m;e=e&&i%m);p=r;}

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


@ceilingcat 감사합니다.
Jonathan Frech

1

첨부 , 38 바이트

{If[_,Last[Series[Prime,2*$[_-1]]],2]}

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

0 기반; nBertrand 소수를 리턴합니다 .

현재 이전 / 다음 소수를 찾을 수있는 기본 제공 도구가 없으므로 기본 제공을 사용하여 Series최대 모든 소수를 계산합니다 2*$[_-1]. 이 마지막 표현식은 암시 적 재귀 (에 바인딩 됨 $)를 사용하여 반복 관계를 쉽게 정의합니다. if 조건은 기본 조건을 결정하는 데 사용됩니다.



1

망막 , 39 바이트

.K`_
"$+"{`_
__
+`^(?=(..+)\1+$).

*\`_

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

.K`_

1부터 시작하십시오.

"$+"{`

입력을 루프 카운트로 사용하여 루프를 반복하십시오.

_
__

값을 두 배로 늘리십시오.

+`^(?=(..+)\1+$).

값보다 작은 소수를 찾으십시오.

*\`_

인쇄하십시오.


0

루비 , 51 + 7 (-rprime) = 58 바이트

->n{x=2
n.times{x=(x..2*x).select(&:prime?)[-1]}
x}

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

베르트랑 소수를 받아들이고 n돌려주는 람바 nth. 여기에는 많지 않지만 어쨌든 풀리십시오.

->n{
  x=2                       # With a starting value of 2
  n.times{                  # Repeat n times:
    x=(x..2*x)              # Take the range from x to its double
      .select(&:prime?)[-1] # Filter to only primes, and take the last
  }
  x                         # Return
}

루비 , 48 + 7 = 55 바이트

x=2
loop{puts x
x*=2
loop{(x-=1).prime?&&break}}

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

재미를 위해 여기에 무한 루프 솔루션이 있습니다. 그대로 인쇄되며 인터럽트가 필요합니다. 정확히 중단 한 시간에 따라 출력이 표시되거나 표시되지 않을 수 있습니다. 언 골프 드 :

x=2
loop{
  puts x
  x*=2
  loop{
    (x-=1).prime? && break
  }
}

0

APL (Dyalog Extended) , 12 바이트

사용자의 입력을 N으로 취하고 시퀀스의 N 번째 요소를 리턴합니다 (0 인덱스).

42×⍵}⍣⎕⊢2

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

설명:

42×⍵}⍣⎕⊢2  Full program
              Get input from user - call it 'N'
          2  Repeat the left function N times, beginning with 2
    2×⍵        Double the function input
 ¯4           Find the largest prime less than above

0

R , 87 바이트

주어진 n출력a(n)

j=scan();n=2;while(j-1){for(i in (n+1):(2*n)){n=ifelse(any(i%%2:(i-1)<1),n,i)};j=j-1};n

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

나는 여전히 "Given n output a (1), a (2) ... a (n)"을 연구하고 있습니다. 이 코드를 약간 수정할 수 있다고 생각했지만 그보다 더 어려워 보입니다.

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