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
Luis Mendo
fonte
Related
Luis Mendo
Com pq você quer dizer qp certo?
Erik the Outgolfer
@EriktheOutgolfer Sim; corrigido, obrigado!
Luis Mendo
OEIS A104138
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.
Gato de negócios
fonte
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
DJMcMayhem
fonte
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&]]&
J42161217
fonte
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!

flawr
fonte
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 .

Maltysen
fonte
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.

AdmBorkBork
fonte
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
ბიმო
fonte
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&
JungHwan Min
fonte
2

Python 2 , 96 88 bytes

- 8 bytes Graças a @Maltysen

n,p,r=input(),3,[2]
while p-r[-1]<n:r+=[p]*all(p%i for i in range(2,p));p+=1
print r[-1]

Experimente online!

officialaimm
fonte
1
salvou um monte de bytes: repl.it/JwBe
Maltysen
2

Perl 6 , 63 bytes

->\d{(grep &is-prime,^∞).rotor(2=>-1).first({-d>=[-] $_})[0]}

Experimente online!

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

ngenisis
fonte
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)
MickyT
fonte
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

HatsuPointerKun
fonte
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.
Zacharý
fonte
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
Nwellnhof
fonte
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 ...
steenbergh
fonte
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
Kevin Cruijssen
fonte
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
Kevin Cruijssen
fonte
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
Conor O'Brien
fonte
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  
RosLuP
fonte