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!


13 é um gêmeo nobre?
LiefdeWen

@LiefdeWen Sim, porque pertence ao par (11, 13) #
daniero

Respostas:



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.

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) .


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

1
Use em ÌIÍ‚vez de 40SÍ+-1 byte
Datboi



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


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)


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.


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


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

16 bytes com3>0#.@p:0 2 _2&+
milhas

@miles nice. uso muito inteligente da base 2 para processar os resultados.
Jonah



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


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

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;}

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

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.


Hmm ... Eu sinto que [U+2U-2]poderia ser muito mais curto, mas eu não consigo descobrir como ...
ETHproductions
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.