소수의 고독


24

최근에 나는 주인공이 쌍둥이 소수 와 다소 비교 되는 소설 " 소수 의 고독" ( " 항상 함께 있지만 항상 "을 건드리지 않는 ")을 읽었습니다 .

쌍둥이 소수는 예 -for 다른 소수 트윈 프라임 쌍 (41, 43)이 2 이하 또는 2 이상의 어느 하나 인 소수이다. 다시 말해, 트윈 프라임은 프라임 간격이 2 인 프라임입니다. 때때로 트윈 프라임이라는 용어는 한 쌍의 트윈 프라임에 사용됩니다. 이에 대한 대체 이름은 소수 쌍 또는 소수 쌍입니다. 위키 백과

나는 우울한 소설을별로 좋아하지 않았지만 최근 PPCG에 빠진 이후로 마음에 의문을 제기했습니다 ...

태스크:

양의 정수 N> 4가 주어지면 가장 가까운 쌍 소수 쌍 사이의 외로운 소수 (AKA 분리 소수 )를 찾으십시오 .

이 경우 외로운 소수 라는 용어를 사용하면 쌍둥이 소수가 아닌 쌍둥이 소수 부부 사이의 모든 소수를 의미 합니다 . 그래서 소수의 처음 두 커플이 (3, 5)와 (5, 7)이기 때문에 N> 4입니다.

예:

  1. N = 90
  2. 트윈 프라임 <N 및> N의 처음 두 쌍을 찾습니다. (71, 73) 및 (101, 103)입니다.
  3. > 73에서 <101 사이 의 외로운 소수 를 찾으십시오 .
  4. 그들은 79, 83, 89, 97입니다.

특수한 상황들:

  • N이 두 개의 쌍둥이 소수 사이에 있으면 가장 가까운 쌍의 쌍둥이 소수> N + 1 및 <N-1을 찾습니다. 예 : N = 72,> 73 및 <71의 가장 가까운 쌍 소수를 찾은 다음 외로운 소수 가 아니므로 목록 71 및 73에서 제외하십시오 . 따라서 N = 72의 경우 예상 결과는 67, 71 , 73 , 79, 83, 89, 97입니다.
  • N이 두 쌍의 소수에 속하는 경우 (예 : N = 73) 가장 가까운 쌍의 소수는 (71, 73) 및 (101, 103)입니다. N = 71 인 경우 가장 가까운 쌍 소수 쌍은 (59, 61) 및 (71, 73)입니다.

테스트 사례 :

N = 70   >  Lonely primes are:  67
N = 71   >  Lonely primes are:  67
N = 72   >  Lonely primes are:  67, 79, 83, 89, 97 (not the twins 71 and 73)
N = 73   >  Lonely primes are:  79, 83, 89, 97 
N = 90   >  Lonely primes are:  79, 83, 89, 97
N = 201  >  Lonely primes are:  211, 223
N = 499  >  Lonely primes are:  467, 479, 487, 491, 499, 503, 509

규칙 :

  • 표준 입력에서 숫자 N을 취하는 전체 프로그램 또는 함수를 작성하십시오.
  • 외로운 소수 목록을 csv, list, array 등으로 읽을 수있는 형식으로 출력합니다 .
  • 가장 짧은 코드가 승리합니다.
  • 테스트 가능한 온라인 바이올린을 (가능한 경우) 포함 시키십시오.

4
71, 72 또는 73과 같은 입력에 대한 예상 출력은 무엇입니까?
Martin Ender

1
Lonely Prime AKA Isolated Prime
Digital Trauma

@ MartinEnder 나는 특별한 경우로 질문을 확장했습니다. 설명해 주셔서 감사합니다.
마리오

1
나는 도전 탈취 특별한 경우 조금을 찾아 (일부 답변이 이미 게시 된했을 때 추가 된)
루이스 Mendo에게

1
@JonathanAllan 네, 쌍둥이 소수의 처음 두 커플은 (3, 5)와 (5, 7)이므로 N> 4를 고려할 수 있습니다. 모든 사람에게 명확하게하기 위해 사양을 추가했습니다.
마리오

답변:


2

실제로 47 바이트

이 솔루션은 하한 이 한 쌍의 트윈 프라임 보다 큰지n 확인 하고 (왼쪽의 트윈 프라임이 하한값에서 제거됨) 상한작은 (우리의 상단에 결합되는 우리의 오른쪽에있는 쌍둥이 소수를 제거) 쌍둥이 소수의 쌍. 우리는 하부 및 상부 경계를 일단 우리의 범위에 포함되는 것을 트윈 소수를 방지하기 위해, 우리는 소수를 제거해야하는 경우 또는 코드에 따라서 OR 논리와 부정, 주요입니다.pp-2p+2

이것은 조금 길며 아마도 더 골프를 칠 수 있습니다. 골프 제안을 환영합니다. 온라인으로 사용해보십시오!

╗1`╜+;⌐p@p&`╓F╜+1`╜-;¬p@p&`╓F╜-x`;;¬p@⌐p|Y@p&`░

언 골핑

╗         Store implicit input n in register 0.

1`...`╓   Get the first value x for which the following function f returns a truthy value.
  ╜         Push n from register 0.
  +         Add x to n.
  ;⌐        Duplicate n+x and add 2 to a copy of n+x.
  p         Check if n+x+2 is prime.
  @p        Swap n+x to TOS and check if n+x is prime.
  &         Logical AND the two results.
F         Push the first (and only) result of previous filtering
╜+        Add that result to n to get the upper bound for our solitude.

1`...`╓   Get the first value x for which the following function f returns a truthy value.
  ╜         Push n from register 0.
  -         Subtract x from n.
  ;¬        Duplicate n-x and subtract 2 from a copy of n-x.
  p         Check if n-x-2 is prime.
  @p        Swap n-x to TOS and check if n-x is prime.
  &         Logical AND the two results.
F         Push the first (and only) result of previous filtering.
╜-        Subtract that result from n to get the lower bound for our solitude.

x`...`░   Push values of the range [a...b] where f returns a truthy value. Variable m.
  ;;        Duplicate m twice.
  ¬p        Check if m-2 is prime.
  @⌐p       Check if m+2 is prime. 
  |Y        Logical OR the results and negate.
             This eliminates any numbers with neighboring primes.
  @p        Check if m is prime.
  &         Logical AND primality_check(m) and the previous negation.
             This keeps every other prime number in the range.

23입력 24이 주어지면 예상되는 결과를 얻지 못합니다 . 트윈 주요 경계해야 17 / 19하고 29 / 31, 그리고 23범위에서 격리 된 소수 19 .. 29.
AdmBorkBork

@TimmyD 아 졸랑의 사랑에 오. 프라임 p이라고 하는 버그가 25아직 수정되지 않았거나 Dennis가 버그 수정 이후 실제로 풀리지 않았습니다. 확인하겠습니다.
Sherlock9

@TimmyD 버그 수정이 이미 완료되었으므로이 답변은 여전히 ​​주 통역사가 작동하는 동안 유효합니다. 온라인 인터프리터 인 Try It Online이 아직 업데이트되지 않았을뿐입니다. 이후 업데이트되었으며 TIO가 작동합니다.
Sherlock9

그래-설명 주셔서 감사합니다!
AdmBorkBork

8

PowerShell을 V2 +, 237 (149) 147 231 216 181 174 169 166 바이트

param($n)filter f($a){'1'*$a-match'^(?!(..+)\1+$)..'}for($i=$n;!((f $i)-and(f($i+2)))){$i++}for(){if(f(--$i)){if((f($i-2))-or(f($i+2))){if($i-lt$n-1){exit}}else{$i}}}

입력을 $n받습니다. 새로운 함수 f정규 표현식 프라임 함수 로 정의합니다 (여기서 입력이 프라임인지 여부에 따라 부울을 리턴 함).

다음 부분 세트 $i에 동일하게 $n우리가 찾을 때까지 위로 루프, 바닥 우리의 트윈 주요 쌍 절반 상한을. 예를 들어, 입력의 90경우에 중지됩니다 $i=101.

그런 다음 상한에서 아래로 반복합니다. 나는 그것이 무한 루프처럼 보이지만 결국 끝날 것입니다.

현재 숫자가 소수가 (있는 경우 f(--$i)), 하지만 그것 +/- 2 아닌 소수, 우리는 추가 $i파이프 라인. 그러나 그것이 +/- 2소수 인 경우 , 우리는 우리가 낮은 지 $n-1(즉, 쌍둥이 소수 내에있는 상황을 설명하기 위해) 확인합니다 exit. 프로그램 완료시 파이프 라인은 암시 적을 통해 화면에 인쇄됩니다 Write-Output.

NB-루핑 구조로 인해 소수를 내림차순으로 인쇄합니다. OP는이를 확인했습니다.

배열의 기본 문자열 화 방법이므로 여기에서 출력은 공백으로 구분됩니다.

PS C:\Tools\Scripts\golfing> 70,71,72,73,90,201,499,982|%{"$_ --> "+(.\the-solitude-of-prime-numbers.ps1 $_)}
70 --> 67
71 --> 67
72 --> 97 89 83 79 67
73 --> 97 89 83 79
90 --> 97 89 83 79
201 --> 223 211
499 --> 509 503 499 491 487 479 467
982 --> 1013 1009 997 991 983 977 971 967 953 947 941 937 929 919 911 907 887


3

자바 스크립트, 186 183 168 158 바이트

// solution:
function d(d){function p(n){for(i=n;n%--i;);return!--i}u=d;for(;!p(d--)||!p(--d););for(;!p(u++)||!p(++u););for(;++d<u;)if(p(d)&&!p(d-2)&&!p(d+2))console.log(d)}

// runnable test cases:
console.info('Test ' + 70);
d(70);
console.info('Test ' + 71);
d(71);
console.info('Test ' + 72);
d(72);
console.info('Test ' + 73);
d(73);
console.info('Test ' + 90);
d(90);
console.info('Test ' + 201);
d(201);
console.info('Test ' + 499);
d(499);


PPCG에 오신 것을 환영합니다! 좋은 첫 대답.
AdmBorkBork

2

PHP, 207 바이트

(47) (54)는 바이트 is_primePHP가없는 것을 기능. 나는 그것없이 Mathematica를 이겼습니다. :-디

function p($n){for($i=$n>1?$n:4;$n%--$i;);return$i<2;}if(p($n=$argv[1])&p($n+2)|$z=p($n-1)&p($n+1))$n-=2;for($n|=1;!p($n)|!p($n-2);$n--);for($z++;$z--;$n+=2)for(;$n+=2;)if(p($n)){if(p($n+2))break;echo"$n,";}

로 실행하십시오 -r. 후행 쉼표를 인쇄합니다.

고장

// is_prime function:
// loops from $n-1 down to 1, breaks if it finds a divisor.
// returns true if divisor is <2 (==1)
// special case $n==1: initialize $i=4 to prevent warnings
function p($n){for($i=$n>1?$n:4;$n%--$i;);return$i<2;}

// is $n between primes?
if($z=p(1+$n=$argv[1])&p($n-1)) // set $z to go to the _second_ twin pair above
    $n-=2;
// no:
else
    if(p($n)&p($n+2))$n-=2;     // $n is part of the upper pair
    // p($n)&p($n-2):           // $n is part of the lower pair
    // else:                    // this is a lonely (isolated) prime

// 1. find closest twins <=$n
for($n|=1;!p($n)|!p($n-2);$n--);

// 2. list primes until the next twin primes
L:
for(;$n+=2;)if(p($n))
    if(p($n+2))break;       // next twin primes found: break loop
    else echo"$n,";         // isolated prime: print

// 3. if ($z) repeat (once)
$n+=2;  // skip twin pair
if($z--)goto L;

참고 :

is_prime함수는 실제로 다음을 반환 true합니다 $n<2. 그러나 적어도 경고는 발생하지 않습니다. 수정 $n=하기 전에 삽입 $n>1하십시오.


php.net/manual/en/function.gmp-nextprime.php 이 라이브러리가 도움이 될 수 있습니까?
Jörg Hülsermann

@ JörgHülsermann : gmp가 표준 설치에있는 경우 최소 11 바이트를 제공합니다. 시도 해봐.
Titus

1

매스 매 티카, 169157 바이트

Select[PrimeQ]@Sort@Flatten@{If[q@#,0,#],Most@NestWhileList[i-=2;#+i&,#,!q@#&]&/@(i=3;q=PrimeQ@#&&Or@@PrimeQ[{2,-2}+#]&;#+{1,-1}(1+Boole@PrimeQ[{1,-1}+#]))}&

1

라켓 228 바이트

(λ(n)(let*((t 0)(lr(λ(l i)(list-ref l i)))(pl(drop(reverse(for/list((i(in-naturals))#:when(prime? i)#:final(and(> i n)
(= 2(- i t))))(set! t i)i))2)))(for/list((i(length pl))#:break(= 2(-(lr pl i)(lr pl(add1 i)))))(lr pl i))))

이 버전의 단점은 N 주위의 소수뿐만 아니라 N까지 모든 소수를 찾는다는 것입니다.

언 골프 버전 :

(define (f n)
  (let* ((t 0)
         (lr (λ(l i) (list-ref l i)))
         (pl (drop(reverse  
                   (for/list ((i (in-naturals))
                              #:when (prime? i)
                              #:final (and
                                       (> i n)
                                       (= 2 (- i t))))
                     (set! t i)
                     i)) 2)))
    (for/list ((i (length pl))
               #:break (= 2 (- (lr pl i) (lr pl (add1 i)))) )
      (lr pl i)))
)

테스트 :

(f 90)

산출:

'(97 89 83 79)

1

라켓 245 바이트

(λ(n)(let((pl(reverse(let lp((n n)(t 0)(ol '()))(set! t(prev-prime n))(if(and(>(length ol)0)
(= 2(-(car ol)t)))(cdr ol)(lp t 0(cons t ol)))))))(let lq((n n)(t 0)(ol pl))(set! t(next-prime n))
(if(= 2(- t(car ol)))(cdr ol)(lq t 0(cons t ol))))))

언 골프 버전 :

(require math)
(define f
  (lambda(n)
    (let ((pl 
           (reverse
            (let loop ((n n) (t 0) (ol '()))
              (set! t (prev-prime n))
              (if (and
                   (> (length ol) 0)
                   (= 2 (- (car ol) t)))
                  (cdr ol)
                  (loop t 0 (cons t ol)))))))
      (let loop2 ((n n) (t 0) (ol pl))
        (set! t (next-prime n))
        (if (= 2 (- t (car ol)))
            (cdr ol)
            (loop2 t 0 (cons t ol))))))
  )

(f 90)

산출:

'(97 89 83 79)

1

파이썬 2.7 : 160 바이트

t=lambda n:all(n%d for d in range(2,n))
def l(n):
 i=n
 while t(i)*t(i+2)-1:i+=1
 while t(n)*t(n-2)-1:n-=1
 print[x for x in range(n,i)if t(x)&~(t(x-2)|t(x+2))]

제안은 환영합니다 :)

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