Eu tenho um gêmeo nobre?

23

Um inteiro é primo se, e somente se, for positivo e tiver exatamente 2 divisores distintos: 1 e ele próprio. Um par primo gêmeo é composto de dois elementos: pe p±2, ambos são primos.

Você receberá um número inteiro positivo como entrada. Sua tarefa é retornar uma verdade / falsidade, dependendo de o número inteiro pertencer a um par duplo, seguindo as regras padrão (os valores precisam ser consistentes).

Casos de teste

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

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

Isso é , então o código mais curto em bytes vence!

Taylor Scott
fonte
13 é um gêmeo nobre?
LiefdeWen
@LiefdeWen Sim, porque pertence ao par (11, 13) #
daniero

Respostas:

18

Braquilog , 9 8 bytes

ṗ∧4√;?+ṗ

Experimente online!

Explicação

ṗ           Input is prime
 ∧          And
  4√        A number whose square is 4 (i.e. -2 or 2)
    ;?+     That number + the Input…
       ṗ    …is prime
Fatalizar
fonte
2
Batendo Jelly e amarrando 05AB1E, agradável
Stephen
3
Uso inteligente ! +1
Erik the Outgolfer
11

Geléia , 10 9 bytes

%6+_2_ÆP⁺

Experimente online!

fundo

Com exceção de (3, 5) , todos os pares primos gêmeos têm a forma (6k - 1, 6k + 1) .

Como (6k - 1) + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 e
(6k + 1) + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 , dada uma entrada n> 3 , é suficiente verificar se n e n + n% 6 - 3 são primos.

Esta fórmula acontece para trabalho para n = 3 , bem como, como 3 + 3% 6-3 = 3 é primo e 3 é um número primo duplo.

Como funciona

%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.
Dennis
fonte
7

Python 3 , 53 bytes

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

Experimente online!

fundo

Todos os números inteiros assumem uma das seguintes formas, com o número k : 6k - 3 , 6k - 2 , 6k - 1 , 6k , 6k + 1 , 6k + 2 .

Como 6k - 2 , 6k e 6k + 2 são todos pares e como 6k - 3 é divisível por 3 , todos os números primos, exceto 2 e 3, devem ter a forma 6k - 1 ou 6k + 1 . Como a diferença de um par primo gêmeo é 2 , com exceção de (3, 5) , todos os pares primos gêmeos têm a forma (6k - 1, 6k + 1) .

Seja n da forma 6k ± 1 .

  • Se n = 6k -1 , então n + n% 6 - 3 = 6k - 1 + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 .

  • Se n = 6k + 1 , então n + n% 6 - 3 = 6k + 1 + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 .

Assim, se n faz parte de um par primo gêmeo en ≠ 3 , seu gêmeo será n + n% 6 - 3 .

Como funciona

O Python não possui um teste de primalidade interno. Embora existam maneiras breves de testar um único número de primalidade, fazê-lo para dois números seria demorado. Em vez disso, vamos trabalhar com divisores.

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

conta quantos inteiros k no intervalo [2, 4n) dividem (n + n% 6 - 3) n uniformemente, ou seja, contam o número de divisores de (n + n% 6 - 3) n no intervalo [2 , 4n) . Afirmamos que essa contagem é 2 se e somente se n fizer parte de um par primo gêmeo.

  • Se n = 3 (um primo duplo), (n + n% 6 - 3) n = 3 (3 + 3 - 3) = 9 tem dois divisores ( 3 e 9 ) em [2, 12) .

  • Se n> 3 é um primo gêmeo, como visto anteriormente, m: = n + n% 6 - 3 é seu gêmeo. Nesse caso, mn possui exatamente quatro divisores: 1, m, n, mn .

    Como n> 3 , temos m> 4 , então 4n <mn e exatamente dois divisores ( m e n ) caem no intervalo [2, 4n) .

  • Se n = 1 , então (n + n% 6 - 3) n = 1 + 1 - 3 = -1 não tem divisores em [2, 4) .

  • Se n = 2 , então (n + n% 6 - 3) n = 2 (2 + 2 - 3) = 2 possui um divisor (ele mesmo) em [2, 8) .

  • Se n = 4 , então (n + n% 6 - 3) n = 4 (4 + 4-3) = 20 possui quatro divisores ( 2 , 4 , 5 e 10 ) em [2, 16) .

  • Se n> 4 for par, 2 , n / 2 e n todos dividirão n e, portanto, (n + n% 6 - 3) n . Como temos n / 2> 2 desde n> 4 , há pelo menos três divisores em [2, 4n) .

  • Se n = 9 , então (n + n% 6 - 3) n = 9 (9 + 3 - 3) = 81 possui três divisores ( 3 , 9 e 21 ) em [2, 36) .

  • Se n> 9 é um múltiplo de 3 , 3 , n / 3 e n dividem n e, portanto, (n + n% 6 - 3) n . Como temos n / 3> 3 desde n> 9 , há pelo menos três divisores em [2, 4n) .

  • Finalmente, se n = 6k ± 1> 4 não é um primo duplo, n ou m: = n + n% 6 - 3 deve ser composto e, portanto, admitir um divisor adequado d> 1 .

    Uma vez que ambos os n = m + 2 ou m = n + 2 e n, m> 4 , os números inteiros de d , m , e n são distintos divisores de MN . Além disso, m <n + 3 <4n desde n> 1 , então mn tem pelo menos três divisores em [2, 4n) .

Dennis
fonte
Uau. Esse código curto e, no entanto, tantos casos especiais que ele deve lidar corretamente. Algum motivo para você dizer Python 3? Tanto quanto eu posso dizer que também trabalha em Python 2.
kasperd
Sim, isso também funcionará no Python 2. O 3 faz parte da postagem SE gerada automaticamente pelo TIO.
Dennis
5

05AB1E , 10 9 bytes

Guardado 1 byte graças a Datboi

ÌIÍ‚pZIp*

Experimente online! ou como um conjunto de testes

Explicação

Ì           # push input+2
 IÍ         # push input-2
   ‚        # pair
    p       # isPrime
     Z      # max
      Ip    # push isPrime(input)
        *   # multiply
Emigna
fonte
1
Use em ÌIÍ‚vez de 40SÍ+-1 byte
Datboi
3

Mathematica, 33 bytes

(P=PrimeQ;P@#&&(P[#+2]||P[#-2]))&

Experimente online!

J42161217
fonte
3

MATL , 11 bytes

HOht_v+ZpAa

A saída é 0ou 1.

Experimente online!

Explicação

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
Luis Mendo
fonte
3

Pitão , 14 12 11 bytes

&P_QP-3+%Q6

Suíte de teste.


Economizou 3 bytes usando a fórmula na resposta de @Dennis '. Guardou 1 byte graças a @Dennis.


Pitão , 14 bytes * Solução inicial

&|P_ttQP_hhQP_

Suíte de teste.

Mr. Xcoder
fonte
2

Retina , 45 44 bytes

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

1<`1¶1

Retorna 1 se a entrada for um gêmeo primo, 0 caso contrário

Experimente online!

Explicação

.*              
$*

Converter em Unário

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

Coloque n-2, n e n + 2 em suas próprias linhas

m`^(11+)\1+$   

(Nova linha à direita) Remova todos os compostos maiores que 1

1<`1¶1          

Verifique se existem dois primos consecutivos (ou 1,3, porque 3 é um primo duplo)

PunPun1000
fonte
2

Perl 6 , 24 bytes

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

Experimente online!

*é o argumento para essa função anônima. 0 & (-2 | 2)é a junção que consiste nos números 0AND ou -2OR 2. Adicionar *a essa junção produz a junção do número *E qualquer um dos números * - 2OR * + 2. Chamar o is-primemétodo nessa junção retorna um valor verdadeiro se *for primo E ou * - 2OR * + 2for primo. Finalmente, o ?colapso da junção verdade para um valor booleano, satisfazendo a condição de valores de retorno consistentes.

Sean
fonte
2

JavaScript, 91 bytes , 81 bytes graças a 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))

Explicação

pinforma se o número fornecido né primo ou não e ttesta o número ne n±2.

Exemplo

Serge K.
fonte
Você não precisa de var, os parênteses em torno da ndefinição de função etc.
Jared Smith
Eu acho que você poderia editar o seu trecho para mostrar o valor de nlado o valor de t(n)para maior clareza (Ex. 7: true)
Taylor Scott
1
Thx para vocês dois
Serge K.
1

J, 23 bytes

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

Experimente online!

quão?

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
Jonah
fonte
16 bytes com3>0#.@p:0 2 _2&+
milhas
@miles nice. uso muito inteligente da base 2 para processar os resultados.
Jonah
1

Ruby, 38 + 6 = 44 bytes

Requer opções -rprime.

->n{n.prime?&[n-2,n+2].any?(&:prime?)}

Experimente online!

daniero
fonte
1
Você pode salvar um byte usando &em vez de&&
Piccolo
1

JavaScript (ES6), 54 bytes

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

Austin
fonte
1

Excel VBA, 102 100 bytes

Sem built-ins de primalidade para VBA :(

Código

Função de janela imediata VBE anônima que recebe entrada da célula [A1]e gera 1(verdade) ou 0(falsy) para a janela Imediata do VBE

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

Função auxiliar

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

Como alternativa, 122 bytes

Código

Solução baseada em função de verificação recursiva de primalidade

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

Função auxiliar

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

PHP, 85 bytes 24 bytes graças a Mayube

e($n){return f($n)&&((f($n-2)||f($n+2)))
f($n){for($i=$n;--$i&&$n%$i;)return $i==1;}
jahly
fonte
Isto pode ser golfed consideravelmente, alterando os nomes de ambas as funções a 1 de caracteres cada (por exemplo, ae b)
Skidsdev
2
O PHP não precisa mais da functionpalavra - chave?
Titus
0

Python 2 , 75 bytes

lambda x:p(x)*(p(x-2)|p(x+2))
p=lambda z:(z>1)*all(z%i for i in range(2,z))

Experimente online!

officialaimm
fonte
0

Japonês , 13 bytes

j ©[U+2U-2]dj

Retorna truee falsese o número faz ou não parte de um par gêmeo principal.

Experimente online!

Explicação

Implícito: U= número inteiro de entrada

j ©

Verifique se a entrada é prime ( j), AND ( ©) ...

[U+2U-2]dj

Usando a matriz [U+2, U-2], verifique se algum item é verdadeiro ( d) de acordo com a função de primalidade (j ).

Saída implícita do resultado booleano de is input prime AND is any ±2 neighbor prime.

Justin Mariner
fonte
Hmm ... Eu sinto que [U+2U-2]poderia ser muito mais curto, mas eu não consigo descobrir como ...
ETHproductions