Znajdź główne luki

27

Pierwsza szczelina jest różnica pomiędzy kolejnymi liczbami pierwszymi. Mówiąc dokładniej, jeśli p i q są liczbami pierwszymi z p < q i p +1, p +2, ..., q −1 nie są liczbami pierwszymi, liczby pierwsze p i q określają lukę n = q - p . Mówi się, że szczelina zaczyna się od p i ma długość n .

Wiadomo, że istnieją arbitralnie duże luki główne. To znaczy, biorąc pod uwagę n , istnieje pierwsza przerwa o długości n lub większa. Jednak pierwsza szczelina długości dokładnie n może nie istnieć (ale większa będzie).

Wyzwanie

Biorąc pod uwagę dodatnią liczbę całkowitą n, wypisz pierwszą liczbę pierwszą, która rozpoczyna przerwę o długości nlub większej.

Jako przykład 4należy podać dane wyjściowe 7, ponieważ 7 i 11 to pierwsze kolejne liczby pierwsze, które różnią się co najmniej o 4 (poprzednie przerwy to 1, od 2 do 3; 2, od 3 do 5; i 2, od 5 do 7). W przypadku danych wejściowych 3odpowiedź powinna również brzmieć 7(nie ma przerw o długości 3).

Zasady dodatkowe

  • Algorytm powinien teoretycznie działać na dowolnie wysoki n. W praktyce dopuszczalne jest, jeśli program jest ograniczony czasem, pamięcią lub wielkością typu danych.

  • Dane wejściowe i wyjściowe można przyjmować dowolnymi rozsądnymi środkami .

  • Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione.

  • Najkrótszy kod w bajtach wygrywa.

Przypadki testowe

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
źródło
Powiązane
Luis Mendo
Przez pq masz na myśli qp, prawda?
Erik the Outgolfer
@EriktheOutgolfer Tak; poprawione, dzięki!
Luis Mendo,
OEIS A104138
Luis Mendo
OEIS A002386 (powiązane)
Stephen

Odpowiedzi:

3

Gaia , 6 bajtów

zṅọ⊃∆ṇ

Jest to wyjątkowo nieefektywne (wykonanie 16testu na mojej maszynie zajęło ponad godzinę).

Wypróbuj online!

Wyjaśnienie

Wydaje się, że sekwencja ma właściwość, że 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.
Business Cat
źródło
9

Galaretka , 10, 9, 8 10 bajtów

Æn_$:ð1#»2

Wypróbuj online!

Dwa bajty zapisane dzięki @Dennis! (a następnie dodano ponownie z powodu przypadków na krawędziach)

Wyjaśnienie:

Æ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
źródło
Czy wiemy na pewno, że wynik zawsze będzie większy niż lub równy wkładowi? ( #odlicza się tutaj od danych wejściowych) Wydaje się rozsądne założenie tego, ale ja nie mam pojęcia, czy jest to prawidłowe założenie. EDYCJA: FYI naprawić (jeśli to konieczne) przedrostek z
Jonathan Allan
5
@JulathanAllan Bertrand postuluje, że różnica między liczbą pierwszą jest ściśle mniejsza niż sama liczba pierwsza.
Dennis
@Dennis genialne dziękuję bardzo! TMYK ...
Jonathan Allan
4

Mathematica, 30 bajtów

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

Wypróbuj online!

Mathematica, 35 bajtów

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

Wypróbuj online!

Mathematica, 77 bajtów

Prime@Min@Position[s=Differences@Prime@Range[(r=#)^3+1],#&@@Select[s,#>=r&]]&
J42161217
źródło
Sprytnie sprytnie ... nawet nie musisz się upewnić, że oba są najważniejsze pi qpierwszy ... Pierwszy kod wydaje się jednak nieprawidłowy, ponieważ zwiększa się tylko do 65535, chyba że podasz jawnie argument MaxIterations.
JungHwan Min
Również -2 bajty dla wersji 35-bajtowej:(For[t=2,NextPrime@t-t<#,t++];t)&
JungHwan Min
4

Haskell , 106 102 93 77 73 72 bajtów

Generuje to najpierw nieskończoną listę liczb pierwszych, a następnie szuka pierwszych luk. Lista pierwsza została zaczerpnięta stąd . Prawdopodobnie można go skrócić, ale jeszcze nie wiem, jak :)

Dzięki @BruceForte za -4 bajty i @Zgrab za -1 bajt!

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

Wypróbuj online!

wada
źródło
Oczywiście, jest trochę magii monad, dzięki :)
flawr
zip=<<tail$[...]zapisuje bajt.
Zgarb
„To generuje najpierw nieskończoną listę liczb pierwszych, a następnie ...”: cóż, więc nigdy nie powinno się zdarzyć? (tj. stanie się to dopiero po nieskończenie długim czasie, czasie „pierwszego wygenerowania” proceduralnie nieskończonej listy liczb pierwszych)
Olivier Dulac
1
Haskell używa leniwej oceny, więc generowanych jest tylko tyle wpisów tej listy, ile jest faktycznie używanych. Więc te liczby pierwsze są generowane do momentu, w którym faktycznie znajdziemy punkty. Jeśli spróbujesz, przekonasz się, że po jakimkolwiek nczasie przestanie działać po skończonym czasie :) (Haskell nie jest językiem proceduralnym, lecz funkcjonalnym z leniwą oceną.)
flawr
1
Jest to lista nieskończona, z definicji nie ma końca. Opisałem tylko to, co dzieje się pod maską u zwykłych tłumaczy, ale nie jest to określone jako część języka, więc nie możesz tego powiedzieć!
flawr
3

Pyth - 14 bajtów

Filtruje od [1, inf), filtrując według pierwotności ( P_) i że następna liczba pierwsza odfiltrowana z (n, inf), ma inną> = na wejściu.

f&P_T<tQ-fP_Yh

Pakiet testowy .

Maltysen
źródło
3

PowerShell , 97 96 91 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe $n, ustawia $ai $brówna 2, a następnie wchodzi w nieskończoną forpętlę. Wewnątrz zapętlamy się, $bdojdziemy do następnej liczby pierwszej . Następnie sprawdzamy, czy $b-$a(czyli różnica) jest -greaterthanor equal do $n. Jeśli tak, wysyłamy $ai exit. W przeciwnym razie możemy ustawić $asię $bi przyrost $bi rozpocząć naszą kolejną wyszukiwanie.

Ostrzeżenie: Jest to powolne w przypadku dużych danych wejściowych. W rzeczywistości nie może ukończyć 50testu TIO na wyższym poziomie niż 60 lat. No cóż.

AdmBorkBork
źródło
3

Łuska , 13 11 10 bajtów

´ȯ!V≥⁰Ẋ-İp

Wypróbuj 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
ბიმო
źródło
3

Mathematica, 39 bajtów

(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])&

Wersja 33-bajtowa (niepoprawna, ponieważ dotyczy tylko pierwszej liczby 65535)

p=NextPrime;2//.i_/;p@i-i<#:>p@i&
JungHwan Min
źródło
2

Python 2 , 96 88 bajtów

- 8 bajtów Dzięki @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]

Wypróbuj online!

Officialaimm
źródło
1
zapisał kilka bajtów: repl.it/JwBe
Maltysen
2

Perl 6 , 63 bajtów

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

Wypróbuj online!

Sean
źródło
2

Mathematica, 37 bajtów

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

Functionz pierwszym argumentem g. Począwszy od 2, stosuje funkcję p=NextPrimewielokrotnie tak długo, jak długo p@#-#<g&daje True(przerwa między bieżącą liczbą pierwszą a następną liczbą pierwszą jest mniejsza niż g).

ngenisis
źródło
2

R + gmp, 55 bajtów

Wykorzystuje funkcję nextprime z biblioteki gmp

s=2;n=scan();while((x=gmp::nextprime(s))-s<n)s=x;cat(s)
MickyT
źródło
Musisz dodać cat(s)na końcu. Drukowanie niejawne nie działa w pełnych programach.
JAD
2

C = 141 109 bajtów; C ++, D = 141 bajtów; C #, Java = 143 bajty

OSTRZEŻENIE : ALGORYTM NISKIEJ WYDAJNOŚCI

Ten kod nie był w stanie obliczyć pierwszej przerwy w g(200)ciągu 10 minut. Wymagało g(100)to 10 sekund (wersja C ++)

Wersja C ++ i 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;}

Wersja C # i 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;}

Wersja C, -32 bajtów dzięki pułapowi cat:

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;}

Różnice między wersją C # / Java i C / C ++ / D: !p(n)<==>p(n)==0

HatsuPointerKun
źródło
Można odwrócić return 0; return 1i zdjąć !przedp(++n)
ceilingcat
d%i==0i !(d%i)może być d%i<0. Ponadto, przy użyciu D's system szablonów rozwiązanie w D może być: 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;. (Usunięcie nawiasów klamrowych po fori domoże również dotyczyć C ++)
Zacharý
Opublikowałem osobną wersję D, która wykorzystuje sztuczki specyficzne dla D, których nie można znaleźć w 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;}<- to powinno działać dla wersji C ++
Zacharý
2

D, 127 125 122 bajtów

OSTRZEŻENIE: ALGORYTM NISKIEJ WYDAJNOŚCI !!

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;}

Wypróbuj online!

W jaki sposób?

HatsuPointerKun jeszcze raz, ale zrobię magię D.

  • System szablonów może wnioskować o typach T p(T)(T d)i jest krótszy niż C ++
  • r=d%i++<1||r, Specyficzne dla D shenanigany, mogą działać w C / C ++, ale nie wiem.
  • p(++n), tak samo jak powyżej, nie jestem pewien, czy działa w C / C ++
  • while(p(++n)){}, tutaj widać, dlaczego D jest zły w golfie, nie można użyć go ;jako pustego stwierdzenia.
Zacharý
źródło
2

Perl 6 , 41 37 bajtów

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

Wypróbuj online!

Wyjaśnienie

{                                   }  # 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
źródło
1

QBIC , 28 bajtów

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

Wyjaśnienie

{         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
źródło
1

05AB1E , 9 bajtów

∞<ØD¥I@Ïн

Wypróbuj online lub sprawdź wszystkie przypadki testowe . (Pakiet testowy nie zawiera dwóch ostatnich przypadków testowych, ponieważ dla nich przekroczono limit czasu TIO).

Ponieważ drugie pytanie jest zamknięte jako duplikat tego , zamieszczam tutaj również swoją odpowiedź .

Wyjaśnienie:

           # 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
źródło
1

Java 8, 99 92 bajtów

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;}

Wypróbuj online. (Największy przypadek testowy jest wykluczony, ponieważ przekracza limit czasu w TIO.)

Wyjaśnienie:

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
źródło
1

Tidy , 33 bajty

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

Wypróbuj online!

Lub 28 znaków / 34 bajty: {x:({v:⊟v≤-x}↦primes+2)@0@0}

Wyjaśnię to, używając ekwiwalentnego odpowiednika ASCII:

{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
źródło
1

APL (NARS), 36 znaków, 72 bajty

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

1π jest funkcją „następna liczba pierwsza”; test:

  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
źródło