Czy to prima Chen?


27

Liczba jest liczbą pierwszą Chen, jeśli spełnia dwa warunki:

  • Jest sam w sobie liczbą pierwszą
  • Sama plus dwa jest liczbą pierwszą lub półpierwszą.

Liczba pierwsza jest liczbą, w której ma dokładnie dwa dzielniki, a te dzielniki składają się z siebie i jednego.

Półpierwsza to liczba, która jest iloczynem dwóch liczb pierwszych. (Zauważ, że 12 = 2 * 2 * 3 nie jest półpierwsze, ale 25 = 5 * 5 to).

Twoim zadaniem jest ustalenie, czy liczba jest liczbą pierwszą Chena. Powinieneś wypisać dowolną prawdziwą wartość tak i każdą wartość fałszowania dla nie

Wejście będzie dowolną liczbą całkowitą większą lub równą jeden. Może być również traktowany jako ciąg znaków, tablica znaków lub tablica lub cyfry.

Przykłady:

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

To jest OEIS A109611 .

Jest to częściowo zainspirowane tym, czy Am I a Sophie Germain prime? który niestety został zamknięty jako duplikat, więc stawiam nieco powiązane wyzwanie, które nie jest duplikatem.


Czy możemy powrócić Truepo prawdę i / 2lub Falsefałsz (niespójne wartości fałszu)?
Pan Xcoder,

@ Mr.Xcoder Nigdy nie mówiłem, że nie możesz
Okx,

Czy w przypadku półpierwszej liczby „dokładnie dwa czynniki pierwsze” są liczone? Czy 2 * 2 * 2 * 3 * 3półpierwszy? Co 5 * 5?
Nie drzewo,

@Notatree 5*5jest półpierwszy , 2*2*2*3*3nie jest. Powiedziałem dokładnie dwa.
Okx,

A więc liczy się wielość? (Można argumentować, że 2*2*2*3*3ma dokładnie dwóch czynników, a mianowicie 2a 3, i 5*5ma jeden czynnik pierwszy, to znaczy 5). Być może można edytować, że na pytanie?
Nie drzewo,

Odpowiedzi:



11

05AB1E , 8 bajtów

p¹ÌÒg3‹*

Wypróbuj online!

Wyjaśnienie

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)

6

ArnoldC , 1339 bajtów

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

Wypróbuj online!

(To jest mój pierwszy post na codegolf.SE, proszę dać mi znać, jeśli jest źle sformatowany. Zdaję sobie sprawę, że ta liczba bajtów nie jest konkurencyjna, to tylko dla zabawy).



5

Pyth, 10 bajtów

&P_Q>3lP+2

Wypróbuj online!

W jaki sposób?

&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

>. <Outgolfed>. <
Mr. Xcoder

@ Mr.Xcoder, faktycznie, opublikowałem mój 5 minut wcześniej
Uriel,

Tak, nie widziałem tego z powodu słabego połączenia internetowego
Pan Xcoder

3

Python z sympy ,  69  56 bajtów

-13 bajtów dzięki alephalpha (poprzez uaktualnienie do sympy 1.1 i użycie primeomega(n+2)do zamiany sum(factorint(n+2).values()))

... przejmując usunięte zgłoszenie Gryphona.

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

Nienazwana funkcja powracająca Truedla liczb pierwszych Chen i Falseinnych.

Liczy czynniki n+2, sumując krotności jego współczynnika głównego.

Należy pamiętać, że 3jest mnożona przez isprime(n)zanim <dokonano porównania, więc dla non-prime ntestów kodu, jeśli n+2ma mniej niż 0czynników (zawsze przynoszących False), natomiast dla najlepszych nSprawdza czy n+2jest pierwsza lub semi-prime.


@Gryphon - przejęłam, ale może być do pokonania bez żadnego importu.
Jonathan Allan,

Zostałem rozegrany! 3*isprime(n)Sztuką jest to, czego szukałem w sprzątanie instrukcji warunkowej.
Chase Vogeli,

Ach, @icosahedron, nie zauważyłem twojego, przepraszam - to jest tak podobne, że właśnie skomentowałem, aby pomóc ci ulepszyć twoje. Potraktuj tę odpowiedź jako taką, daj mi znać, a ja ją usunę.
Jonathan Allan,

Myślę, że sympy ma funkcję primeomega .
alephalpha

@alephalpha Dzięki, właśnie zaktualizowałem do wersji 1.1, aby go zobaczyć, co pozwoli zaoszczędzić bajty!
Jonathan Allan,


3

Java 8, 85 84 83 bajtów

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 bajty dzięki @ OlivierGrégoire przy użyciu iteracyjnego podejścia zamiast rekurencyjnego.

Wyjaśnienie:

Wypróbuj tutaj.

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

Wersja iteracyjny jest tylko bajt krócej: 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

JavaScript (ES6), 63 61 bajtów

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>

Definiuje funkcję, fktóra przyjmuje njako argument i zwraca wynik. Jestem bardzo zadowolony z tego, jak się gokazało; zlicza liczbę czynników pierwszych w liczbie.

Oszczędność 2 bajtów dzięki sztuczce Kevina Cruijssena &.

Nie golfił

Ω = (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.

Nie możesz zmienić obu &&na &? Ponieważ 0/1 są również wartościami prawda / falsey w JS?
Kevin Cruijssen

@KevinCruijssen To wydaje się działać. Szkoda |i &nie powoduje zwarcia, co może zaoszczędzić jeszcze więcej bajtów g.
PurkkaKoodari,


2

PHP, 64 bajty

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

drukuje 0dla prawdy, inne liczby całkowite dla fałszu. Uruchom jako potok z -nRlub spróbuj online .

awaria

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

spójna wartość falsy, 65 bajtów:

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

odciski 1dla prawdy i 0fałszu.


1

Python 3 z SymPy, 73 71 bajtów

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

Wypróbuj online!


To jest bardziej golfowa wersja odpowiedzi opublikowanej tutaj wcześniej, ale wygląda na to, że została usunięta.


Dzięki @JonathanAllan za zapisanie 2 bajtów!


1
... zauważ również, że nie potrzebujesz f=, tworzenie nienazwanej funkcji jest dobre dla golfa kodowego.
Jonathan Allan,


1

APL NARS, 23 znaki

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

Tutaj π⍵ zwraca tablicę czynników ⍵ różnych od 1; jakiś test:

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

1

Regex (ECMAScript), 31 bajtów

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

Wypróbuj online! (pokazuje wszystkie liczby pierwsze Chen ≤ 1000)

Biorąc pod uwagę ciąg n x s To wyrażenie regularne dopasuje tylko wtedy, gdy n jest liczbą pierwszą Chen.

Zapewnia, że n jest większe niż 2 i że łańcuch nie ma postaci. ((xx+)(\2(xx))*)(\1\4)+
Wyrażenie regularne ma dwa znaczenia, w zależności od tego, ile razy (\2(xx))się powtarza.
Gdy powtórzy się 0 razy, wyrażenie regularne można uprościć (xx+)\1+, co odpowiada liczbom złożonym.
Kiedy powtórzy się dodatnią liczbę razy, wyrażenie regularne jest równoważne z((xx+)(\2xx)+)(\1xx)+

To wyrażenie regularne wymaga pewnych wyjaśnień, jednak nie zapewniam wglądu.
Jeśli przejdziesz przez algebrę, okazuje się, że ((xx+)(\2xx)+)(\1xx)+pasuje do liczb formularza a*b*c-2gdzie a≥4,b≥2,c≥2.
Będzie więc pasował (prawie), gdy n +2 ma więcej niż 2 czynniki pierwsze. (tzn. ani pierwsza, ani półpierwsza)
Zauważ, że nie pasuje do 6, 16 lub 25, ale to nie ma znaczenia, ponieważ wszystkie są złożone.

(?!((xx+)(\2(xx))*)(\1\4)+$)Będzie więc pasować, dopóki n nie jest złożone, a n +2 jest liczbą pierwszą lub półpierwszą.
Niestety obejmuje to 1 (i 0), więc sprawdzamy, czy n wynosi co najmniej 2 zxx

Kilka różnych „31 bajtów” to:

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

1

Rubinowy , 49 41 bajtów

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

Wypróbuj online!

Dzięki H.PWiz za -8 bajtów

W jaki sposób?

Po pierwsze, uzyskaj ciąg 'l'powtarzanych n + 2 razy. Następnie zastosuj wyrażenie regularne, aby sprawdzić, czy:

  • Długość wynosi 2 lub 3 (.?)(..)
  • Długość to liczba złożona plus 2 ((..+)\1)(..)
  • Długość jest iloczynem co najmniej 3 liczb ((..+)\2)\1+

Dwie części wyrażenia regularnego generują czwarty przypadek, który nie ma sensu i można go bezpiecznie zignorować (.?)\2+:, który rozwiązuje puste ciąg lub pojedynczy znak, ponieważ \2jest pusty.


Można połączyć dwie połówki swojej |bliżej siebie: ^((..+)\2+)(\1+|..)$. Zgrabny zbieg okoliczności, że próbowałeś tego problemu z wyrażeniem regularnym w podobnym czasie do mnie :)
H.PWiz

Uważam, że możesz użyć .zamiast, .?ponieważ dane wejściowe wynoszą zawsze co najmniej 1
H.PWiz

0

Julia, 59 bajtów

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


0

Haskell , 163 bajty

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)

Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.