¿Tengo un primer gemelo?

23

Un número entero es primo si y solo si es positivo y tiene exactamente 2 divisores distintos: 1 y él mismo. Un par primo gemelo está hecho de dos elementos: py p±2, ambos son primos.

Se le dará un entero positivo como entrada. Su tarea es devolver un verdadero / falso dependiendo de si el entero dado pertenece a un par gemelo, siguiendo las reglas estándar de (los valores deben ser consistentes).

Casos de prueba

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

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

Este es el , por lo que gana el código más corto en bytes.

Taylor Scott
fuente
¿13 es un primo gemelo?
LiefdeWen
@LiefdeWen Sí, porque pertenece a la pareja (11, 13)
daniero

Respuestas:

18

Brachylog , 9 8 bytes

ṗ∧4√;?+ṗ

Pruébalo en línea!

Explicación

ṗ           Input is prime
 ∧          And
  4√        A number whose square is 4 (i.e. -2 or 2)
    ;?+     That number + the Input…
       ṗ    …is prime
Fatalizar
fuente
2
Vencer a Jelly y atar 05AB1E, agradable
Stephen
3
Uso inteligente ! +1
Erik the Outgolfer
11

Jalea , 10 9 bytes

%6+_2_ÆP⁺

Pruébalo en línea!

Fondo

Con la excepción de (3, 5) , todos los pares primos gemelos tienen la forma (6k - 1, 6k + 1) .

Dado que (6k - 1) + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 y
(6k + 1) + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 , dada una entrada n> 3 , es suficiente verificar si n y n + n% 6 - 3 son primos.

Esta fórmula pasa a trabajo para n = 3 , así, como 3 + 3% 6 - 3 = 3 es primo y 3 es un primo gemelo.

Cómo 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
fuente
7

Python 3 , 53 bytes

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

Pruébalo en línea!

Fondo

Todos los enteros toman una de las siguientes formas, con el entero k : 6k - 3 , 6k - 2 , 6k - 1 , 6k , 6k + 1 , 6k + 2 .

Como 6k - 2 , 6k y 6k + 2 son todos pares, y dado que 6k - 3 es divisible por 3 , todos los primos, excepto 2 y 3, deben tener la forma 6k - 1 o 6k + 1 . Dado que la diferencia de un par primo gemelo es 2 , con la excepción de (3, 5) , todos los pares primos gemelos son de la forma (6k - 1, 6k + 1) .

Sea n de la forma 6k ± 1 .

  • Si n = 6k -1 , entonces n + n% 6 - 3 = 6k - 1 + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 .

  • Si n = 6k + 1 , entonces n + n% 6 - 3 = 6k + 1 + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 .

Por lo tanto, si n es parte de un par primo gemelo y n ≠ 3 , su gemelo será n + n% 6 - 3 .

Cómo funciona

Python no tiene una prueba de primalidad incorporada. Si bien hay formas breves de probar un número único para primalidad, hacerlo para dos números sería largo. Vamos a trabajar con divisores en su lugar.

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

cuenta cuántos enteros k en el intervalo [2, 4n) se dividen (n + n% 6 - 3) n de manera uniforme, es decir, cuenta el número de divisores de (n + n% 6 - 3) n en el intervalo [2 , 4n) . Afirmamos que este conteo es 2 si y solo si n es parte de un par primo gemelo.

  • Si n = 3 (un primo gemelo), (n + n% 6 - 3) n = 3 (3 + 3 - 3) = 9 tiene dos divisores ( 3 y 9 ) en [2, 12) .

  • Si n> 3 es un primo gemelo, como se vio antes, m: = n + n% 6 - 3 es su gemelo. En este caso, mn tiene exactamente cuatro divisores: 1, m, n, mn .

    Desde n> 3 , tenemos m> 4 , por lo que 4n <mn y exactamente dos divisores ( m y n de la caída) en el intervalo [2, 4 N) .

  • Si n = 1 , entonces (n + n% 6 - 3) n = 1 + 1 - 3 = -1 no tiene divisores en [2, 4) .

  • Si n = 2 , entonces (n + n% 6 - 3) n = 2 (2 + 2 - 3) = 2 tiene un divisor (en sí) en [2, 8) .

  • Si n = 4 , entonces (n + n% 6 - 3) n = 4 (4 + 4 - 3) = 20 tiene cuatro divisores ( 2 , 4 , 5 y 10 ) en [2, 16) .

  • Si n> 4 es par, 2 , n / 2 , y n todo brecha n y, por lo tanto, (n + n% 6 - 3) n . Tenemos n / 2> 2 desde n> 4 , por lo que hay al menos tres divisores en [2, 4n) .

  • Si n = 9 , entonces (n + n% 6 - 3) n = 9 (9 + 3 - 3) = 81 tiene tres divisores ( 3 , 9 y 21 ) en [2, 36) .

  • Si n> 9 es un múltiplo de 3 , a continuación, 3 , n / 3 , y n todo brecha n y, por lo tanto, (n + n% 6 - 3) n . Tenemos n / 3> 3 desde n> 9 , por lo que hay al menos tres divisores en [2, 4n) .

  • Por último, si n = 6k ± 1> 4 no es un número primo gemelo, o bien n o m: = n + n% 6 - 3 debe ser de material compuesto y, por tanto, admiten un divisor adecuado d> 1 .

    Desde ya sea n = m + 2 o m = n + 2 y n, m> 4 , los enteros d , m , y n son distintos divisores de mn . Además, m <n + 3 <4n ya que n> 1 , entonces mn tiene al menos tres divisores en [2, 4n) .

Dennis
fuente
Guau. Tal código corto y, sin embargo, tantos casos especiales que debe manejar correctamente. ¿Alguna razón por la que dices Python 3? Por lo que puedo decir, también funciona en Python 2.
kasperd
Sí, esto funcionará igual de bien en Python 2. El 3 es parte de la publicación SE autogenerada de TIO.
Dennis
5

05AB1E , 10 9 bytes

Guardado 1 byte gracias a Datboi

ÌIÍ‚pZIp*

Pruébalo en línea! o como un conjunto de pruebas

Explicación

Ì           # push input+2
 IÍ         # push input-2
   ‚        # pair
    p       # isPrime
     Z      # max
      Ip    # push isPrime(input)
        *   # multiply
Emigna
fuente
1
Usar en ÌIÍ‚lugar de 40SÍ+por -1 byte
Datboi
3

MATL , 11 bytes

HOht_v+ZpAa

La salida es 0o 1.

Pruébalo en línea!

Explicación

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
fuente
3

Pyth , 14 12 11 bytes

&P_QP-3+%Q6

Banco de pruebas.


Se guardaron 3 bytes usando la fórmula en la respuesta de @Dennis. Guardado 1 byte gracias a @Dennis.


Pyth , 14 bytes * Solución inicial

&|P_ttQP_hhQP_

Banco de pruebas.

Sr. Xcoder
fuente
2

Retina , 45 44 bytes

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

1<`1¶1

Devuelve 1 si la entrada es un primo doble, de lo contrario 0

Pruébalo en línea!

Explicación

.*              
$*

Convertir a unario

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

Ponga n-2, n y n + 2 en sus propias líneas

m`^(11+)\1+$   

(Nueva línea final) Eliminar todos los compuestos mayores que 1

1<`1¶1          

Compruebe si hay dos primos consecutivos (o 1,3 porque 3 es un primo doble)

PunPun1000
fuente
2

Perl 6 , 24 bytes

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

Pruébalo en línea!

*es el argumento de esta función anónima. 0 & (-2 | 2)es la unión que consiste en los números 0Y o -2OR 2. Sumar *a esta unión produce la unión del número *Y cualquiera de los números * - 2OR * + 2. Llamar al is-primemétodo en esta unión devuelve un valor verdadero si *es primo Y bien * - 2O * + 2son primos. Finalmente, ?colapsa la unión verdadera a un valor booleano, satisfaciendo la condición de valores de retorno consistentes.

Sean
fuente
2

JavaScript, 91 bytes , 81 bytes gracias 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))

Explicación

pindica si el número dado nes primo o no, y tprueba el número dado ny n±2.

Ejemplo

Serge K.
fuente
No necesita los varparéntesis nen la definición de la función, etc.
Jared Smith
Creo que podría editar su fragmento para mostrar el valor nal lado del valor de t(n)para mayor claridad (por ejemplo 7: true)
Taylor Scott
1
Gracias a los dos
Serge K.
1

J, 23 bytes

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

Pruébalo en línea!

¿cómo?

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
Jonás
fuente
16 bytes con3>0#.@p:0 2 _2&+
millas
@miles agradable. Uso muy inteligente de la base 2 para procesar los resultados.
Jonás
1

Ruby, 38 + 6 = 44 bytes

Requiere opciones -rprime.

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

Pruébalo en línea!

daniero
fuente
1
Puede guardar un byte usando en &lugar 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
fuente
1

Excel VBA, 102100 bytes

Sin incorporaciones de primalidad para VBA :(

Código

Función de ventana inmediata anónima de VBE que toma la entrada de la celda [A1]y emite 1(verdadero) o 0(falso) a la ventana Inmediato de VBE

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

Función auxiliar

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

Alternativamente, 122 bytes

Código

Solución basada en la función de comprobación de primitivas recursivas

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

Función 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
fuente
0

PHP, 85 bytes 24 bytes gracias 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
fuente
Esto se puede jugar considerablemente cambiando los nombres de ambas funciones a 1 carácter cada una (por ejemplo, ay b)
Skidsdev
2
¿PHP ya no necesita la functionpalabra clave?
Tito
0

Japt , 13 bytes

j ©[U+2U-2]dj

Devuelve truey falsesi el número es o no parte de un par gemelo primo.

Pruébalo en línea!

Explicación

Implícito: U= entero de entrada

j ©

Compruebe si la entrada es primo ( j), Y ( ©) ...

[U+2U-2]dj

Usando la matriz [U+2, U-2], verifique si algún elemento es verdadero ( d) de acuerdo con la función de primalidad ( j).

Salida implícita del resultado booleano de is input prime AND is any ±2 neighbor prime.

Justin Mariner
fuente
Hmm ... siento que [U+2U-2]podría ser mucho más corto, pero no puedo entender cómo ...
ETHproductions