Encontre lacunas principais


27

Um intervalo primo é a diferença entre dois números primos consecutivos. Mais especificamente, se p e q são números primos com p < q e p 1, p 2, ..., q -1 não são números primos, o primos p e q definir um intervalo de n = q - p . Diz-se que a lacuna é iniciada por p e tem comprimento n .

Sabe-se que existem lacunas primárias arbitrariamente grandes. Ou seja, dado n , existe uma lacuna principal de comprimento n ou maior. No entanto, uma lacuna principal de comprimento exatamente n pode não existir (mas uma maior existir).

O desafio

Dado um número inteiro positivo n, produza o primeiro primo que inicia uma lacuna de comprimento nou maior.

Como exemplo, para entrada, 4a saída deve ser 7, porque 7 e 11 são os primeiros primos consecutivos que diferem em pelo menos 4 (as lacunas anteriores são 1, de 2 a 3; 2, de 3 a 5; e 2, de 5 para 7). Para entrada, 3a resposta também deve ser 7(não há lacunas no comprimento 3).

Regras adicionais

Casos de teste

Input -> Output

1        2
2        3
3        7
4        7
6        23
10       113
16       523
17       523
18       523
30       1327
50       19609
100      370261
200      20831323


Com pq você quer dizer qp certo?
Erik the Outgolfer

@EriktheOutgolfer Sim; corrigido, obrigado!
Luis Mendo


OEIS A002386 (Relacionado)
Stephen

Respostas:


3

Gaia , 6 bytes

zṅọ⊃∆ṇ

Isso é extremamente ineficiente (o 16caso de teste levou mais de uma hora para calcular na minha máquina).

Experimente online!

Explicação

A sequência parece ter a propriedade de que a (n) <= 2 ^ n .

z       Push 2^input.
 ṅ      Get the first 2^input prime numbers.
  ọ     Get the deltas of the list.
   ⊃∆   Find the index of the first that is greater than or equal to the input.
     ṇ  Push the index-th prime number.

9

Gelatina , 10, 9, 8 10 bytes

Æn_$:ð1#»2

Experimente online!

Dois bytes salvos graças ao @Dennis! (e depois adicionado novamente devido a casos extremos)

Explicação:

Æn          #   The next prime after 'P'
  _$        #   Minus 'P'
    :       #   Divided by 'N'
            #
            # This will give a falsy value unless the distance to the next prime is >= N
            #
     ð      # Treat all of that as a single dyad (fucntion with two arguments). 
            # We'll call it D(P, N)
            #
      1#    # Find the first 'P' where D(P, input()) is truthy
        »2  # Return the maximum of that result and 2

Sabemos com certeza que o resultado sempre será maior que ou igual à entrada? ( #contará a partir da entrada aqui) Parece razoável supor isso, mas eu não tenho idéia se é uma suposição válida. EDIT: FYI para correção (se necessário) prefixo
Jonathan Allan

5
O postulado de JonathanAllan Bertrand implica que a diferença de um primo é estritamente menor que o próprio primo.
Dennis3

@ Dennis brilhante muito obrigado! TMYK ...
Jonathan Allan

4

Mathematica, 30 bytes

2//.x_ /;NextPrime@x-x<#:>x+1&

Experimente online!

Mathematica, 35 bytes

(t=2;While[NextPrime@t-t<#,t++];t)&

Experimente online!

Mathematica, 77 bytes

Prime@Min@Position[s=Differences@Prime@Range[(r=#)^3+1],#&@@Select[s,#>=r&]]&

Inteligente inteligente ... você nem precisa ter certeza de ambos pe qsão primos ... O primeiro código parece inválido, embora, porque ele só vai até 65535, a menos que você alimenta explicitamente o argumento MaxIterations.
JungHwan Min

Além disso, -2 bytes para a versão de 35 bytes:(For[t=2,NextPrime@t-t<#,t++];t)&
JungHwan Min 4/08/17

4

Haskell , 106 102 93 77 73 72 bytes

Isso gera uma lista infinita de números primos primeiro, depois procura as lacunas primárias. A lista principal foi retirada daqui . Provavelmente pode ser encurtado, mas ainda não descobri como ainda :)

Obrigado a @BruceForte por -4 bytes e a @Zgrab por -1 byte!

f n=[x|(y,x)<-zip=<<tail$[n|n<-[2..],all((>0).rem n)[2..n-1]],y-x>=n]!!0

Experimente online!


Claro que há alguma magia mônada, obrigado :)
flawr

zip=<<tail$[...]salva um byte.
Zgarb 04/08/19

"Isso gera uma lista infinita de números primos primeiro, depois ...": bem, então nunca deveria acontecer? (ou seja, ele só vai acontecer depois de um tempo infinitamente longo, o tempo de "primeira geração" processualmente uma lista infinita de números primos)
Olivier Dulac

1
Haskell usa avaliação lenta, portanto, apenas o número de entradas dessa lista é gerado e o que é realmente usado. Portanto, esses números primos são gerados até o ponto em que realmente encontramos os pontos. Se você tentar isso você verá que para qualquer nele irá parar depois de uma quantidade finita de tempo :) (Haskell não é um procedimento, mas uma linguagem funcional com avaliação preguiçosa.)
flawr

1
Bem, é uma lista infinita, por definição, não tem fim. O que eu descrevi é exatamente o que está acontecendo nos intérpretes comuns, mas isso não é especificado como parte do idioma, então você não pode dizer isso!
flawr

3

Pitão - 14 bytes

Ele filtra de [1, inf), filtrando por primality ( P_) e que o próximo primo filtrado de (n, inf), tem um> = diferente para a entrada.

f&P_T<tQ-fP_Yh

Conjunto de Teste .


3

PowerShell , 97 96 91 bytes

param($n)for($a=$b=2){for(;'1'*++$b-match'^(?!(..+)\1+$)..'){if($b-$a-ge$n){$a;exit}$a=$b}}

Experimente online!

Pega entrada $n, define $ae $bigual a 2, depois entra em um forloop infinito . Lá dentro, continuamos $baté chegar ao próximo prime . Em seguida, verificamos se $b-$a(ou seja, a lacuna) é -greabertura eou não $n. Se for, nós produzimos $ae exit. Caso contrário, configuramos $apara ser, $bincrementar $be iniciar nossa próxima pesquisa.

Aviso: Isso é lento para entradas grandes. Na verdade, ele não pode concluir os 50testes ou mais altos dentro do tempo limite dos anos 60 no TIO. Ah bem.


3

Casca , 13 11 10 bytes

´ȯ!V≥⁰Ẋ-İp

Experimente online!

´       İp  -- with the primes
 ȯ!         -- get the value at position
      Ẋ-    -- where the difference of the current and next prime
   V≥⁰      -- is greater or equal than the input N

3

Mathematica, 39 bytes

(For[i=2;p=NextPrime,i+#>p@i,i=p@i];i)&
(* or *)
(For[i=1;p=Prime,p@i+++#>p@i,];p[i-1])&

Versão de 33 bytes (não é válida porque só chega ao 65535º prime)

p=NextPrime;2//.i_/;p@i-i<#:>p@i&



2

Mathematica, 37 bytes

gNestWhile[p=NextPrime,2,p@#-#<g&]

Functioncom o primeiro argumento g. Começando com 2, aplica a função p=NextPrimerepetidamente enquanto p@#-#<g&der True(a diferença entre o prime atual e o próximo prime é menor que g).


2

R + gmp, 55 bytes

Faz uso da função nextprime da biblioteca gmp

s=2;n=scan();while((x=gmp::nextprime(s))-s<n)s=x;cat(s)

Você precisa adicionar cat(s)no final. A impressão implícita não funciona em programas completos.
JAD


2

C = 141 109 bytes; C ++, D = 141 bytes; C #, Java = 143 bytes

AVISO : ALGORITMO DE BAIXO DESEMPENHO

Este código não conseguiu calcular o intervalo principal por g(200)10 minutos. Por g(100)10 segundos (versão C ++)

Versão C ++ e D:

int p(int d){for(int i=2;i<=d/2;++i){if(!(d%i))return 0;}return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do{++n;}while(!p(n));}return f;}

Versão C # e Java:

int p(int d){for(int i=2;i<=d/2;++i){if(d%i==0)return 0;}return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do{++n;}while(p(n)==0);}return f;}

Versão C, -32 bytes graças ao ceilingcat:

i;p(d){for(i=2;d/2/i;)if(!(d%i++))return 0;return 1;}f;n;g(d){for(f=2,n=3;n-f<d;)for(f=n;!p(++n););return f;}

Diferenças entre a versão C # / Java e C / C ++ / D: !p(n)<==>p(n)==0


Pode reverter return 0; return 1e remover o !anteriorp(++n)
tetocat

d%i==0e !(d%i)pode ser d%i<0. Além disso, utilizando o sistema de modelo D's a solução em D pode ser: T p(T)(T d){for(T i=2;i<=d/2;++i)if(d%i<1)return 0;return 1;}T g(T)(T d){T f=2,n=3;while(n-f<d){f=n;do++n;while(!p(n));}return f;. (A remoção de cintas após a forea dopode aplicar-se a C ++, bem)
Zachary

Publiquei a versão D separada, que utiliza truques específicos de D que não podem ser encontrados em C / C ++ / C # / Java.
Zacharý

int p(int d){for(int i=2;i<=d/2;++i)if(!(d%i))return 0;return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do++n;while(!p(n));}return f;}<- que deve funcionar para o C ++ versão
Zachary

2

D, 127 125 122 bytes

AVISO: ALGORITMO DE BAIXO DESEMPENHO !!

T p(T)(T d){T r;for(T i=2;i<=d/2;)r=d%i++<1||r;return r;}T g(T)(T d){T f=2,n=3;while(n-f<d){f=n;while(p(++n)){}}return f;}

Experimente online!

Quão?

HatsuPointerKun novamente, mas eu farei a feitiçaria específica de D.

  • O sistema de modelos pode inferir tipos T p(T)(T d)e é menor que C ++
  • r=d%i++<1||r, Travessuras específicas de D, podem funcionar em C / C ++, mas eu não sei.
  • p(++n), o mesmo que acima, não tenho certeza se funciona em C / C ++
  • while(p(++n)){}, aqui se vê por que D é ruim no golfe, não se pode usar ;como uma declaração vazia.

2

Perl 6 , 41 37 bytes

{+(1...(^$_+*)>>.is-prime eqv!<<^$_)}

Experimente online!

Explicação

{                                   }  # Block taking n as $_
   1...   # Sequence 1,2,... until
       (^$_+*)  # Range [i,i+n)
              >>.is-prime  # is-prime for each
                          eqv!<<^$_  # Equals (True,False,False,False,...)?
 +(                                )  # Length of sequence

1

QBIC , 28 bytes

{~µs||~s-r>=:|_Xr\r=s]]s=s+1

Explicação

{         DO
~µs||     IF s is prime THEN (note, s starts as 3)
~s-r>=:   IF the gap between s (current prime) and r (prev prime) is big enough
|_Xr      THEN QUIT, printing prev prime r
\r=s      ELSE (gap too small, but s is prime), set r to prime s
]]        END IF x2, leaving us in the WHILE
s=s+1     increment s, retest for primality ...

1

05AB1E , 9 bytes

∞<ØD¥I@Ïн

Experimente online ou verifique todos os casos de teste . (O Conjunto de Testes não contém os dois últimos casos de teste, porque o TIO atinge o tempo limite.)

Como a outra pergunta é encerrada como uma bobagem dessa , também estou postando minha resposta aqui.

Explicação:

           # Get an infinite list in the range [1, ...]
 <          # Decrease it by one to make it in the range [0, ...]
  Ø         # Get for each the (0-indexed) n'th prime: [2,3,5,7,11,...]
   D        # Duplicate this list of primes
    ¥       # Get all deltas (difference between each pair): [1,2,2,4,2,...]
     I@     # Check for each if they are larger than or equal to the input
            #  i.e. 4 → [0,0,0,1,0,1,0,1,1,0,...]
       Ï    # Only keep the truthy values of the prime-list
            #  → [23,31,47,53,61,...]
        н   # And keep only the first item (which is output implicitly)
            #  → 23

1

Java 8, 99 92 bytes

n->{int a=2,b=3,f,k;for(;b-a<n;)for(f=0,a=b;f<2;)for(f=++b,k=2;k<f;)f=f%k++<1?0:f;return a;}

Experimente online. (O maior caso de teste é excluído, porque o tempo limite é excedido no TIO.)

Explicação:

n->{               // Method with integer as both parameter and return-type
  int a=2,b=3,     //  Prime-pair `a,b`, starting at 2,3
      f,           //  Prime-checker flag `f`, starting uninitialized
      k;           //  Temp integer, starting uninitialized
  for(;b-a         //  Loop as long as the difference between the current pair of primes
          <n;)     //  is smaller than the input
    for(f=0,       //   (Re)set the prime-checker flag to 0
        a=b;       //   Replace `a` with `b`, since we're about to search for the next prime-pair
        f<2;)      //   Inner loop as long as the prime-checker flag is still 0 (or 1)
                   //   (which means the new `b` is not a prime)
      for(f=++b,   //    Increase `b` by 1 first, and set this value to the prime-checker flag
          k=2;     //    Set `k` to 2
          k<f;)    //    Inner loop as long as `k` is still smaller than the prime-checker flag
        f=         //     Change the prime-checker flag to:
          f%k++<1? //      If the prime-checker flag is divisible by `k`
           0       //       Set the prime-checker flag to 0
          :        //      Else:
           f;      //       Leave it unchanged
                   //    (If any integer `k` in the range [2, `b`) can evenly divide `b`,
                   //     the prime-checker flag becomes 0 and the loop stops)
  return a;}       //  And finally after all the nested loops, return `a` as result

1

Arrumado , 33 bytes

{x:({v:⊟v<=-x}↦primes+2)@0@0}

Experimente online!

Ou 28 caracteres / 34 bytes: {x:({v:⊟v≤-x}↦primes+2)@0@0}

Vou explicar isso usando um equivalente ASCII equivalente:

{x:({v:(-)over v<=-x}from primes+2)@0@0}
{x:                                    }    lambda w/ parameter `x`
                          primes+2          overlapping pairs of primes
                                            [[2, 3], [3, 5], [5, 7], ...]
    {v:             }from                   select prime pairs `v = [a, b]`...
       (-)over v                            ...where `a` - `b`...
                <=-x                        is <= `x`
   (                              )@0@0     select the first element of the first pair

1

APL (NARS), 36 caracteres, 72 bytes

∇r←h w;k
r←2
→0×⍳w≤r-⍨k←1πr⋄r←k⋄→2
∇

1π é a função "next prime"; teste:

  h¨1 2 3 4 6 10 16 17 18 30 50 100 200
2 3 7 7 23 113 523 523 523 1327 19609 370261 20831323  
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.