Sự đơn độc của số nguyên tố


24

Gần đây tôi đọc cuốn tiểu thuyết "Sự đơn độc của các số nguyên tố" trong đó các nhân vật chính có phần được so sánh với các số nguyên tố sinh đôi (" luôn luôn bên nhau, nhưng không bao giờ chạm vào ").

Một số nguyên tố sinh đôi là một số nguyên tố nhỏ hơn 2 hoặc ít hơn 2 số nguyên tố khác, ví dụ, cặp số nguyên tố sinh đôi (41, 43). Nói cách khác, một số nguyên tố sinh đôi là một số nguyên tố có khoảng cách nguyên tố là hai. Đôi khi thuật ngữ sinh đôi được sử dụng cho một cặp số nguyên tố sinh đôi; một tên thay thế cho điều này là cặp đôi nguyên tố hoặc cặp nguyên tố. Wikipedia

Mặc dù tôi không thích cuốn tiểu thuyết buồn, và vì tôi đã rơi vào PPCG gần đây, điều đó đã đặt ra một câu hỏi trong đầu tôi ...

Bài tập:

Cho số nguyên dương N> 4, tìm các số nguyên tố cô đơn ( số nguyên tố bị cô lập AKA ) giữa các cặp số nguyên tố sinh đôi gần nhất .

Xin lưu ý rằng trong trường hợp này với thuật ngữ số nguyên tố cô đơn , ý tôi là tất cả các số nguyên tố không phải là số nguyên tố sinh đôi và giữa các cặp số nguyên tố sinh đôi . Đó là lý do tại sao N> 4 vì hai cặp số nguyên tố đầu tiên là (3, 5) và (5, 7).

Thí dụ:

  1. N = 90.
  2. Tìm hai cặp số nguyên tố sinh đôi đầu tiên <N và> N. Chúng là: (71, 73) và (101, 103).
  3. Tìm các số nguyên tố cô đơn trong phạm vi> 73 và <101.
  4. Đó là: 79, 83, 89, 97.

Trường hợp đặc biệt:

  • Nếu N ở giữa hai số nguyên tố sinh đôi, hãy tìm các cặp số nguyên tố sinh đôi gần nhất> N + 1 và <N-1. Ví dụ: N = 72, tìm các cặp số nguyên tố sinh đôi gần nhất> 73 và <71 sau đó loại trừ khỏi danh sách 71 và 73 vì chúng không phải là số nguyên tố cô đơn . Vì vậy, với N = 72, kết quả mong đợi là: 67, 71 , 73 , 79, 83, 89, 97
  • Nếu N thuộc một cặp số nguyên tố sinh đôi, ví dụ N = 73, thì cặp số nguyên tố sinh đôi gần nhất là (71, 73) và (101, 103). Nếu N = 71, các cặp số nguyên tố sinh đôi gần nhất là (59, 61) và (71, 73).

Các trường hợp thử nghiệm:

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

Quy tắc:

  • Viết chương trình hoặc hàm đầy đủ sẽ lấy số N từ đầu vào tiêu chuẩn.
  • Xuất ra danh sách các số nguyên tố cô đơn ở định dạng có thể đọc được như csv, danh sách, mảng, v.v.
  • Mã ngắn nhất sẽ thắng.
  • Vui lòng bao gồm (khi có thể) một câu đố trực tuyến có thể kiểm tra.

4
Đầu ra dự kiến ​​cho các đầu vào như 71, 72 hoặc 73 là gì?
Martin Ender


@MartinEnder Tôi mở rộng câu hỏi của mình với những trường hợp đặc biệt. Cảm ơn bạn đã làm rõ.
Mario

1
Tôi thấy các trường hợp đặc biệt làm hỏng thử thách một chút (và đã được thêm vào khi một số câu trả lời đã được đăng)
Luis Mendo

1
@Jonathan ALLan Có, bạn có thể xem xét N> 4 vì hai cặp số nguyên tố sinh đôi đầu tiên là (3, 5) và (5, 7). Tôi đã thêm các đặc điểm kỹ thuật để làm cho nó rõ ràng cho mọi người.
Mario

Câu trả lời:


2

Trên thực tế, 47 byte

Giải pháp này liên quan đến trường hợp nnằm giữa hai số nguyên tố sinh đôi, bằng cách kiểm tra xem giới hạn dướilớn hơn một cặp số nguyên tố sinh đôi hay không (loại bỏ số nguyên tố sinh đôi ở bên trái của chúng ta khỏi giới hạn dưới của chúng ta) và nếu giới hạn trên là các nhỏ của một cặp số nguyên tố sinh đôi (loại bỏ thủ đôi bên phải của chúng ta khỏi bị trên chúng tôi bị ràng buộc). Để ngăn các số nguyên tố sinh đôi được đưa vào phạm vi của chúng ta một khi chúng ta có giới hạn dưới và trên, chúng ta cần loại bỏ các số nguyên tố ptrong đó p-2OR p+2là số nguyên tố, do đó OR logic và phủ định trong mã.

Đây là một chút dài và có thể có thể được chơi golf hơn nữa. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

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

Ungolfing

╗         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.

Tôi không nhận được đầu ra mong đợi 23khi đầu vào 24được đưa ra. Các giới hạn nguyên tố sinh đôi nên 17 / 1929 / 31, và 23là một số nguyên tố biệt lập trong phạm vi 19 .. 29.
admBorkBork

@TimmyD Ôi tình yêu của esolang. Hoặc là lỗi ở đâu pnói 25là số nguyên tố chưa được cố định nào, hay Dennis đã không kéo Trên thực tế kể từ khi bản vá lỗi. Để tôi đi kiểm tra.
Sherlock9

@TimmyD Vì việc sửa lỗi đã hoàn tất, câu trả lời này vẫn còn hiệu lực khi trình thông dịch chính hoạt động. Chỉ là thông dịch viên trực tuyến, Dùng thử trực tuyến, chưa được cập nhật. Nó đã được cập nhật và TIO sẽ hoạt động ngay bây giờ.
Sherlock9

Đúng - cảm ơn đã giải thích!
admBorkBork

8

PowerShell v2 +, 237 149 147 231 216 181 174 169 166 byte

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}}}

Đưa đầu vào $n. Xác định hàm mới flà hàm số nguyên tố regex (ở đây trả về Boolean nếu đầu vào là số nguyên tố hay không).

Phần tiếp theo đặt $ibằng $n, sau đó lặp lại cho đến khi chúng ta tìm thấy nửa dưới của cặp nguyên tố sinh đôi của chúng ta giới hạn trên. Ví dụ, đối với đầu vào 90, điều này dừng lại ở $i=101.

Sau đó, chúng tôi lặp từ giới hạn trên xuống. Tôi biết, nó trông giống như một vòng lặp vô hạn, nhưng cuối cùng nó sẽ kết thúc.

Nếu số hiện tại là số nguyên tố ( f(--$i)), nhưng+/- 2 không phải là số nguyên tố, chúng tôi thêm $ivào đường ống. Tuy nhiên, nếu đó +/- 2là số nguyên tố, chúng tôi sẽ kiểm tra xem liệu chúng tôi có thấp hơn $n-1(nghĩa là để tính đến tình huống khi nó nằm trong cặp nguyên tố sinh đôi) hay không, tại thời điểm đó chúng tôi exit. Khi hoàn thành chương trình, đường ống được in ra màn hình thông qua ẩn Write-Output.

NB - Do cấu trúc vòng lặp, in các số nguyên tố theo thứ tự giảm dần. OP đã làm rõ rằng OK.

Ví dụ

Đầu ra ở đây được phân tách bằng dấu cách, vì đó là phương thức xâu chuỗi mặc định cho một mảng.

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

JavaScript, 186 183 168 158 byte

// 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);


Chào mừng đến với PPCG! Câu trả lời đầu tiên tốt đẹp.
admBorkBork

2

PHP, 207 byte

47 54 byte cho is_primehàm mà PHP không có. Tôi đã đánh bại Mathicala mà không cần điều đó. : -D

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,";}

chạy với -r. in dấu phẩy.

phá vỡ

// 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;

Lưu ý :

Các is_primechức năng thực sự trả truecho $n<2; nhưng ít nhất nó không tạo ra một cảnh báo. Chèn $n=trước $n>1để sửa.


php.net/manual/en/feft.gmp-nextprime.php thư viện này có thể giúp gì không?
Jörg Hülsermann

@ JörgHülsermann: Nếu sẽ cung cấp ít nhất 11 byte, nếu gmp sẽ ở trong bản cài đặt tiêu chuẩn. Thử nó.
Tít

1

Toán học, 169 157 byte

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

Vợt 228 byte

(λ(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))))

Nhược điểm của phiên bản này là nó tìm thấy tất cả các số nguyên tố cho đến N và không chỉ những người xung quanh N.

Phiên bản bị đánh cắp:

(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)))
)

Kiểm tra:

(f 90)

Đầu ra:

'(97 89 83 79)

1

Vợt 245 byte

(λ(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))))))

Phiên bản bị đánh cắp:

(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)

Đầu ra:

'(97 89 83 79)

1

Python 2.7: 160 byte

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))]

đề nghị được chào đón :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.