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


¿13 es un primo gemelo?
LiefdeWen

@LiefdeWen Sí, porque pertenece a la pareja (11, 13)
daniero

Respuestas:



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.

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


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

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


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)


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.


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


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

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

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, 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

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

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.


Hmm ... siento que [U+2U-2]podría ser mucho más corto, pero no puedo entender cómo ...
ETHproductions
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.