Primos cubanos


20

Dado un número natural , devuelve el -ésimo primer cubano .nn

Primos cubanos

Un primo cubano es un número primo de la forma

p=x3y3xy

donde yy>0x=1+y o x=2+y

Detalles

  • Puede usar indexación basada en 0 o 1, lo que más le convenga.
  • Puede devolver la n -ésima prima dado el índice n o los primeros n primos en orden creciente, o alternativamente puede devolver una lista / generador infinito que produce los primos en orden creciente.

Casos de prueba

Los primeros términos son los siguientes:

(#1-13)   7, 13, 19, 37, 61, 109, 127, 193, 271, 331, 397, 433, 547,
(#14-24) 631, 769, 919, 1201, 1453, 1657, 1801, 1951, 2029, 2269, 2437,
(#25-34) 2791, 3169, 3469, 3571, 3889, 4219, 4447, 4801, 5167, 5419,
(#35-43) 6211, 7057, 7351, 8269, 9241, 10093, 10267, 11719, 12097,
(#44-52) 12289, 13267, 13669, 13873, 16651, 18253, 19441, 19927, 20173

Se pueden encontrar más términos en OEIS: se dividen en dos secuencias, dependiendo de si x=1+y o x=2+y : A002407 y A002648


2
¿Podemos devolver los primeros n primos no ordenados?
J42161217

@ J42161217 No, los números primos deben estar en orden creciente.
flawr

Respuestas:


23

JavaScript (V8) , 54 bytes

Un programa completo que imprime primos cubanos para siempre.

for(x=0;;){for(k=N=~(3/4*++x*x);N%++k;);~k||print(-N)}

Pruébalo en línea!

NB: a menos que tenga papel infinito en su impresora, no intente ejecutar esto en la consola de su navegador , donde print()puede tener un significado diferente.


JavaScript (ES6),  63 61 60  59 bytes

Devuelve el n -ésimo primer cubano, 1-indexados.

f=(n,x)=>(p=k=>N%++k?p(k):n-=!~k)(N=~(3/4*x*x))?f(n,-~x):-N

Pruébalo en línea!

¿Cómo?

Esto se basa en el hecho de que los primos cubanos son primos de la forma:

pn=3n24+1,n3

La fórmula anterior se puede escribir como:

pn={3n2+14 if n is odd3n2+44 if n is even

o para cualquier y>0 :

p2y+1=3(2y+1)2+14=3y2+3y+1
p2y+2=3(2y+2)2+44=3y2+6y+4

que es x3y3xy parax=y+1yx=y+2respectivamente.


7

05AB1E , 16 12 9 bytes

Genera una lista infinita.
Guardado 4 bytes con la fórmula del puerto de Arnaulds de Kevin Cruijssen .
Ahorró otros 3 bytes gracias a Grimy

∞n3*4÷>ʒp

Pruébalo en línea!

Explicación

∞          # on the list of infinite positive integers
 n3*4÷>    # calculate (3*N^2)//4+1 for each
       ʒp  # and filter to only keep primes

Has escrito un error tipográfico en tu explicación: " poner una copia N^2+3en la pila " debería ser 3*N^2. Además, ¿por qué en )lugar de ¯? ¿Porque es más fácil escribir? Y por alguna razón tengo la sensación de que NnN‚3*¬sO‚puede ser 1 byte más corto, pero no lo veo. Una ligera alternativa de igual byte es Nn3*DN3*+‚. Pero probablemente solo estoy viendo cosas que no están allí ...;) Buena respuesta, entonces +1 de mi parte.
Kevin Cruijssen

1
En realidad intenté transferir mi respuesta a 05AB1E, pero fallé miserablemente. : D
Arnauld

1
En realidad, generar una lista infinita es más conveniente: 9 bytes con ∞n3 * 4 ÷> ʒp
Grimmy

1
OK, no estoy acostumbrado a las especificaciones que se contradicen. :-)
WGroleau

66
@WGroleau Supongo que nunca has desarrollado software profesionalmente entonces. Me preocupa más cuando obtengo especificaciones que no se contradicen.
MikeTheLiar

7

R , 75 73 bytes

n=scan()
while(F<n)F=F+any(!(((T<-T+1)*1:4-1)/3)^.5%%1)*all(T%%(3:T-1))
T

Pruébalo en línea!

-2 bytes al notar que puedo eliminar corchetes si lo uso en *lugar de &(precedencia diferente).

Salidas del nprimer primo cubano (1 indexado).

Utiliza el hecho (dado en OEIS) de que los primos cubanos tienen la forma p=1+3n2 o 4p=1+3n2 para algunos n , es decir, n=ap13 es un número entero paraa=1oa=4.

El truco es que ningún primo puede tener la forma 2p=1+3n2 o 3p=1+3n2 (*), por lo que podemos ahorrar 2 bytes al verificar la fórmula para a{1,2,3,4} ( 1:4) en lugar de a{1,4} ( c(1,4)).

Versión del código levemente no golfed:

# F and T are implicitly initialized at 0 and 1
# F is number of Cuban primes found so far
# T is number currently being tested for being a Cuban prime
n = scan()                       # input
while(F<n){
  T = T+1                        # increment T 
  F = F +                        # increment F if
    (!all(((T*1:4-1)/3)^.5 %% 1) # there is an integer of the form sqrt(((T*a)-1)/3)
     & all(T%%(3:T-1)))          # and T is prime (not divisible by any number between 2 and T-1)
  }
T                                # output T

3p=1+3n21=3(pn2)3

p=22p=1+3n2nn=2k+12p=4+12k(k+1)p=2+6k(k+1)p


¿Qué hay de evitar un bucle usando un límite superior en el enésimo primer cubano?
Xi'an

@ Xi'an Pensé en eso, pero no pude llegar a tal límite. ¿Tienes uno?
Robin Ryder

5

Wolfram Language (Mathematica) , 66 65 56 bytes

(f=1+⌊3#/4#⌋&;For[n=i=0,i<#,PrimeQ@f@++n&&i++];f@n)&

Pruébalo en línea!

  • J42161217 -1 utilizando en ⌊ ⌋lugar deFloor[ ]

  • attinat

    • -1 mediante el uso de en ⌊3#/4#⌋lugar de⌊3#^2/4⌋
    • -8 para en For[n=i=0,i<#,PrimeQ@f@++n&&i++]lugar den=2;i=#;While[i>0,i-=Boole@PrimeQ@f@++n]

1
65 bytes . Bienvenido a ppcg. Buena primera respuesta! +1
J42161217

¡Gracias! (Mucho tiempo al acecho.) No pude analizar su respuesta existente, así que escribí la mía y salió un poco más corta. También podría hacer una Python.
Speedstyle


@attinat Pensé que la fórmula de Arnauld solo funcionaba para n> 2, así que no comencé con 0, aunque, como en su ejemplo, funciona para todos n (porque comienza 1 1 4 7 13 ... así que los números primos son 7 13. ..)
speedstyle

3

Java 8, 94 88 86 84 bytes

v->{for(int i=3,n,x;;System.out.print(x<1?++n+" ":""))for(x=n=i*i++*3/4;~n%x--<0;);}

-6 bytes usando el primer corrector Java de @SaraJ , ¡así que asegúrate de votarla!
-2 bytes gracias a @ OlivierGrégoire . Como el primer número que verificamos es 7, podemos eliminar el seguimiento %ndel primer verificador de Sara, que es para terminar el ciclo n=1.
-2 bytes gracias a @ OlivierGrégoire al portar la respuesta de @Arnauld .

Salidas delimitadas por espacios indefinidamente.

Pruébalo en línea.

Explicación (de la versión anterior de 86 bytes): TODO: explicación de la actualización

pn=3n24+1,n3

v->{                     // Method with empty unused parameter and no return-type
  for(int i=3,           //  Loop-integer, starting at 3
          n,x            //  Temp integers
      ;                  //  Loop indefinitely:
      ;                  //    After every iteration:
       System.out.print( //     Print:
        n==x?            //      If `n` equals `x`, which means `n` is a prime:
         n+" "           //       Print `n` with a space delimiter
        :                //      Else:
         ""))            //       Print nothing
    for(n=i*i++*3/4+1,   //   Set `n` to `(3*i^2)//4+1
                         //   (and increase `i` by 1 afterwards with `i++`)
        x=1;             //   Set `x` to 1
        n%++x            //   Loop as long as `n` modulo `x+1`
                         //   (after we've first increased `x` by 1 with `++x`)
             >0;);}      //   is not 0 yet
                         //   (if `n` is equal to `x`, it means it's a prime)

Realmente no creo que sea factible, pero otra forma de encontrar los primos cubanos usa esta fórmula: ¿ v->{for(int n=7,i=3,p,x,d,r=0;;i+=++r%2*3,n+=i,System.out.print(x>1?x+" ":""))for(x=n,d=1;++d<n;x=x%d<1?0:n);}tal vez alguien puede usar esto para jugar golf? No pude
Olivier Grégoire

1
@ OlivierGrégoire Puedes jugar un poco más al golf eliminando los no utilizados ,py cambiando i+=++r%2*3,n+=ia n+=i+=++r%2*3, pero aún así terminaré en 106 bytes. Uso de Java 11 de String#repeatla prime-expresión regular es de 105 bytes: v->{for(int n=7,i=3,r=0;;n+=i+=++r%2*3)if(!"x".repeat(n).matches(".?|(..+?)\\1+"))System.out.println(n);}.
Kevin Cruijssen

Sí, supuse que no era mucho golfable a pesar de mis errores (ahora obvios). Gracias por llevarlo;)
Olivier Grégoire

@ OlivierGrégoire Quizás también sea bueno saberlo por usted, pero aparentemente hay un ciclo de verificación principal más corto en Java. Vea mi edición y la respuesta de verificación de SaraJ.
Kevin Cruijssen

Puede que me equivoque, pero lo último %nno es obligatorio, ¿verdad?
Olivier Grégoire




1

Espacio en blanco , 180 bytes

[S S S T    S N
_Push_2][S N
S _Duplicate][N
S S N
_Create_Label_OUTER_LOOP][S N
N
_Discard_top_stack][S S S T N
_Push_1][T  S S S _Add][S N
S _Duplicate][S N
S _Duplicate][T S S N
_Multiply][S S S T  T   N
_Push_3][T  S S N
_Multiply][S S S T  S S N
_Push_4][T  S T S _Integer_divide][S S S T  N
_Push_1][T  S S S _Add][S S S T N
_Push_1][S N
S _Duplicate_1][N
S S S N
_Create_Label_INNER_LOOP][S N
N
_Discard_top_stack][S S S T N
_Push_1][T  S S S _Add][S N
S _Duplicate][S N
S _Duplicate][S T   S S T   T   N
_Copy_0-based_3rd][T    S S T   _Subtract][N
T   S T N
_Jump_to_Label_PRINT_if_0][S T  S S T   S N
_Copy_0-based_2nd][S N
T   _Swap_top_two][T    S T T   _Modulo][S N
S _Duplicate][N
T   S S S N
_Jump_to_Label_FALSE_if_0][N
S N
S N
_Jump_to_Label_INNER_LOOP][N
S S T   N
_Create_Label_PRINT][T  N
S T _Print_as_integer][S S S T  S T S N
_Push_10_(newline)][T   N
S S _Print_as_character][S N
S _Duplicate][N
S S S S N
_Create_Label_FALSE][S N
N
_Discard_top_stack][S N
N
_Discard_top_stack][N
S N
N
_Jump_to_Label_OUTER_LOOP]

Se agregaron letras S(espacio), T(tabulación) y N(nueva línea) solo como resaltado.
[..._some_action]agregado solo como explicación.

Salidas delimitadas por nueva línea indefinidamente.

Pruébelo en línea (solo con espacios en bruto, pestañas y nuevas líneas).

Explicación en pseudocódigo:

pn=3n24+1,n3

Integer i = 2
Start OUTER_LOOP:
  i = i + 1
  Integer n = i*i*3//4+1
  Integer x = 1
  Start INNER_LOOP:
    x = x + 1
    If(x == n):
      Call function PRINT
    If(n % x == 0):
      Go to next iteration of OUTER_LOOP
    Go to next iteration of INNER_LOOP

function PRINT:
  Print integer n
  Print character '\n'
  Go to next iteration of OUTER_LOOP

1

Python 3 , 110 108 102 bytes

Método similar a mi respuesta de Mathematica (es decir isPrime(1+⌊¾n²⌋) else n++) usando este corrector principal de golf y devolviendo un generador anónimo infinito

from itertools import*
(x for x in map(lambda n:1+3*n**2//4,count(2)) if all(x%j for j in range(2,x)))

Pruébalo en línea!

  • mypetlion -2 porque posiblemente los generadores anónimos están más permitidos que los nombrados
  • -6 comenzando counten 2 +1 para que el and x>1verificador principal que tomé prestado sea innecesario -7

La respuesta que entra en una variable generalmente no se considera una forma válida de "salida". ¿Podría reelaborar su respuesta para que el resultado sea enviado a stdout o devuelto por una función?
mypetlion

1
Como las funciones anónimas están permitidas, y el desafío permite explícitamente un generador infinito, he eliminado g=. En primer lugar, solo lo había incluido porque permitía una visualización rápida en TIO con print(next(g) for i in range(52)).
speedstyle



1

Python 3 , 83 bytes

imprime los primos cubanos para siempre.

P=k=1
while 1:P*=k*k;x=k;k+=1;P%k>0==((x/3)**.5%1)*((x/3+.25)**.5%1-.5)and print(k)

Pruébalo en línea!

x=1+yx=2+y

p=(1+y)3y3(1+y)y=1+3y+3y2y=12±14+p13

p=(2+y)3y3(1+y)y=4+6y+3y2y=1±p13
y±1


1

Perl 6 , 33 31 bytes

-2 bytes gracias a Grimy

{grep &is-prime,1+|¾*$++²xx*}

Pruébalo en línea!

Bloque de código anónimo que devuelve una lista infinita perezosa de primos cubanos. Utiliza la fórmula de Arnauld para generar posibles primos cubanos y luego &is-primefiltrarlos.

Explicación:

{                           }  # Anonymous code block
 grep &is-prime,               # Filter the primes from
                         xx*   # The infinite list
                   ¾*          # Of three quarters
                     $++²      # Of an increasing number squared
                1+|            # Add one by ORing with 1

1
1+0+|puede ser justo1+|
Grimmy


0

APL (NARS), 98 caracteres, 196 bytes

r←h w;y;c;v
r←c←y←0⋄→4
→3×⍳∼0πv←1+3×y×1+y+←1⋄r←v⋄→0×⍳w≤c+←1
→2×⍳∼0πv+←3×y+1⋄c+←1⋄r←v
→2×⍳w>c

sangrado:

r←h w;y;c;v
r←c←y←0⋄→4
    →3×⍳∼0πv←1+3×y×1+y+←1⋄r←v⋄→0×⍳w≤c+←1
    →2×⍳∼0πv+←3×y+1⋄c+←1⋄r←v
    →2×⍳w>c

prueba:

  h ¨1..20
7 13 19 37 61 109 127 193 271 331 397 433 547 631 769 919 1201 1453 1657 1801 
  h 1000
25789873
  h 10000
4765143511

se basa en: si y en N, un posible Prime cubano es

S1=1+3y(y+1)

el próximo posible primer cubano será

S2=3(y+1)+S1
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.