Napisz program lub funkcję, która generuje / zwraca pierwsze 10000 liczb pierwszych z indeksowaniem liczb pierwszych.
Jeśli nazwiemy n- tą liczbą pierwszą p(n)
, ta lista jest
3, 5, 11, 17, 31, 41, 59 ... 1366661
bo
p(p(1)) = p(2) = 3
p(p(2)) = p(3) = 5
p(p(3)) = p(5) = 11
p(p(4)) = p(7) = 17
...
p(p(10000)) = p(104729) = 1366661
Standardowe luki są zabronione i dozwolone są standardowe metody wyjściowe. Możesz odpowiedzieć za pomocą pełnego programu, funkcji o nazwie lub funkcji anonimowej.
Odpowiedzi:
MATLAB / oktawa, 25 bajtów
To nie staje się prostsze niż to.
źródło
Python, 72 bajty
Kończy się to „błędem indeksu listy poza zakresem” po wydrukowaniu 10000 liczb, co jest domyślnie dozwolone .
Używa metody Twierdzenia Wilsona do wygenerowania listy
l
liczb pierwszych do 10000. liczby pierwszej. Następnie wypisuje liczby pierwsze z pozycjami na liście, przesuniętymi o 1 w celu zindeksowania zera, aż skończy się limit po 10000-tej liczbie pierwszej.Korzystnie, górna granica
1366661
może być określona jako82e5/6
co jest1366666.6666666667
, oszczędzając char.Chciałbym metody pojedynczej pętli, drukując liczby pierwsze z indeksowaniem liczb pierwszych, gdy je dodamy, ale wydaje się, że jest ono dłuższe.
źródło
J, 11 bajtów
Wysyła liczby pierwsze w formacie
Wyjaśnienie
źródło
Mathematica,
262523 bajtówCzysta funkcja zwracająca listę.
źródło
Listable
tak prostyPrime@Prime@Range@1*^4&
zrobi@
operator ma wyższy priorytet niż^
podczas pisaniaRange@10^4
? To klasyczna matematyka psująca grę w golfa. Dobry trik!Haskell, 65 bajtów
Wyjścia:
[3,5,11,17,31,41,59,67,83,109,127.....<five hours later>...,1366661]
Niezbyt szybko. Jak to działa:
p
jest nieskończoną listą liczb pierwszych (naiwnie sprawdzając wszystkiemod x y
s dla y in[2..x-1]
). Weź pierwsze10000
elementy listy, które otrzymasz, gdy0:p!!
(pobierz n-ty elementp
) jest zmapowanyp
. Muszę dostosować listę liczb pierwszych, z których pobieram elementy, przygotowując jedną liczbę (->0:
), ponieważ funkcja indeksu (!!
) jest oparta na zerach.źródło
PARI / GP, 25 bajtów
źródło
AWK - 129 bajtów
... okay ... zbyt długo, aby zdobyć punkty za zwartość ... ale może może zyskać trochę honoru za szybkość?
x
Pliku:Bieganie:
Czytelny:
Program oblicza strumień liczb pierwszych, używając
L
jako „taśmy liczb” przytrzymującej znalezione liczby pierwsze skaczące dookoła,L
aby oznaczyć pobliskie liczby, o których już wiadomo, że mają dzielnik. Te skaczące liczby pierwsze będą się przesuwać, podczas gdy „taśma liczb”L
będzie od początku odcinana numer po numerze.Odcięcie
L[n]
pustej głowicy oznacza, że nie ma znanego (podstawowego) dzielnika.L[n]
trzymanie wartości oznacza, że ta wartość jest liczbą pierwszą i wiadomo, że dzielin
.Więc albo znaleźliśmy główny dzielnik, albo nowy pierwszy. Wtedy pierwsza liczba zostanie przesunięta do następnej
L[n+m*p]
na taśmie, która jest pusta.To jest jak sito Eratostenesa „wyciągnięte przez butelkę Kleina”. Zawsze działasz na początku taśmy. Zamiast strzelać wielokrotnością liczb pierwszych przez taśmę, używamy liczb pierwszych już znajdujących się, ponieważ kursory odskakują od taśmy zaczynając od wielu odległości o własnej wartości, aż do znalezienia wolnej pozycji.
Podczas gdy zewnętrzna pętla generuje jedną pierwszą lub nie pierwszą decymcję na pętlę, znalezione liczby pierwsze są liczone i zapisywane
P
jako klucz, wartość tej pary (klucz, wartość) nie ma znaczenia dla przebiegu programu.Jeśli
i
zdarzy się, że ich klucz jestP
już w (i in P
), mamy liczbę pierwszą rasy p (p (i)).Bieganie:
Weź pod uwagę, że ten kod nie korzysta z zewnętrznych wstępnie obliczonych tabel głównych.
Czas poświęcony mojemu staremu dobremu Thinkpadowi T60, więc myślę, że zasługuje na to, aby nazwać go szybko.
Testowane
mawk
igawk
na Debian8 / AMD64źródło
CJam, 19
Możesz spróbować online , ale będziesz potrzebować odrobiny cierpliwości: str
Dla przypomnienia ostatnia liczba to 1366661.
źródło
Perl, 55 bajtów
Zastosowania @DanaJ „s
Math::Prime::Util
moduł Perl (ładowany pragmientheory
). Zdobądź dzięki:źródło
05AB1E, 7 bajtów (niekonkurujące)
Kod:
Wypróbuj online! , zauważ , że zmieniłem
4
na2
. Jeśli masz dużo czasu, możesz zmienić2
powrót na4
, ale zajmie to dużo czasu. W tym celu muszę naprawić algorytm.Wyjaśnienie:
źródło