Lista de primos de Sophie Germain


10

La pregunta

Una prima de Sophie Germain es una prima p tal que 2p + 1 también es prima. Por ejemplo, 11 es un primo de Sophie Germain porque 23 también es primo. Escriba el programa más corto para calcular los números primos de Sophie Germain en orden ascendente

Reglas

  • Los primos de Sophie Germain deben ser generados por su programa, no desde una fuente externa.
  • Su programa debe calcular todos los primos de Sophie Germain bajo 2³²-1
  • Debe imprimir cada primer Sophie Germain distinto que encuentre su programa.
  • La persona con la puntuación más baja gana

Puntuación

  • 2 puntos por byte de su código
  • -10 si puede mostrar una prima generada por su programa mayor que 2³²-1

Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Martin Ender

Respuestas:


4

CJam

Para 17 caracteres obtenemos una enumeración completa de hasta 2 ^ 32:

G8#,{_mp*2*)mp},`

Para 4 caracteres más, obtenemos un rango lo suficientemente grande como para incluir un SG prime mayor que 2 ^ 32:

G8#K_*+,{_mp*2*)mp},`

desde 4294967681 = 2 ^ 32 + 385 <2 ^ 32 + 400.

Por supuesto, también podríamos extender el rango de forma gratuita como

C9#,{_mp*2*)mp},`

Esto significa que puede enviarlo sin la bonificación por 17 caracteres o con la bonificación por 21 caracteres
Meow Mix

@ user3502615, o con la bonificación por 17 caracteres. Aunque es discutible si la lista SG Prime I fue realmente generada "por mi programa", ya que no tengo una computadora lo suficientemente potente como para ejecutarla tan lejos.
Peter Taylor

I,se trata Icomo un entero de 32 bits con signo, por lo que el valor máximo para Ies 2 ** 31 - 1.
Dennis

2
@ Dennis, ¿es una propiedad documentada del lenguaje o un capricho de implementación de la implementación de Java?
Peter Taylor

No está documentado, pero el comportamiento es consistente tanto para Java como para el intérprete en línea.
Dennis

3

Pyth, 19 bytes * 2-10 = 28

Tenga en cuenta que el compilador / ejecutor en línea no muestra resultados porque es un bucle infinito.

K1#~K1I&!tPK!tPhyKK

Explicado:

K1                      K=1
  #                     While true:
   ~K1                  K+=1
      I                 If
       &                logical AND
        !tPK            K is prime
            !tPhyK      2*K+1 is prime (y is double, h is +1)
                  K     Print K

PZno devuelve un valor verdadero o falso. Devuelve la factorización prima de Z. La prueba de prima es !tPZ, que comprueba si la factorización prima solo contiene un factor.
Jakube

Si. Ahora funciona. !tPerrores 0y 1ser primo, ya que su factorización prima solo contiene 1 factor. La solución fácil es reemplazar todo Zpor Ky asignar K2al principio.
Jakube

Algunos otros campos de golf: asigne en K1lugar de K2e intercambie el if y el incremento. De esta manera puedes eliminar el ). Y +1*K2es lo mismo que hyK.
Jakube

Ah, acababa de leer sobre eso en la página del tutorial. ¿ Funciona
mbomb007

El compilador en línea no muestra un resultado, porque el programa está atrapado en un bucle infinito. Y el sitio web muestra solo resultados, una vez que finaliza el programa. He probado el código usando el compilador fuera de línea. Funciona.
Jakube

1

Pyth - 2 * 16 bytes - 10 = 22

Utiliza el método habitual de comprobación primaria en Pyth con el !tPy lo aplica tanto al número como a su primo seguro, con un pequeño truco para verificar ambos a la vez. Sube 10^10, así que voy por la bonificación.

f!+tPTtPhyTr2^TT

Explicación próximamente.

f          r2^TT     Filter from 2 till 10^10
 !                   Logical not to detect empty lists
  +                  List concatenation
   tP                All but the firs element of the prime factorization
    T                The filter element
   tP                All but the firs element of the prime factorization
    hyT              2n+1

Pruebe menos de 1000 en línea .


1
Esto requiere una máquina con aproximadamente 40 GB de memoria RAM. Bastante eficiente ;-)
Jakube

No creo que pueda reclamar el - 10 a menos que haya ejecutado correctamente el código.
orlp

@orlp no, le pregunté a OP y dijo que reducir el rango y simular todo el programa sería suficiente: chat.stackexchange.com/transcript/message/21585393#21585393
Maltysen

1
#include<stdio.h>
#include<math.h>

int isprime(int);
int main(){
    int check,n,secondcheck;
    printf("enter how long you want to print\n");
    scanf("%d",&n);
    for(int i=2;i<n;i++){
        check = isprime(i);
        if(check==0){
        secondcheck = isprime(2*i+1);
        if(secondcheck==0){
        printf("%d\t",i);
        }
        else
        continue;
        }
    }
}
int isprime(int num){   
    int check = num,flag=0;
     num = sqrt(num);
    for(int i=2;i<=num;i++){
        if(check%i==0){
            flag=1;
            return 1;
        }
    }
    if(flag==0){
        return 0;
    }
}

3
Considere jugar golf en su programa (eliminando espacio, etc.) y vea hasta dónde puede llegar.
Mhmd

0

CJam, 34 (2 * 22-10)

C9#{ImpI2*)mp&{Ip}&}fI

Imprime todos los primos de Sophie Germain debajo 12 ** 9, que incluye 4294967681 > 2 ** 32.

Calculo que esto llevará aproximadamente 8 horas en mi máquina. Lo ejecutaré esta noche.


0

Haskell, 2 * 54-10 = 98 132

i a=all((>0).rem a)[2..a-1]
p=[n|n<-[2..],i n,i$2*n+1]

iEs un primer cheque. ptoma todos los números ndonde ambos ny 2*x+1son primos. pEs una lista infinita.

Editar: mejor manera de verificar si 2*n+1es primo.


0

Julia, 2 * 49-10 = 88

p=primes(2^33)
print(p[map(n->isprime(2n+1),p)])

Los imprime en formato de lista, [2,3,5,11,...]. Si ese formato, usar la primesfunción o esperar hasta que se realice todo el cálculo para imprimir, no es aceptable, esto los imprime uno por línea mientras se ejecuta.

isprime=f
for i=1:2^33;f(i)&&f(2i+1)&&println(i)end

Es un poco más largo, 52 caracteres. Ambos calculan todos los primos de Sophie Germain 2^33, por lo que deberían obtener el descuento de 10 puntos.


0

Python 3, 124 123 bytes

i=3
q=[2]
while 1:
 p=1
 for x in range(2,round(i**.5)+1):p=min(p,i%x)
 if p:
  q+=[i];s=(i-1)/2
  if s in q:print(s)
 i+=2

¿Como funciona?

i=3                                 # Start at 3
q=[2]                               # Create list with first prime (2), to be list of primes.
while 1:                            # Loop forever
 p=1                                # Set p to 1 (true)
 for x in range(2,round(i**0.5)+1): # Loop from 2 to the number's square root. x is the loop value
     p=min(p,i%x)                   # Set p to the min of itself and the modulo of
                                    # the number being tested and loop value (x).
                                    # If p is 0 at the end, a modulo was 0, so it isn't prime.
 if p:                              # Check if p is 0
  q+=[i]                            # Add the current number (we know is prime) to list of primes (q)
  s=(i-1)/2                         # Generate s, the number that you would double and add 1 to make a prime.

  if s in q:print(s)                # If (i-1)/2 is a prime (in the list), then that prime satifies
                                    # the condition 2p+1 is prime because i is 2p+1, and i is prime
 i+=2                               # Increment by 2 (no even numbers are prime, except 2)

Pruébelo en línea aquí .


Mi computadora dice que ha generado 0.023283% de todos los primos de Sophie Germain por debajo de 2 ^ 32.

Cuando termine, lo publicaré en pastebin si hay suficientes líneas. Puedes usarlo para verificar que los tienes todos.


.5es más corto que0.5
mbomb007

0

Perl, 2 * 57-10 = 104

use ntheory":all";forprimes{say if is_prime(2*$_+1)}2**33

2
3
5
11
...
8589934091
8589934271

42 segundos a 2 ^ 32, 1m26s a 2 ^ 33. Se ejecutará un 50% más rápido si 2*$_+1está escrito como 1+$_<<1pero es un byte más.

El módulo también se instala primes.ply tiene muchos filtros, incluido uno para los primos de Sophie-Germain. Entonces: primes.pl --so 2**33(20 bytes)


0

Rubí, 61 * 2-10 = 112

require'prime';Prime.each(1.0/0)do|n|p Prime.prime?(n*2+1)end

Llevaría una eternidad imprimir todos los valores hasta 2 ** 32

Editar

Afeitado unos pocos bytes sustituyendo Float :: INFINITY por 1.0 / 0


0

PARI / GP, 46 * 2-10 = 82

forprime(p=2,2^33,if(isprime(2*p+1),print(p)))
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.