Lista de primos de Sophie Germain


10

A questão

Um primo de Sophie Germain é um primo p tal que 2p + 1 também é primo. Por exemplo, 11 é primo da Sophie Germain porque 23 também é primo. Escreva o programa mais curto para calcular os números primos de Sophie Germain em ordem crescente

Regras

  • Os números primos da Sophie Germain devem ser gerados pelo seu programa, não a partir de uma fonte externa.
  • Seu programa deve calcular todos os números primos de Sophie Germain abaixo de 2³²-1
  • Você deve imprimir cada prime Sophie Germain distinto encontrado pelo seu programa.
  • A pessoa com a pontuação mais baixa ganha

Pontuação

  • 2 pontos por byte do seu código
  • -10 se você puder mostrar um prime gerado pelo seu programa maior que 2³²-1

Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Martin Ender

Respostas:


4

CJam

Para 17 caracteres, obtemos uma enumeração completa de até 2 ^ 32:

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

Para 4 caracteres a mais, temos um intervalo grande o suficiente para incluir um SG prime maior que 2 ^ 32:

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

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

Obviamente, poderíamos igualmente estender o alcance gratuitamente,

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

Isto significa que você pode enviá-lo sem o bônus para 17 caracteres ou com o bônus de 21 caracteres
Meow Mix

@ user3502615 ou com o bônus para 17 caracteres. Embora seja discutível se a lista SG prime I foi realmente gerada "pelo meu programa", uma vez que não tenho um computador poderoso o suficiente para executá-la tão longe.
Peter Taylor

I,trata Icomo um inteiro assinado de 32 bits, portanto o valor máximo para Ié 2 ** 31 - 1.
Dennis

2
@Dennis, isso é uma propriedade documentada da linguagem ou uma peculiaridade da implementação da implementação em Java?
Peter Taylor

Não está documentado, mas o comportamento é consistente para o interpretador Java e o online.
Dennis

3

Pitão, 19 bytes * 2 - 10 = 28

Observe que o compilador / executor online não mostra a saída porque é um loop 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

PZnão retorna um valor verdadeiro ou falso. Retorna a fatoração principal de Z. O teste de prime é !tPZ, que verifica se a fatoração de prime contém apenas um fator.
Jakube

Sim. Agora funciona. !tPerros 0e 1ser primordial, pois sua fatoração principal contém apenas 1 fator. Reparo fácil é substituir todos Zpor Ke atribuir K2no início.
Jakube

Alguns outros campos de golfe: atribua em K1vez de K2e troque o if e o incremento. Dessa forma, você pode remover o ). E +1*K2é a mesma coisa que hyK.
Jakube

Ah, eu tinha acabado de ler sobre aqueles na página do tutorial. Será que funciona para você no pyth.herokuapp.com/?code=K2%23I%26!tPK!tPhyKK)~K1&debug=0
mbomb007

O compilador online não mostra um resultado, porque o programa está preso em um loop infinito. E o site mostra apenas a saída, após o término do programa. Testei o código usando o compilador offline. Funciona.
Jakube

1

Pitão - 2 * 16 bytes - 10 = 22

Usa o método usual de verificação primária no Pyth com oe !tPaplica-o ao número e ao seu início seguro, com um pequeno truque para verificar os dois ao mesmo tempo. Sobe 10^10, então eu estou indo para o bônus.

f!+tPTtPhyTr2^TT

Explicação em breve.

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

Experimente abaixo de 1000 online .


11
Isso requer uma máquina com cerca de 40 GB de memória RAM. Muito eficiente ;-)
Jakube

Eu não acho que você pode reivindicar o - 10, a menos que tenha executado o código com êxito?
orlp

@orlp não, eu perguntei OP e ele disse tornando o intervalo menor e simulando o programa inteiro seria 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
Por favor, considere jogar golfe no seu programa (removendo o espaço ..etc) e veja até onde você pode chegar.
Mhmd 22/09/2015

0

CJam, 34 (2 * 22 - 10)

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

Imprime todos os números primos de Sophie Germain abaixo 12 ** 9, o que inclui 4294967681 > 2 ** 32.

Eu estimo que isso levará aproximadamente 8 horas na minha máquina. Eu vou correr esta noite.


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]

ié um cheque nobre. ppega todos os números nonde ambos ne 2*x+1são primos. pé uma lista infinita.

Edit: melhor maneira de verificar se 2*n+1é prime.


0

Julia, 2 * 49 - 10 = 88

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

Imprime-os em formato de lista [2,3,5,11,...],. Se esse formato, usando a primesfunção, ou aguardando até que todo o cálculo seja feito para impressão não seja aceitável, ele será impresso um por linha enquanto é executado.

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

É um pouco mais, 52 caracteres. Ambos calculam todos os primos da Sophie Germain 2^33, então devem receber o desconto de 10 pontos.


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)

Experimente online aqui .


Meu computador diz que gerou 0,023283% de todos os números primos de Sophie Germain abaixo de 2 ^ 32.

Quando terminar, publicarei no pastebin se houver linhas suficientes. Você pode usá-lo para verificar se possui todos.


.5é mais curto 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 para 2 ^ 32, 1m26s para 2 ^ 33. Será executado 50% mais rápido se 2*$_+1for escrito como 1+$_<<1mas é mais um byte.

O módulo também instala primes.plvários filtros, incluindo um para primos Sophie-Germain. Então: primes.pl --so 2**33(20 bytes)


0

Ruby, 61 * 2 - 10 = 112

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

Levaria uma eternidade para imprimir todos os valores até 2 ** 32

Editar

Raspou alguns bytes substituindo 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)))
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.