Apakah ini perdana Chen?

27

Angka adalah perdana Chen jika memenuhi dua syarat:

  • Itu prima itu sendiri
  • Sendiri ditambah dua adalah prima atau semi-prima.

Perdana adalah bilangan di mana ia memiliki tepat dua pembagi dan pembagi itu terdiri dari dirinya sendiri dan satu pembagi.

Semi-prime adalah angka yang merupakan produk dari dua bilangan prima. (Perhatikan bahwa 12 = 2 * 2 * 3 bukan semi-prime, tetapi 25 = 5 * 5).

Tugas Anda adalah menentukan apakah suatu bilangan merupakan prima Chen. Anda harus menampilkan nilai kebenaran untuk ya dan nilai palsu untuk tidak.

Input akan berupa bilangan bulat yang lebih besar dari atau sama dengan satu. Ini juga dapat diambil sebagai string, array karakter, atau array atau digit.

Contoh:

101 -> truthy
223 -> falsy
233 -> truthy
1 -> falsy

Ini adalah OEIS A109611 .

Ini, sebagian, terinspirasi oleh Apakah aku perdana Sophie Germain? yang, sayangnya, ditutup sebagai duplikat, jadi saya memposting tantangan yang agak terkait yang bukan duplikat.

Okx
sumber
Bisakah kita kembali Trueuntuk kebenaran dan 2atau Falseuntuk kepalsuan (nilai-nilai kepalsuan tidak konsisten)?
Tn. Xcoder
@ Mr.Xcoder Tidak pernah bilang kamu tidak bisa
Okx
Untuk semi-prime, apakah "tepat dua faktor utama" menghitung multiplisitas? Apakah 2 * 2 * 2 * 3 * 3semi-prime? Bagaimana dengan 5 * 5?
Bukan pohon
@Natatree 5*5adalah semi-prime, 2*2*2*3*3bukan. Saya mengatakan tepat dua.
Okx
Jadi itu tidak berarti multiplisitas? (Anda dapat berargumen yang 2*2*2*3*3memiliki tepat dua faktor utama, yaitu 2dan 3, dan 5*5memiliki satu faktor utama, yaitu 5.) Mungkin Anda dapat mengeditnya menjadi pertanyaan?
Bukan pohon

Jawaban:

12

Brachylog , 7 byte

ṗ+₂ḋl≤2

Cobalah online!

Penjelasan

ṗ         Input is prime       
   ḋ      The prime factorization of…
 +₂       … Input + 2…
    l≤2   … has 2 or less elements
Fatalisasi
sumber
1
Saya menangkap Neil tepat di 48.000 rep, dan sekarang Anda tepat 22.222: P
ETHproduksi
11

05AB1E , 8 byte

p¹ÌÒg3‹*

Cobalah online!

Penjelasan

p¹ÌÒg3‹*   Argument n
p          Push isPrime(n)
 ¹ÌÒ       Push list of prime factors of (n+2)
    g3‹    Length of list is lower than 3
       *   Multiplication of boolean values, 0 if either is 0 (false)
kalsowerus
sumber
6

ArnoldC , 1339 byte

LISTEN TO ME VERY CAREFULLY q
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE p
GIVE THESE PEOPLE AIR
HEY CHRISTMAS TREE c
YOU SET US UP 0
HEY CHRISTMAS TREE d
YOU SET US UP 0
HEY CHRISTMAS TREE l
YOU SET US UP p
STICK AROUND l
GET TO THE CHOPPER d
HERE IS MY INVITATION p
I LET HIM GO l
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE d
BULLSHIT
GET TO THE CHOPPER c
HERE IS MY INVITATION c
GET UP 1
ENOUGH TALK
YOU HAVE NO RESPECT FOR LOGIC
GET TO THE CHOPPER l
HERE IS MY INVITATION l
GET DOWN 1
ENOUGH TALK
CHILL
I'LL BE BACK c
HASTA LA VISTA, BABY
IT'S SHOWTIME
HEY CHRISTMAS TREE p
YOU SET US UP 0
GET YOUR ASS TO MARS p
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
HEY CHRISTMAS TREE n
YOU SET US UP 0
GET YOUR ASS TO MARS n
DO IT NOW q p
HEY CHRISTMAS TREE g
YOU SET US UP 42
GET TO THE CHOPPER g
HERE IS MY INVITATION n
YOU ARE NOT YOU YOU ARE ME 2
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE g
GET TO THE CHOPPER p
HERE IS MY INVITATION p
GET UP 2
ENOUGH TALK
GET YOUR ASS TO MARS n
DO IT NOW q p
GET TO THE CHOPPER g
HERE IS MY INVITATION 5
LET OFF SOME STEAM BENNET n
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE g
TALK TO THE HAND "t"
BULLSHIT
TALK TO THE HAND "f"
YOU HAVE NO RESPECT FOR LOGIC
BULLSHIT
TALK TO THE HAND "f"
YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

Cobalah online!

(Ini adalah posting pertama saya di codegolf.SE, tolong beri tahu saya jika ini tidak diformat dengan benar. Saya menyadari jumlah byte ini tidak kompetitif, ini hanya untuk bersenang-senang.)

aras
sumber
5

Pyth, 10 byte

&P_Q>3lP+2

Cobalah online!

Bagaimana?

&P_Q>3lP+2  # input: Q
        +2  # Q + 2
       P    # prime factors
    >3l     # length lower than 3?
 P_Q        # Q is prime?
&           # and both results
Uriel
sumber
>. <Outgolfed>. <
Mr. Xcoder
@ Mr.Xcoder sebenarnya, saya memposting milik saya 5 menit sebelumnya
Uriel
Ya, tidak melihatnya karena koneksi internet yang buruk
Tn. Xcoder
3

Python dengan sympy ,  69  56 byte

-13 byte berkat alephalpha (dengan memutakhirkan ke sympy 1.1 dan gunakan primeomega(n+2)untuk mengganti sum(factorint(n+2).values()))

... mengambil alih dari pengajuan yang dihapus Gryphon.

from sympy import*
lambda n:primeomega(n+2)<3*isprime(n)

Fungsi yang tidak disebutkan namanya kembali Trueuntuk Chen primes dan Falsesebaliknya.

Menghitung faktor n+2dengan menjumlahkan banyaknya faktor prima.

Catatan yang 3dikalikan dengan isprime(n)sebelum <perbandingan dibuat, jadi untuk non-prime ntes kode jika n+2memiliki kurang dari 0faktor (selalu menghasilkan False), sedangkan untuk prime nmemeriksa apakah n+2prime atau semi-prime.

Jonathan Allan
sumber
@Gryphon - Saya mengambil alih, mungkin bisa dikalahkan tanpa impor.
Jonathan Allan
Saya sudah kalah besar! The 3*isprime(n)trick adalah apa yang saya cari dalam membersihkan pernyataan kondisional.
Chase Vogeli
Ah, @icosahedron, saya tidak memperhatikan milik Anda, maaf - ini sangat mirip saya hanya akan berkomentar untuk membantu Anda meningkatkan milik Anda. Jangan ragu untuk memperlakukan jawaban ini seperti itu, cukup beri tahu saya dan saya akan menghapus yang ini.
Jonathan Allan
Saya pikir sympy memiliki fungsi primeomega .
alephalpha
@alephalpha Terima kasih, baru saja ditingkatkan menjadi 1,1 untuk melihatnya, itu akan menghemat byte!
Jonathan Allan
3

Java 8, 85 84 83 byte

n->{int a=n+2,b=0,c=0,i=1;for(;i++<n;b+=n%i<1?1:0)c+=a%i<1?1:0;return n>1&b<2&c<3;}

-1 byte terima kasih kepada @ OlivierGrégoire dengan menggunakan pendekatan berulang bukan rekursif.

Penjelasan:

Coba di sini.

n->{            // Method with integer parameter and boolean return-type
  int a=n+2,    //  Start `a` at the input + 2
      b=0,c=0,  //  Start `b` and `c` at 0
      i=1;      //  Start `i` at 1
  for(;i++<n;   //  Loop from 1 to `n` (and raise `i` immediately by 1)
    b+=n%i<1?   //   If the input is divisible by `i`
        1       //    Raise `b` by 1
       :        //   Else:
        0)      //    Leave `b` as is
    c+=a%i<1?   //   If the input + 2 is divisible by `i`:
        1       //    Raise `c` by 1
       :        //   Else:
        0;      //    Leave `c` as is
                //  End of loop (implicit / single-line body)
  return n>1    //  Return if the input is larger than 1
         &b<2   //   And `b` is now smaller than 2
         &c<3;  //   And `c` is now smaller than 3
}               // End of method
Kevin Cruijssen
sumber
Versi berulang hanya byte lebih pendek: n->{int N=n+2,f=0,F=0,d=1;for(;d++<n;f+=n%d<1?1:0)F+=N%d<1?1:0;return n>1&f<2&F<3;}.
Olivier Grégoire
2

Mathematica, 28 byte

PrimeQ@#&&PrimeOmega[#+2]<3&
alephalpha
sumber
2

JavaScript (ES6), 63 61 byte

g=(e,i=e)=>i--<3?1:e%i?g(e,i):g(i)+1
f=e=>e>1&g(e)<2&g(e+2)<3
Test cases:<br><textarea id=i rows=6 oninput="go()">101&#10;223&#10;233&#10;1</textarea><br><pre id=q></pre><script>window.onload=function go(){document.getElementById('q').innerHTML=document.getElementById('i').value.split('\n').map(e=>e+' -> '+f(+e)).join('\n')}</script>

Menentukan fungsi fyang digunakan nsebagai argumen dan mengembalikan hasilnya. Saya sangat senang dengan ghasilnya; itu menghitung jumlah faktor prima dalam suatu angka.

2 byte menghemat berkat &trik Kevin Cruijssen .

Tidak disatukan

Ω = (n,          // Ω(n) = number of n's prime factors, n > 1.
    i = n) =>    // Start iterating from i = n - 1. Since we'll immediately
                 // decrement i, n is used here.
    --i          // Immediately decrement i.

    < 2          // If i = 0 or i = 1, n is a prime at this point.
    ? 1 :        // Therefore Ω(n) = 1.

    n % i != 0 ? // If n is not divisible by i,
    Ω(n, i)      // try again with i := i - 1 (immediately decremented, so use i).

    : Ω(i) + 1   // n is divisible by i. Since we're counting down from n - 1
                 // and i is the first such number, i is n's largest non-trivial
                 // divisor, and thus n/i is a prime.
                 // Therefore Ω(n) = Ω(i) + Ω(n/i) = Ω(i) + 1.

is_chen = n =>     // An integer n ≥ 1 is a Chen prime if and only if:
    n > 1          // n > 1,
    & Ω(n) < 2     // Ω(n) = 1 < 2, i.e. n is a prime, and
    & Ω(n + 2) < 3 // Ω(n + 2) < 3, i.e. n + 2 is a prime or a semiprime.
PurkkaKoodari
sumber
Tidak bisa Anda mengubah &&ke &? Karena 0/1 adalah nilai kebenaran / falsey di JS juga?
Kevin Cruijssen
@KevinCruijssen Sepertinya berhasil. Terlalu buruk |dan &tidak mengalami korsleting, yang mungkin menghemat lebih banyak byte g.
PurkkaKoodari
2

Japt , 22 20 19 13 12 byte

U°j ©2¨°Uk l
  • 6 byte disimpan berkat saran obarakon tentang metode yang berbeda.

Menguji

Shaggy
sumber
2

PHP, 64 byte

for($i=$n=$argn+2;--$i;$argn%$i?:$q++)$n%$i?:++$p;echo$p<4^--$q;

mencetak 0untuk truey, bilangan bulat lainnya untuk falsy. Jalankan sebagai pipa dengan -nRatau coba online .

kerusakan

for($i=$n=$argn+2;--$i; # loop $i from N+1 to 1
    $argn%$i?:$q++)         # if $i divides N, increment $q
    $n%$i?:++$p;            # if $i divides N+2, increment $p
echo$p<4                # $p is 1 for a prime, 3 for a semiprime
    ^--$q;              # $q is 2 for prime; so this is 1^1 (==0) for a Chen Prime

nilai falsy konsisten, 65 byte:

for($i=$n=2+$k=$argn;--$i;$k%$i?:$q++)$n%$i?:++$p;echo$p<4&$q==2;

cetakan 1untuk kebenaran dan 0kepalsuan.

Titus
sumber
1

Python 3 dengan SymPy, 73 71 byte

lambda n:(sum(factorint(n+2).values())<3)&isprime(n)
from sympy import*

Cobalah online!


Ini adalah versi yang lebih golf dari jawaban yang diposting di sini sebelumnya, tetapi sepertinya sudah dihapus.


Terima kasih kepada @JonathanAllan karena telah menghemat 2 byte!

Chase Vogeli
sumber
1
... juga perhatikan bahwa Anda tidak perlu f=, membuat fungsi tanpa nama tidak masalah untuk kode-golf.
Jonathan Allan
1

PHP , 87 byte

for($b=($a=$argn)+$i=2;2<$a+$b;)$a%$i?$b%$i?$i++:++$d*$b/=$i:++$c*$a/=$i;echo$c<2&$d<3;

Cobalah online!

PHP , 87 byte

for(;$n<2;)for($a=$argn+$n++*$i=2;1<$a;)$a%$i?$i++:++$r[$n]*$a/=$i;echo$r[1]<2&$r[2]<3;

Cobalah online!

Jörg Hülsermann
sumber
1

APL NARS, 23 karakter

{1≥⍵:0⋄(1=⍴π⍵)∧3>⍴π⍵+2}

Di sini π⍵ mengembalikan array faktor ⍵ berbeda dari 1; beberapa tes:

  f←{1≥⍵:0⋄(1=⍴π⍵)∧3>⍴π⍵+2}
  f 101
1 
  f 223
0 
  f 233
1 
  f 1
0
  f ¯10
0
RosLuP
sumber
1

Regex (ECMAScript), 31 byte

^(?!((xx+)(\2(xx))*)(\1\4)+$)xx

Cobalah online! (menunjukkan semua bilangan prima Chen ≤ 1000)

Diberikan string n x s regex ini akan cocok jika dan hanya jika n adalah prime Chen.

Ini menegaskan bahwa n lebih besar dari 2 dan bahwa string bukan dari bentuk. ((xx+)(\2(xx))*)(\1\4)+
Regex ini memiliki dua makna, tergantung pada berapa kali (\2(xx))diulang.
Ketika diulang 0 kali, regex dapat disederhanakan (xx+)\1+, yang cocok dengan angka komposit.
Ketika diulang beberapa kali positif, regex sama dengan((xx+)(\2xx)+)(\1xx)+

Regex itu membutuhkan penjelasan, namun, saya akan memberikan sedikit wawasan.
Jika Anda membaca aljabar, Anda menemukan ((xx+)(\2xx)+)(\1xx)+angka yang cocok dengan bentuk di a*b*c-2mana a≥4,b≥2,c≥2.
Jadi itu akan cocok (hampir) setiap kali n +2 memiliki lebih dari 2 faktor prima. (Yaitu bukan prime atau semi-prime)
Perhatikan bahwa itu tidak cocok dengan 6, 16 atau 25, tetapi ini tidak masalah, karena semuanya komposit.

Jadi (?!((xx+)(\2(xx))*)(\1\4)+$)akan cocok selama n tidak komposit, dan n +2 adalah prima atau semi-prima.
Sayangnya ini termasuk 1 (dan 0), jadi kami kemudian memeriksa bahwa n setidaknya 2 denganxx

Beberapa "31-byters" yang berbeda adalah:

^xx(?!((x*)(\2xx)+)\1?(\1xx)*$)
^(?!(xx((x*)(\3xx)+))\2?\1*$)xx
H.Piz
sumber
1

Ruby , 49 41 byte

->n{/^(.?|((..+)\3+))(\2+|..)$/!~?l*n+=2}

Cobalah online!

Terima kasih H.PWiz untuk -8 byte

Bagaimana?

Hal pertama, dapatkan string 'l'berulang n + 2 kali. Kemudian gunakan regex untuk memeriksa apakah:

  • Panjangnya 2 atau 3 (.?)(..)
  • Panjangnya adalah angka gabungan ditambah 2 ((..+)\1)(..)
  • Panjang adalah produk minimal 3 angka ((..+)\2)\1+

Bagian 2 regex menghasilkan case keempat yang tidak masuk akal dan aman untuk diabaikan (.?)\2+:, yang memutuskan untuk mengosongkan string atau karakter tunggal karena \2kosong.

GB
sumber
Anda dapat menggabungkan dua bagian dari Anda |bersama-sama lebih dekat: ^((..+)\2+)(\1+|..)$. Juga, kebetulan yang rapi bahwa Anda mencoba masalah ini dengan regex pada waktu yang sama dengan saya :)
H.PWiz
Saya percaya bahwa Anda dapat menggunakan .bukan .?karena input selalu setidaknya 1
H.PWiz
0

Julia, 59 byte

x->((0∉x%(2:x-1))&(length(find(x->x==0,(x+2)%(2:x)))<=2))
Tanj
sumber
0

Haskell , 163 byte

p k=last$(not$elem 0(map(mod k)[2..k-1])):[1>2|k<=1]
r=round
s n=p(r n)||any(\(a,b)->p(r a)&&p(r b))[(n/x,x)|x<-[2..n],n/x==(fromIntegral.r)n/x]
c n=p(r n)&&s(n+2)

Cobalah online!

bug
sumber