Postulat Bertranda stwierdza, że dla każdej liczby całkowitej n ≥ 1 istnieje co najmniej jedna liczba pierwsza p, tak że n <p ≤ 2n . Aby zweryfikować to twierdzenie dla n <4000 , nie musimy sprawdzać 4000 przypadków: sztuczka Landaua mówi, że wystarczy sprawdzić, czy
2, 3, 5, 7, 13, 23, 43, 83, 163, 317, 631, 1259, 2503, 5003
wszystkie są najważniejsze. Ponieważ każda z tych liczb jest mniejsza niż dwukrotność swojego poprzednika, każdy przedział {y: n <y ≤ 2n} zawiera co najmniej jedną z tych liczb pierwszych.
Ta sekwencja liczb to liczby pierwsze Bertranda (OEIS A006992) i są one zdefiniowane w następujący sposób:
a(1) = 2
a(n) = largest prime below 2a(n-1)
Wyzwanie
Zaimplementuj tę sekwencję. Możesz pisać
- funkcja lub program, który podał jakieś n, zwraca a (n) (indeksowane 0 lub 1),
- funkcja lub program, który podał jakieś n, zwraca pierwsze n (lub n-1 lub n + 1 ) wpisów tej sekwencji,
- nieskończona lista lub strumień, generator lub podobny odpowiednik w twoim języku.
Fx.ØØ
jest tak blisko ... Działa na wszystko powyżejn > 2
.$F·ÅPθ
dla tej samej liczby bajtów.Haskell , 50 bajtów
Wypróbuj online!
Generuje nieskończoną listę.
Haskell , 40 bajtów?
Wypróbuj online!
Działa to, jeśli liczby pierwsze Bertranda nie zawierają żadnych pseudopierwszych liczb Fermata dla 2 .
źródło
Galaretka , 6 bajtów
Wypróbuj online!
0-indeksowane.
Wyjaśnienie
źródło
MATL , 9 bajtów
Wejścia n , wyjścia a ( n ), 1-indeksowane.
Wypróbuj online!
Wyjaśnienie
źródło
Stax , 10 bajtów
Uruchom przypadki testowe
Ten problem ujawnił błąd w implementacji stax
:p
, który jest instrukcją, która dostaje największą liczbę pierwszą mniej niż jego wkład. Gdyby działało poprawnie, istniałoby rozwiązanie56 bajtów.Ale niestety tak nie jest i nie ma.Jako twórca języka naprawię go, ale po opublikowaniu problemu wydaje się to tanie.Tak czy inaczej, tutaj jest odpowiednia reprezentacja programu ascii powyżej.
Jest to stosunkowo prosta implementacja opisu problemu. Jedyną rzeczą, która może być w tym interesująca, jest użycie
gs
formy generatora. Generatory to rodzina konstrukcji, które łączą warunek początkowy, transformację i filtr, aby uzyskać jedną lub więcej satysfakcjonujących wartości. W takim przypadku jest on używany zamiast zepsutej:p
instrukcji.Edycja: oto 6-bajtowe rozwiązanie, ale wymaga poprawki, która została zastosowana dopiero po opublikowaniu tego wyzwania.
źródło
Python 2 , 63 bajty
Wypróbuj online!
Drukuje na zawsze.
Korzysta z generatora liczb pierwszych Twierdzenia Wilsona, nawet jeśli generowanie liczb pierwszych do przodu jest niezręczne z powodu tego problemu. Śledzi aktualnie widzianą największą
r
liczbę pierwszą i podwójną granicęm
.Zapisywane są dwa bajty,
P*=k
a nieP*=k*k
jak zwykle, ponieważ jedynym efektem jest twierdzenie, że 4 jest liczbą pierwszą, a sekwencja podwojenia go pomija.źródło
CJam (15 bajtów)
Demo online . Zauważ, że jest to indeksowane na 0.
Bardziej efektywnym podejściem byłoby przeszukiwanie do tyłu, ale wymaga to jeszcze jednego znaku, ponieważ nie można użyć niejawnego
,
(zakres):źródło
Japt ,
16141312 bajtówDwa rozwiązania w cenie jednego, oba indeksowane 1.
N-ty okres
Wreszcie wyzwanie, które mogę napisać działające rozwiązanie
F.g()
.Spróbuj
Pierwsze N warunków
Spróbuj
źródło
Pari / GP , 34 bajty
Wypróbuj online!
źródło
Python 2 , 64 bajty
Wypróbuj online! Drukuje sekwencję w nieskończoność
źródło
Haskell , 58 bajtów
Wypróbuj online!
źródło
Python 2 , 68 bajtów
Drukuje sekwencję w nieskończoność (musisz kliknąć „Uruchom” drugi raz, aby zatrzymać wykonywanie).
Wypróbuj online!
Python 3 , 90 bajtów
Zwraca n- ty termin.
Wypróbuj online!
źródło
C (gcc) ,
9787868079 bajtówP
do głównej pętli.printf
połączenie.i
wpis -tej sekwencji (indeksowany 0) zamiast wysyłania niekończącego się strumienia.Wypróbuj online!
źródło
Attache , 38 bajtów
Wypróbuj online!
Na podstawie 0; zwraca
n
liczbę pierwszą Bertrand.Obecnie nie ma wbudowanego, aby znaleźć poprzednie / następne liczby pierwsze, więc używam
Series
wbudowanego, aby obliczyć wszystkie liczby pierwsze do2*$[_-1]
. To ostatnie wyrażenie używa niejawnej rekurencji (powiązanej z$
), aby łatwo zdefiniować relację powtarzalności. Warunek if służy do określenia warunku podstawowego.źródło
Perl 6 , 35 bajtów
Wypróbuj online!
To wyrażenie jest nieskończoną listą liczb pierwszych Bertranda.
źródło
Siatkówka , 39 bajtów
Wypróbuj online! Wyjaśnienie:
Zacznij od 1.
Powtórz pętlę, używając danych wejściowych jako liczby pętli.
Podwój wartość.
Znajdź najwyższą liczbę pierwszą mniejszą niż wartość.
Wydrukuj to.
źródło
Ruby , 51 + 7 (-rprime) = 58 bajtów
Wypróbuj online!
Lamba przyjmuje
n
i zwraca liczbęnth
pierwszą Bertrand, indeksowaną 0. Nie ma tu wiele, ale i tak pozwolę sobie na to:Rubinowy , 48 + 7 = 55 bajtów
Wypróbuj online!
Dla zabawy oto rozwiązanie z nieskończoną pętlą. Drukuje bez przerwy i wymaga przerwania. W zależności od tego, kiedy dokładnie przerwiesz, możesz, ale nie musi zobaczyć wyjście. Nie golfowany:
źródło
APL (Dyalog Extended) , 12 bajtów
Pobiera dane wejściowe od użytkownika jako N, zwraca N-ty element sekwencji (indeksowany 0).
Wypróbuj online!
Wyjaśnienie:
źródło
R , 87 bajtów
Podane
n
wynikia(n)
Wypróbuj online!
Nadal pracuję nad „Biorąc pod uwagę wyjście n a (1), a (2) ... a (n)”. Myślałem, że mogę nieco zmodyfikować ten kod, ale wydaje się to trudniejsze.
źródło