Tôi có sinh đôi không?


23

Một số nguyên là số nguyên tố khi và chỉ khi nó dương và có đúng 2 ước số riêng biệt: 1 và chính nó. Một cặp nguyên tố sinh đôi được tạo thành từ hai yếu tố: pp±2, cả hai đều là số nguyên tố.

Bạn sẽ được cung cấp một số nguyên dương làm đầu vào. Nhiệm vụ của bạn là trả về một giá trị trung thực / giả mạo tùy thuộc vào việc số nguyên đã cho có thuộc về một cặp sinh đôi hay không, tuân theo các quy tắc tiêu chuẩn (các giá trị cần phải nhất quán).

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

  • Truthy (Số nguyên tố sinh đôi): 3, 5, 7, 11, 13, 17, 19, 29, 31, 41, 43

  • Falsy (không phải Twin Primes): 2, 15, 20, 23, 37, 47, 97, 120, 566

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


13 là sinh đôi chính?
LiefdeWen

@LiefdeWen Có, vì nó thuộc về cặp (11, 13)
daniero

Câu trả lời:



11

Thạch , 10 9 byte

%6+_2_ÆP⁺

Hãy thử trực tuyến!

Lý lịch

Ngoại trừ (3, 5) , tất cả các cặp số nguyên tố sinh đôi đều có dạng (6k - 1, 6k + 1) .

(6k - 1) + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1
(6k + 1) + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 , với đầu vào n> 3 , đủ để kiểm tra xem nn + n% 6 - 3 có phải là số nguyên tố hay không.

Công thức này cũng xảy ra với n = 3 , vì 3 + 3% 6 - 3 = 3 là số nguyên tố và 3 là số nguyên tố sinh đôi.

Làm thế nào nó hoạt động

%6+_2_ÆP⁺  Main link. Argument: n

%6         Compute n%6.
  +        Add n to the result.
   _2      Subtract 2.
     _ÆP   Subtract 1 if n is prime, 0 if not.
           If n is not a prime, since (n + n%6 - 2) is always even, this can only
           yield a prime if (n + n%6 - 2 = 2), which happens only when n = 2.
        ⁺  Call ÆP again, testing the result for primality.

7

Python 3 , 53 byte

lambda n:sum((n+n%6-3)*n%k<1for k in range(2,4*n))==2

Hãy thử trực tuyến!

Lý lịch

Tất cả các số nguyên có một trong các dạng sau, với số nguyên k : 6k - 3 , 6k - 2 , 6k - 1 , 6k , 6k + 1 , 6k + 2 .

6k - 2 , 6k6k + 2 đều chẵn và vì 6k - 3 chia hết cho 3 , nên tất cả các số nguyên tố trừ 23 phải có dạng 6k - 1 hoặc 6k + 1 . Vì sự khác biệt của cặp số nguyên tố sinh đôi là 2 , ngoại trừ (3, 5) , tất cả các cặp số nguyên tố sinh đôi đều có dạng (6k - 1, 6k + 1) .

Đặt n có dạng 6k ± 1 .

  • Nếu n = 6k -1 , thì n + n% 6 - 3 = 6k - 1 + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 .

  • Nếu n = 6k + 1 , thì n + n% 6 - 3 = 6k + 1 + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 .

Do đó, nếu n là một phần của cặp nguyên tố sinh đôi và n 3 , thì cặp song sinh đó sẽ là n + n% 6 - 3 .

Làm thế nào nó hoạt động

Python không có kiểm tra tính nguyên thủy tích hợp. Mặc dù có nhiều cách ngắn để kiểm tra một số duy nhất cho tính nguyên thủy, nhưng làm như vậy cho hai số sẽ dài. Thay vào đó, chúng tôi sẽ làm việc với các ước.

sum((n+n%6-3)*n%k<1for k in range(2,4*n))

đếm có bao nhiêu số nguyên k trong khoảng [2, 4n) chia (n + n% 6 - 3) n , tức là, nó đếm số ước của (n + n% 6 - 3) n trong khoảng [2 , 4n) . Chúng tôi tuyên bố rằng số này là 2 khi và chỉ khi n là một phần của cặp số nguyên tố sinh đôi.

  • Nếu n = 3 (một số nguyên tố sinh đôi), (n + n% 6 - 3) n = 3 (3 + 3 - 3) = 9 có hai ước ( 39 ) trong [2, 12) .

  • Nếu n> 3 là số nguyên tố sinh đôi, như đã thấy trước đó, m: = n + n% 6 - 3 là số nguyên tố của nó. Trong trường hợp này, mn có đúng bốn ước: 1, m, n, mn .

    n> 3 , chúng ta có m> 4 , vì vậy 4n <mn và chính xác hai ước ( mn ) rơi vào khoảng [2, 4n) .

  • Nếu n = 1 , thì (n + n% 6 - 3) n = 1 + 1 - 3 = -1 không có ước số trong [2, 4) .

  • Nếu n = 2 , thì (n + n% 6 - 3) n = 2 (2 + 2 - 3) = 2 có một ước (chính nó) trong [2, 8) .

  • Nếu n = 4 , thì (n + n% 6 - 3) n = 4 (4 + 4 - 3) = 20 có bốn ước ( 2 , 4 , 510 ) trong [2, 16) .

  • Nếu n> 4 là chẵn, 2 , n / 2n đều chia n và, do đó, (n + n% 6 - 3) n . Chúng ta có n / 2> 2 kể từ n> 4 , do đó, có ít nhất ba ước số trong [2, 4n) .

  • Nếu n = 9 , thì (n + n% 6 - 3) n = 9 (9 + 3 - 3) = 81 có ba ước ( 3 , 921 ) trong [2, 36) .

  • Nếu n> 9 là bội của 3 , thì 3 , n / 3n đều chia n và, do đó, (n + n% 6 - 3) n . Chúng ta có n / 3> 3 kể từ n> 9 , do đó, có ít nhất ba ước số trong [2, 4n) .

  • Cuối cùng, nếu n = 6k ± 1> 4 không phải là số nguyên tố sinh đôi, thì n hoặc m: = n + n% 6 - 3 phải là hợp số và do đó, thừa nhận một ước số thích hợp d> 1 .

    n = m + 2 hoặc m = n + 2n, m> 4 , các số nguyên d , mncác ước số riêng biệt của mn . Hơn nữa, m <n + 3 <4n kể từ n> 1 , vì vậy mn có ít nhất ba ước trong [2, 4n) .


Ồ Mã ngắn như vậy và rất nhiều trường hợp đặc biệt nó phải xử lý chính xác. Bất kỳ lý do bạn nói Python 3? Theo như tôi có thể nói nó cũng hoạt động trong Python 2.
kasperd

Có, điều này cũng sẽ hoạt động tốt trong Python 2. 3 là một phần của bài đăng SE được tạo tự động từ TIO.
Dennis


4

PHP, 52 byte

<?=($p=gmp_prob_prime)($n=$argn)&&$p($n+2)|$p($n-2);

không có GMP, 84 byte

(sử dụng hàm Prime của tôi từ stack stack )

<?=p($n=$argn)&&p(2+$n)|p($n-2);function p($n){for($i=$n;--$i&&$n%$i;);return$i==1;}

Chạy như ống với -nF. Đầu ra trống cho giả, 1cho sự thật.

Giải pháp tuyệt vời của Dennis bào được chuyển sang PHP, 56 byte

while($i++<4*$n=$argn)($n+$n%6-3)*$n%$i?:$s++;echo$s==3;

Chạy như ống với -nRhoặc thử trực tuyến .



3

MATL , 11 byte

HOht_v+ZpAa

Đầu ra là 0hoặc 1.

Hãy thử trực tuyến!

Giải trình

H    % Push 2
O    % Push 0
h    % Concatenate horizontally: gives [2 0]
t_   % Push a negated copy: [-2 0]
v    % Concatenate vertically: [2 0; -2 0]
+    % Add to implicit input
Zp   % Isprime
A    % All: true for columns that only contain nonzeros
a    % Any: true if there is at least a nonzero. Implicit display


2

Võng mạc , 45 44 byte

.*
$*
11(1+)
$1¶$&¶11$&
m`^(11+)\1+$

1<`1¶1

Trả về 1 nếu đầu vào là số nguyên tố sinh đôi, 0 nếu không

Hãy thử trực tuyến!

Giải trình

.*              
$*

Chuyển đổi sang Unary

11(1+)          
$1¶$&¶11$&

Đặt n-2, n và n + 2 trên các dòng riêng của họ

m`^(11+)\1+$   

(Trailing newline) Xóa tất cả các vật liệu tổng hợp lớn hơn 1

1<`1¶1          

Kiểm tra xem có hai số nguyên tố liên tiếp không (hoặc 1,3 vì 3 là số nguyên tố sinh đôi)


2

Perl 6 , 24 byte

?(*+(0&(-2|2))).is-prime

Hãy thử trực tuyến!

*là đối số cho chức năng ẩn danh này. 0 & (-2 | 2)là đường giao nhau bao gồm các số 0-2HOẶC 2. Thêm *vào điểm nối này sẽ tạo ra điểm nối của số *VÀ một trong hai số * - 2OR * + 2. Gọi is-primephương thức trên đường giao nhau này trả về giá trị trung thực nếu *là số nguyên tố VÀ * - 2HOẶC * + 2là số nguyên tố. Cuối cùng, sự ?sụp đổ của đường nối trung thực đến một giá trị boolean, thỏa mãn điều kiện giá trị trả về nhất quán.


2

JavaScript, 91 byte , 81 byte nhờ Jared Smith

p=n=>{for(i=2;i<n;)if(n%i++==0)return !!0;return n>1},t=n=>p(n)&&(p(n+2)||p(n-2))

Giải trình

pcho biết số đã cho nlà số nguyên tố hay không, và tkiểm tra số đã cho nn±2.

Thí dụ


Bạn không cần var, các dấu ngoặc đơn ntrong định nghĩa hàm, v.v.
Jared Smith

Tôi nghĩ rằng bạn có thể chỉnh sửa đoạn mã của mình để hiển thị giá trị nbên cạnh giá trị của t(n)để tăng độ rõ ràng (Ví dụ:7: true )
Taylor Scott

1
Thx cho cả hai bạn
Serge K.

1

J, 23 byte

1&p:*.0<+/@(1 p:_2 2+])

Hãy thử trực tuyến!

làm sao?

1&p:                               is the arg a prime?
    *.                             boolean and
                                   one of +2 or -2 also a prime
                     (1 p:_2 2+])  length 2 list of booleans indicating if -2 and +2 are primes
               @                   pipe the result into...
      0<+/                         is the sum of the elements greater than 0
                                   ie, at least one true

16 byte với3>0#.@p:0 2 _2&+
dặm

@miles đẹp. sử dụng rất thông minh cơ sở 2 để xử lý kết quả.
Giô-na



1

JavaScript (ES6), 54 byte

a=x=>f(x)&(f(x+2)|f(x-2));f=(n,x=n)=>n%--x?f(n,x):x==1


1

VBA Excel, 102 100 byte

Không có nguyên tắc tích hợp nào cho VBA :(

Hàm cửa sổ tức thời VBE ẩn danh nhận đầu vào từ ô [A1]và xuất 1(trung thực) hoặc 0(giả) vào cửa sổ Ngay lập tức VBE

a=[A1]:?p(a)*(p(a-2)Or p(a+2))

Chức năng trợ giúp

Function p(n)
p=n>2
For i=2To n-1
p=IIf(n Mod i,p,0)
Next
End Function

Ngoài ra, 122 byte

Giải pháp kiểm tra tính nguyên thủy dựa trên đệ quy

a=[A1]:?-1=Not(p(a,a-1)Or(p(a-2,a-3)*p(a+2,a+1)))

Chức năng trợ giúp

Function p(n,m)
If m>1Then p=p(n,m-1)+(n Mod m=0)Else p=n<=0
End Function

0

PHP, 85 byte 24 byte nhờ Mayube

e($n){return f($n)&&((f($n-2)||f($n+2)))
f($n){for($i=$n;--$i&&$n%$i;)return $i==1;}

Điều này có thể được đánh golf đáng kể bằng cách thay đổi tên của cả hai chức năng thành 1 ký tự mỗi (ví dụ ab)
Skidsdev

2
Có phải PHPt cần functiontừ khóa nữa không?
Tít


0

Japt , 13 byte

j ©[U+2U-2]dj

Trả về truefalsecho dù số đó có phải là một phần của cặp sinh đôi chính hay không.

Hãy thử trực tuyến!

Giải trình

Ngụ ý: U= số nguyên đầu vào

j ©

Kiểm tra xem đầu vào có phải là số nguyên tố ( j), AND ( ©) ...

[U+2U-2]dj

Sử dụng mảng [U+2, U-2], kiểm tra xem có mục nào là true ( d) theo hàm nguyên hàm ( j) không.

Đầu ra ngầm định của kết quả boolean của is input prime AND is any ±2 neighbor prime.


Hmm ... Tôi cảm thấy như [U+2U-2]có thể ngắn hơn nhiều, nhưng tôi không thể hiểu làm thế nào ...
Sản phẩm ETH
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.