É um prime de Chen?


27

Um número é um primo Chen se satisfizer duas condições:

  • É primo em si
  • Em si, mais dois, é um primo ou um semi-primo.

Um primo é um número em que possui exatamente dois divisores e esses divisores consistem em si e um.

Um semi-primo é um número que é o produto de dois primos. (Observe que 12 = 2 * 2 * 3 não é semi-primo, mas 25 = 5 * 5 é).

Sua tarefa é determinar se um número é um primo Chen. Você deve gerar qualquer valor verdadeiro para yes e qualquer valor falso para no.

A entrada será qualquer número inteiro maior ou igual a um. Também pode ser tomado como uma sequência de caracteres, uma matriz de caracteres ou uma matriz ou dígitos.

Exemplos:

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

Este é o OEIS A109611 .

Isso é, em parte, inspirado em Sou uma prima da Sophie Germain? que, infelizmente, foi fechado como duplicado, então estou postando um desafio relacionado que não é duplicado.


Podemos retornar Truepor verdade e 2ou Falsepor falsidade (valores inconsistentes de falsidade)?
Mr. Xcoder

@ Mr.Xcoder Nunca disse que não podia
Okx

Para um semi-primo, "exatamente dois fatores primos" contam multiplicidade? É 2 * 2 * 2 * 3 * 3um semi-prime? Que tal 5 * 5?
Não uma árvore

@ Notatree 5*5é semi-prime, 2*2*2*3*3não é. Eu disse exatamente duas.
Okx

Então conta multiplicidade, então? (Você poderia argumentar que 2*2*2*3*3tem exatamente dois fatores primos, a saber, 2e 3, e 5*5tem um fator primo, a saber 5.) Talvez você possa editar isso na pergunta?
Não uma árvore

Respostas:


12

Braquilog , 7 bytes

ṗ+₂ḋl≤2

Experimente online!

Explicação

ṗ         Input is prime       
   ḋ      The prime factorization of…
 +₂       … Input + 2…
    l≤2   … has 2 or less elements

1
Eu peguei Neil com exatamente 48.000 repetições e agora você com exatamente 22.222: P
ETHproductions

11

05AB1E , 8 bytes

p¹ÌÒg3‹*

Experimente online!

Explicação

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 bytes

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

Experimente online!

(Este é o meu primeiro post no codegolf.SE, informe-nos se este estiver formatado incorretamente. Percebo que essa contagem de bytes não é competitiva, é apenas diversão.)



5

Pitão, 10 bytes

&P_Q>3lP+2

Experimente online!

Quão?

&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>. <
Sr. Xcoder 10/17/17

@ Mr.Xcoder na verdade, eu postei o meu 5 minutos antes
Uriel

Sim, não o vi por causa da falta de conexão com a Internet
Sr. Xcoder

3

Python com sympy ,  69  56 bytes

-13 bytes graças ao alephalpha (atualizando para o sympy 1.1 e usando primeomega(n+2)para substituir sum(factorint(n+2).values()))

... substituindo a submissão excluída do Gryphon.

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

Uma função sem nome retornando Truepara primos Chen e Falseoutros.

Conta os fatores n+2somando as multiplicidades de seus fatores primos.

Observe que 3é multiplicado por isprime(n)antes da <comparação, portanto, para não-prime, no código testa se n+2possui menos de 0fatores (sempre produzindo False), enquanto para o prime nverifica se n+2é primo ou semi-primo.


@ Gregry - eu assumi, pode ser superável sem quaisquer importações no entanto.
Jonathan Allan

Eu fui derrotado! O 3*isprime(n)truque é o que eu estava procurando na limpeza da declaração condicional.
Perseguição Vogeli

Ah, @icosahedron, eu não tinha notado o seu, desculpe - isso é tão parecido que eu teria comentado para ajudá-lo a melhorar o seu. Sinta-se à vontade para tratar esta resposta como tal, avise-me e excluiremos esta.
Jonathan Allan

Eu acho que o sympy tem uma função primeomega .
alephalpha

@alephalpha Obrigado, acabou de atualizar para 1.1 para vê-lo, isso economiza bytes!
111317 Jonathan Allan


3

Java 8, 85 84 83 bytes

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 bytes graças a @ OlivierGrégoire usando uma abordagem iterativa em vez de recursiva.

Explicação:

Experimente aqui.

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

A versão iterativa é apenas um byte menor: 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 bytes

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>

Define uma função fque aceita ncomo argumento e retorna o resultado. Estou muito feliz com o gresultado; conta o número de fatores primos em um número.

Economiza 2 bytes graças ao &truque de Kevin Cruijssen .

Ungolfed

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

Você não pode mudar ambos &&para &? Como 0/1 também são valores de verdade / falsey em JS?
21417 Kevin Kevin Kurtijssen

@KevinCruijssen Isso parece funcionar. Pena |e &não provoca um curto-circuito, que pode economizar ainda mais bytes g.
PurkkaKoodari

2

Japt , 22 20 19 13 12 bytes

U°j ©2¨°Uk l
  • 6 bytes salvos graças à sugestão de obarakon de um método diferente.

Teste-o


2

PHP, 64 bytes

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

imprime 0por verdade, outros números inteiros por falsidade. Execute como pipe -nRou experimente online .

demolir

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

valor falso consistente, 65 bytes:

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

imprime 1por verdade e 0por falsidade.


1

Python 3 com SymPy, 73 71 bytes

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

Experimente online!


Esta é uma versão mais detalhada de uma resposta postada aqui anteriormente, mas parece ter sido excluída.


Obrigado a @ JonathanAllan por salvar 2 bytes!


1
... observe também que você não precisa f=, criar uma função sem nome é bom para o código-golfe.
Jonathan Allan


1

APL NARS, 23 caracteres

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

Aqui π⍵ retorna a matriz de fatores de ⍵ diferente de 1; algum teste:

  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 bytes

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

Experimente online! (mostrando todos os primos de Chen ≤ 1000)

Dada uma sequência de n x s, esse regex corresponderá se e somente se n for um primo Chen.

Ele afirma que n é maior que 2 e que a sequência não tem a forma ((xx+)(\2(xx))*)(\1\4)+
Este regex tem dois significados, dependendo de quantas vezes (\2(xx))é repetido.
Quando é repetido 0 vezes, a regex pode ser simplificada para (xx+)\1+, o que corresponde aos números compostos.
Quando é repetido um número positivo de vezes, o regex é equivalente a((xx+)(\2xx)+)(\1xx)+

Esse regex requer alguma explicação, no entanto, fornecerei pouca percepção.
Se você percorrer a álgebra, encontrará que ((xx+)(\2xx)+)(\1xx)+corresponde aos números da forma em a*b*c-2que a≥4,b≥2,c≥2.
Portanto, ele corresponderá (quase) sempre que n +2 tiver mais de 2 fatores primos. (ou seja, nem prime nem semi-prime)
Observe que não corresponde a 6, 16 ou 25, mas isso não importa, porque todos são compostos.

Portanto (?!((xx+)(\2(xx))*)(\1\4)+$), corresponderá desde que n não seja composto e n +2 seja primo ou semi-primo.
Infelizmente, isso inclui 1 (e 0), então verificamos que n é pelo menos 2 comxx

Alguns "31 byters" diferentes são:

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

1

Ruby , 49 41 bytes

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

Experimente online!

Obrigado H.PWiz por -8 bytes

Quão?

Primeiro, obtenha uma sequência 'l'repetida de n + 2 vezes. Em seguida, aplique uma regex para verificar se:

  • O comprimento é 2 ou 3 (.?)(..)
  • Comprimento é um número composto mais 2 ((..+)\1)(..)
  • Comprimento é um produto de pelo menos três números ((..+)\2)\1+

As duas partes de regex geram um quarto caso que não faz sentido e é seguro ignorar (.?)\2+:, que resolve esvaziar uma string ou um único caractere porque \2está vazio.


Você pode mesclar as duas metades do seu |conjunto mais de perto: ^((..+)\2+)(\1+|..)$. Além disso, uma pura coincidência de que você tentou esse problema com o regex em um momento semelhante ao meu :)
H.PWiz 17/04

Eu acredito que você pode usar em .vez de, .?uma vez que a entrada é sempre pelo menos 1
H.PWiz

0

Julia, 59 bytes

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


0

Haskell , 163 bytes

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)

Experimente online!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.