Napisałem funkcję, sieve(n)
, która używa Sieve of Eratostenes, aby zwrócić tablicę wszystkich liczb pierwszych do n
.Jak mogę wykorzystać Sito Eratostenesa, aby uzyskać nth prim?
sieve(25) # ==> [2, 3, 5, 7, 11, 13, 17, 19, 23]
Źródło tej funkcji można odczytać here.
Chcę to zmienić teraz, aby sieve(n)
zwrócił n
th prime. Po prostu nie jestem pewien, jak to zrobię. Nie chcę napisać zupełnie nowej, bardziej rozbudowanej funkcji, więc wydaje się, że najlepszą metodą jest ustalenie, do jakiej wartości powinno się liczyć sito.
Na przykład, jeśli mogę prosić o sile 27, sita za Wstępna lista liczb powinna wynosić 2 do (coś wiem 27. prime nie jest większa niż). Ale czy istnieje prosty sposób sprawdzenia, jaka jest ta wartość?
że badane na to pytanie, a znaleziono this Quora post którym wymienione, że n-ta pierwsza musi być pomiędzy n*Math.log(n) + n*(Math.log(Math.log(n))-1)
i n*Math.log(n) + n*Math.log(Math.log(n))
(gdzie Math.log
Ruby dla logarytmu naturalnego), ale po prostu dzięki czemu list
tablica numerów między tymi dwoma postaciami sprawia wydajność sita dziwne wartości, takie jak 56
dla 15th prim (56 nie jest liczbą pierwszą, a odpowiedź powinna być 47).
Jak można się domyślić, jestem całkowicie poza moim żywiołem. Gdyby ktoś mógł mi doradzić, naprawdę bym to docenił.
Nie powinieneś prosić o wygenerowanie liczb pierwszych * od * niczego. Cały algorytm zbudowany jest wokół wiedzy, że znalazł wszystkie liczby pierwsze przed określonym punktem, zanim przejdzie dalej. Musisz go poprosić o znalezienie liczb pierwszych od 1 do górnej granicy. –
Czy następujące podejście byłoby akceptowalnym rozwiązaniem? Użyj górnej granicy, o której wspomniałeś w swoim pytaniu (jednak nie wiedziałem o tym i nie mam pojęcia, dlaczego jest poprawna), aby generować wszystkie liczby pierwsze mniejsze niż związane i zwracać element "n-ty" listy. – Codor
@Codor To, co myślałem, że zadziała, ale ma bardzo dziwne wyniki, których nie rozumiem. Jeśli ustawię swoją początkową listę na 2 do górnej granicy, otrzymam liczby pierwsze przez jakiś czas, a potem tylko stałą liczbę - 267, 268, 269, 270, 271 itd. To dziwne. – GreenTriangle