Wprowadzenie:
Przypadkowo zepsułeś upływ czasu za pomocą urządzenia stworzonego dla zabawy, które okazało się maszyną czasu. W rezultacie zostałeś zepchnięty do dalekiej przyszłości. Zdałeś sobie sprawę, że obliczenia, moc obliczeniowa i ogólnie komputery zostały rozwinięte w ogromnej ilości, a dokładniej w nieskończonej ilości . Więc weź sobie komputer z nieskończoną pamięcią i mocą obliczeniową. Nie masz pojęcia, jak może mieć nieskończoną pamięć i nieskończoną moc przetwarzania, ale akceptujesz ją i wracasz do teraźniejszości.
Wyzwanie:
Słyszałeś, że osoba, która odkryła największą liczbę pierwszą, 2^74,207,281 − 1
otrzymała 100 000 $. Postanawiasz stworzyć program, który znajdzie następną liczbę pierwszą, ponieważ chcesz odzyskać pieniądze wydane na komputer. Tworzysz taki, który pobiera liczbę wejściową i znajduje następną liczbę pierwszą, albo przez bruteforcing, albo dowolną inną metodą.
Wyjaśnienia:
Masz hipotetyczną maszynę z nieskończoną pamięcią i mocą obliczeniową. Twój program NIE MOŻE być ograniczony (np. Int # C # może przechowywać od -2,147,483,648
do 2,147,483,647
), więc twój program musi być w stanie przechowywać i pracować z dowolną liczbą dowolnej wielkości. Masz nieskończone zasoby, więc nie przejmuj się, jeśli zabraknie ci pamięci, jeśli na to pozwolisz.
Przykład I / O: Dane
wejściowe: obecnie największa odkryta liczba pierwsza z 22 338 618 cyframi.
Wyjście: Dokładnie następna liczba pierwsza
Oczywiście nie musisz udowadniać, że działa, ponieważ obliczenie na maszynie fizycznej zajęłoby mnóstwo czasu. Ale jeśli przeniosłeś swój program na hipotetyczną maszynę z nieskończoną mocą obliczeniową / pamięcią, powinien natychmiast obliczyć.
Znalezienie następnej liczby pierwszej i sprawdzenie, czy liczba jest liczbą pierwszą, to dwie zupełnie różne rzeczy
Odpowiedzi:
Mathematica, 9 bajtów
źródło
Python 3 , 45 bajtów
Wypróbuj online!
źródło
k
jest równy końcowemu wynikowi,m
zawiera(k-1)!^2
. Od (k-1)! = -1 mod k zachowuje się tylko wtedy, gdy k jest liczbą pierwszą, mamy (k-1)! (K-1)! = 1 mod k, który pomnożony przez k będzie sam k. Obliczasz kwadrat, aby pozbyć się jedynego wyjątku (k-1)! = 0 mod k dla kompozytu k, co występuje dla k = 4. Prawidłowo?RecursionError: maximum recursion depth exceeded in comparison
f(1000)
RecursionError
.Python 2,
78777674 bajty-1 bajt dzięki @KritixiLithos
-1 bajt dzięki @FlipTack
-2 bajty dzięki @ElPedro
źródło
n%i<1
jest krótszy niżn%i==0
if
.<1
n+=1
iif
na tabulatory i zapisać 2 bajtyGalaretka , 2 bajty
Wypróbuj online!
To domyślnie pobiera dane wejściowe z i zgodnie z instrukcją generuje najbliższą liczbę pierwszą ściśle większą niż z.
źródło
Oaza , 2 bajty
Uruchom z
-n
flagą.Kod:
Wypróbuj online!
źródło
Bash + coreutils, 52 bajty
Wypróbuj online!
Dokumentacja bash i współczynnik nie określają maksymalnej wartości całkowitej, którą mogą obsłużyć (chociaż w praktyce każda implementacja ma maksymalną wartość całkowitą). Przypuszczalnie w GNU przyszłości na twoich nieskończenie dużych maszynach, bash i factor będą miały nielimitowane liczby całkowite.
źródło
Maxima, 10 bajtów
Funkcja zwraca najmniejszą liczbę pierwszą większą niż argument.
źródło
Brachylog , 2 bajty
Wypróbuj online!
Wyjaśnienie
źródło
Python z sympią, 28 bajtów
sympy.nextprime
to funkcja, która robi to, co mówi na puszce. Działa dla wszystkich pływaków.repl.it
Pyton,
6659 bajtów-4 bajty dzięki Lynn (użycie
-~
)-3 bajty dzięki FlipTack (użycie
and
ior
, pozwalając...==1
na przełączenie do...-1
warunku).repl.it
Funkcja rekurencyjna, która się liczy
n
momentu znalezienia liczby pierwszej, poprzez sprawdzenie, że istnieje tylko jedna liczba,n-1
która dzieli ją (tj. 1). Działa dla wszystkich liczb całkowitych, podnosi błąd dla liczb zmiennoprzecinkowych.Działa na 2.7.8 i 3.5.2, nie działa na 3.3.3 (błąd składniowy z powodu braku miejsca między
==1
ielse
)źródło
(n+1)%(i+1)
jest-~n%-~i
, jak sądzę.and
/or
działa, takie jakf=lambda n:sum(-~n%-~i<1for i in range(n))==1and-~n or f(n+1)
?f=lambda n:sum(-~n%-~i<1for i in range(n))-1and f(n+1)or-~n
Python,
11483 bajtówBez wbudowanych, jeśli istnieją.
-30 przez usunięcie białych znaków i -1 przez zmianę
b%i==0
nab%i<1
źródło
1
Perl 6 , 25 bajtów
Jak to działa
Perl 6 , 32 bajty
Z nieefektywnymi niestandardowymi testami pierwotności.
Jak to działa
Struktura zewnętrzna jest taka sama jak powyżej, ale predykat przekazany do
first
(aby zdecydować, czy dana liczba jest liczbą pierwszą), jest teraz:źródło
.is-prime
;)Pyke,
87 bajtówWypróbuj tutaj!
4 bajty, niekonkurujące
(Interpreter zaktualizowany od opublikowania wyzwania)
Wypróbuj tutaj!
źródło
J, 4 bajty
Prosty wbudowany do następnej liczby pierwszej.
źródło
05AB1E ,
1613 bajtów (Emigna @ -3 bajty)Wypróbuj online!
źródło
[>Dp#
działałoby?Perl, 30 bajtów (29 +1 za
-p
):Stosowanie
Wprowadź liczbę po naciśnięciu klawisza Return (wprowadź 12345 w przykładzie poniżej, wyjścia 12347):
Jak to działa
1
długości++$_
, gdzie$_
początkowo jest wartością wejściową1
s nie jest liczbą pierwszą (wyjaśniono tutaj ).++$_
)while
pętla kończy działanie i-p
wyświetla wartość$_
"1"
o długości 1, ponieważ nigdy nie będzie on używany dla wartości mniejszych niż1
, zgodnie ze specyfikacją.źródło
Java 7,
373343334303268 bajtów-75 bajtów dzięki @Poke
Nie golfowany:
Wypróbuj tutaj.
Niektóre przykładowe wejścia / wyjścia:
źródło
static
pole i metodęp
, ale usuwając metodęc
ip
parametr.QBIC , 34 bajty
Na podstawie tego testera pierwotności QBIC . Wyjaśnienie:
źródło
JavaScript (ES7), 61 bajtów
Stosowanie
Wynik
źródło
MATL, 3 bajty
Funkcja
Yq
zwraca następną liczbę pierwszą bezwzględnej wartości wejścia, jeśli dane wejściowe są ujemne, więc domyślnie przechwytujemy dane wejściowe, negujemy je (_
) i szukamy następnej liczby pierwszej za pomocąYq
.Wypróbuj online!
źródło
Haskell,
424643 bajtyzwykły kod brutalnej siły.
Oczywiście znajduje to następną najmniejszą liczbę pierwszą po
n
. Nie ma największej liczby pierwszej.Działa dla n > 0 .
edycja: Zakłada się, że
n
jest liczbą pierwszą. Dzięki radom @Laikoni w komentarzach .źródło
head[...]
go[...]!!0
. Myślę jednak, że można założyć, żen
jest liczbą pierwszą, więc możesz użyć[n..]
zamiast,[n+1..]
a następnie wziąć drugi element[...]!!1
.SimpleTemplate, 132 bajty
Algorytm jest okropny, ponieważ muszę zrobić własny kod, aby sprawdzić, czy liczba jest liczbą pierwszą, czy nie.
Okazało się to okropne, ale działa.
Pobiera liczbę jako pierwszy argument, wyświetlając wynik.
Nie golfowany:
Wszelkie wskazówki, jak usunąć to ostatnie
@if
?źródło
Lua, 876 bajtów
Lua, w przeciwieństwie do niektórych innych języków, ma maksymalną liczbę całkowitą. Gdy liczba staje się większa niż 2 32 , rzeczy przestają działać poprawnie, a Lua próbuje oszacować zamiast dokładnych wartości.
W związku z tym musiałem zaimplementować nową metodę przechowywania liczb, w szczególności zapisałem je jako ciągi Base10, ponieważ Lua nie ma limitu wielkości Ciągów, innego niż rozmiar pamięci.
Wydaje mi się, że ta odpowiedź jest o wiele bardziej zgodna z duchem pytania, ponieważ sama w sobie musi implementować liczby całkowite precyzji, a także test podstawowy.
Wyjaśniono
Chociaż powyższe używa Metatables, zamiast zwykłych funkcji, takich jak rzeczywista odpowiedź, która okazała się mniejsza.
źródło
Rubinowy, 28 + 6 = 34 bajty
Używa
-rprime
flagi.Wersja nierekurencyjna dla 31 + 6 = 37 bajtów:
źródło
Python + primefac ,
3432 bajtyNie tak krótki jak używanie
sympy
(inna odpowiedź już tego używa), ale wciąż jest dość krótki i jest znacznie szybszy.Wypróbuj online
Wprowadzanie
2**2000
zakończeń zajmuje kilka sekund.źródło
Japt, 6 bajtów
Uruchom to online.
źródło