Apakah saya memiliki saudara kembar utama?


23

Integer adalah prima jika dan hanya jika itu positif dan memiliki tepat 2 pembagi yang berbeda: 1 dan itu sendiri. Sepasang prime kembar terbuat dari dua elemen: pdan p±2, keduanya adalah prime.

Anda akan diberikan bilangan bulat positif sebagai input. Tugas Anda adalah mengembalikan kebenaran / kepalsuan tergantung pada apakah bilangan bulat yang diberikan milik pasangan kembar, mengikuti standar aturan (nilai-nilai harus konsisten).

Uji Kasus

  • Truthy (Twin Primes): 3, 5, 7, 11, 13, 17, 19, 29, 31, 41, 43

  • Falsy (bukan Twin Primes): 2, 15, 20, 23, 37, 47, 97, 120, 566

Ini adalah , jadi kode terpendek dalam byte menang!


Apakah 13 kembar utama?
LiefdeWen

@LiefdeWen Ya, karena itu milik pasangan (11, 13)
daniero

Jawaban:



11

Jelly , 10 9 byte

%6+_2_ÆP⁺

Cobalah online!

Latar Belakang

Dengan pengecualian (3, 5) , semua pasangan utama kembar berbentuk (6k - 1, 6k + 1) .

Sejak (6k - 1) + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 dan
(6k + 1) + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 , diberi input n> 3 , cukup untuk memeriksa apakah n dan n + n% 6 - 3 keduanya prima.

Formula ini terjadi kerja untuk n = 3 juga, seperti 3 + 3% 6-3 = 3 adalah bilangan prima dan 3 adalah prima kembar.

Bagaimana itu bekerja

%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

Cobalah online!

Latar Belakang

Semua bilangan bulat mengambil salah satu dari formulir berikut, dengan bilangan bulat k : 6k - 3 , 6k - 2 , 6k - 1 , 6k , 6k + 1 , 6k + 2 .

Karena 6k - 2 , 6k , dan 6k + 2 semuanya genap, dan karena 6k - 3 dapat dibagi dengan 3 , semua bilangan prima kecuali 2 dan 3 harus dalam bentuk 6k - 1 atau 6k + 1 . Karena perbedaan pasangan prime kembar adalah 2 , dengan pengecualian (3, 5) , semua pasangan prime kembar berbentuk (6k - 1, 6k + 1) .

Biarkan n dalam bentuk 6k ± 1 .

  • Jika n = 6k -1 , maka n + n% 6 - 3 = 6k - 1 + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 .

  • Jika n = 6k + 1 , maka n + n% 6 - 3 = 6k + 1 + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 .

Jadi, jika n adalah bagian dari pasangan kembar utama dan n ≠ 3 , kembarannya adalah n + n% 6 - 3 .

Bagaimana itu bekerja

Python tidak memiliki tes primality bawaan. Meskipun ada cara-cara singkat untuk menguji satu nomor untuk primality, melakukannya untuk dua nomor akan panjang. Kami akan bekerja dengan pembagi.

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

menghitung berapa bilangan bulat k dalam interval [2, 4n) yang membagi (n + n% 6 - 3) n secara merata, yaitu, menghitung jumlah pembagi dari (n + n% 6 - 3) n dalam interval [2 , 4n) . Kami mengklaim bahwa penghitungan ini adalah 2 jika dan hanya jika n adalah bagian dari pasangan utama kembar.

  • Jika n = 3 (prima kembar), (n + n% 6 - 3) n = 3 (3 + 3 - 3) = 9 memiliki dua pembagi ( 3 dan 9 ) dalam [2, 12) .

  • Jika n> 3 adalah prima kembar, seperti yang terlihat sebelumnya, m: = n + n% 6 - 3 adalah kembarannya. Dalam hal ini, mn memiliki tepat empat pembagi: 1, m, n, mn .

    Sejak n> 3 , kita memiliki m> 4 , jadi 4n <mn dan tepat dua pembagi ( m dan n ) masuk dalam interval [2, 4n) .

  • Jika n = 1 , maka (n + n% 6 - 3) n = 1 + 1 - 3 = -1 tidak memiliki pembagi dalam [2, 4) .

  • Jika n = 2 , maka (n + n% 6 - 3) n = 2 (2 + 2 - 3) = 2 memiliki satu pembagi (sendiri) dalam [2, 8) .

  • Jika n = 4 , maka (n + n% 6 - 3) n = 4 (4 + 4 - 3) = 20 memiliki empat pembagi ( 2 , 4 , 5 , dan 10 ) dalam [2, 16) .

  • Jika n> 4 genap, 2 , n / 2 , dan n semua membagi n dan, oleh karena itu, (n + n% 6 - 3) n . Kami memiliki n / 2> 2 sejak n> 4 , jadi setidaknya ada tiga pembagi dalam [2, 4n) .

  • Jika n = 9 , maka (n + n% 6 - 3) n = 9 (9 + 3 - 3) = 81 memiliki tiga pembagi ( 3 , 9 , dan 21 ) dalam [2, 36) .

  • Jika n> 9 adalah kelipatan dari 3 , maka 3 , n / 3 , dan n semua membagi n dan, karenanya, (n + n% 6 - 3) n . Kami memiliki n / 3> 3 sejak n> 9 , jadi setidaknya ada tiga pembagi dalam [2, 4n) .

  • Akhirnya, jika n = 6k ± 1> 4 bukan prime kembar, baik n atau m: = n + n% 6 - 3 harus komposit dan, oleh karena itu, akui pembagi yang tepat d> 1 .

    Karena n = m + 2 atau m = n + 2 dan n, m> 4 , bilangan bulat d , m , dan n adalah pembagi yang berbeda dari mn . Selanjutnya, m <n + 3 <4n sejak n> 1 , jadi mn memiliki setidaknya tiga pembagi dalam [2, 4n) .


Wow. Kode pendek seperti itu dan begitu banyak kasus khusus yang harus ditangani dengan benar. Adakah alasan Anda mengatakan Python 3? Sejauh yang saya tahu itu juga berfungsi dalam Python 2.
kasperd

Ya, ini juga akan berfungsi dengan baik di Python 2. 3 adalah bagian dari posting SE yang dihasilkan secara otomatis dari TIO.
Dennis

5

05AB1E , 10 9 byte

Disimpan 1 byte berkat Datboi

ÌIÍ‚pZIp*

Cobalah online! atau sebagai Test Suite

Penjelasan

Ì           # push input+2
 IÍ         # push input-2
   ‚        # pair
    p       # isPrime
     Z      # max
      Ip    # push isPrime(input)
        *   # multiply

1
Gunakan ÌIÍ‚sebagai ganti 40SÍ+-1 byte
Datboi

4

PHP, 52 byte

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

tanpa GMP, 84 byte

(menggunakan fungsi utama saya dari stack overflow )

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

Jalankan sebagai pipa dengan -nF. Keluaran kosong untuk kepalsuan, 1untuk kebenaran.

Solusi hebat Dennis porting ke PHP, 56 byte

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

Jalankan sebagai pipa dengan -nRatau coba online .



3

MATL , 11 byte

HOht_v+ZpAa

Output adalah 0atau 1.

Cobalah online!

Penjelasan

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

Retina , 45 44 byte

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

1<`1¶1

Mengembalikan 1 jika inputnya adalah kembar prime, 0 sebaliknya

Cobalah online!

Penjelasan

.*              
$*

Konversikan ke Unary

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

Letakkan n-2, n, dan n + 2 pada baris mereka sendiri

m`^(11+)\1+$   

(Mengikuti baris baru) Hapus semua komposit yang lebih besar dari 1

1<`1¶1          

Periksa apakah ada dua bilangan prima berturut-turut (atau 1,3 karena 3 adalah bilangan prima kembar)


2

Perl 6 , 24 byte

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

Cobalah online!

*adalah argumen untuk fungsi anonim ini. 0 & (-2 | 2)adalah persimpangan yang terdiri dari angka 0DAN baik -2OR 2. Menambahkan *ke persimpangan ini menghasilkan persimpangan nomor *DAN salah satu dari angka * - 2ATAU * + 2. Memanggil is-primemetode pada persimpangan ini mengembalikan nilai kebenaran jika *prima DAN * - 2OR * + 2atau prima. Akhirnya, ?runtuh persimpangan kebenaran ke nilai boolean, memuaskan kondisi nilai-kembali konsisten.


2

JavaScript, 91 byte , 81 byte terima kasih kepada 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))

Penjelasan

pmemberitahu apakah angka yang diberikan nadalah prima atau tidak, dan ttes nomor yang diberikan ndan n±2.

Contoh


Anda tidak perlu var, tanda kurung di ndalam definisi fungsi, dll.
Jared Smith

Saya pikir Anda dapat mengedit cuplikan Anda untuk menunjukkan nilai ndi samping nilai t(n)kejelasan yang meningkat (Eg. 7: true)
Taylor Scott

1
Terima kasih untuk kalian berdua
Serge K.

1

J, 23 byte

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

Cobalah online!

bagaimana?

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 dengan3>0#.@p:0 2 _2&+
mil

@miles bagus. penggunaan yang sangat pintar dari basis 2 untuk memproses hasilnya.
Jonah



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

Excel VBA, 102 100 Bytes

Tidak ada built-in primality untuk VBA :(

Kode

Fungsi jendela langsung VBE anonim yang mengambil input dari sel [A1]dan output baik 1(benar) atau 0(salah) ke jendela Segera VBE

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

Fungsi Penolong

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

Atau, 122 Bytes

Kode

Solusi berbasis fungsi pemeriksaan primitif rekursif

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

Fungsi Penolong

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 berkat Mayube

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

Ini dapat di-golf dengan mengubah nama kedua fungsi menjadi masing-masing 1 karakter (mis. aDan b)
Skidsdev

2
Bukankah PHP membutuhkan functionkata kunci lagi?
Titus


0

Japt , 13 byte

j ©[U+2U-2]dj

Pengembalian truedan falseuntuk apakah nomor tersebut merupakan bagian dari pasangan kembar utama.

Cobalah online!

Penjelasan

Tersirat: U= input integer

j ©

Periksa apakah inputnya prima ( j), DAN ( ©) ...

[U+2U-2]dj

Menggunakan array [U+2, U-2], periksa apakah ada item yang benar ( d) sesuai dengan fungsi primality ( j).

Output implisit dari hasil boolean dari is input prime AND is any ±2 neighbor prime.


Hmm ... Saya merasa [U+2U-2]bisa lebih pendek, tapi saya tidak tahu bagaimana ...
ETHproduksi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.