2013-09-28 13 views
6

Czy ktokolwiek może wykonać obliczeniowo obliczony pseudokod o dowolnej implementacji prime-counting function? Początkowo próbowałem kodować Hardy-Wright algorithm, ale jego silni zaczęły generować nieszczęśliwe przepełnienie, a wiele innych wydaje się powodować podobne problemy. Przeszukałem Google w poszukiwaniu praktycznych rozwiązań, ale w najlepszym wypadku znalazłem bardzo ezoteryczną matematykę, której nigdy nie widziałem w programach konwencjonalnych.Wykonalne wdrożenie funkcji liczenia prod.

+3

Przepraszam, to nie jest McDonalds - nie masz tutaj próśb. Masz pytania. Dokładne problemy z programowaniem ... Przeczytaj [FAQ] – ppeterka

+1

, jeśli nie jest prawdą, że 'floor (x/j) * j == x - (x% j)'. Następnie formuła, do której linkujesz, staje się 'pi (x) = (-1) + SUMA {j = 3..n} (((j-2)!)% J)' (?). Następnie użyj mnożenia modułowego (tj. '5!% 7 == (((((2 * 3)% 7) * 4)% 7) * 5)% 7'). –

+0

@SeverynKozak Powodem, dla którego mówią, że to nie jest pytanie o programowanie, jest to, że twoje pytanie nie zawiera kodu. –

Odpowiedz

15

Funkcja liczenia pierwiastków pi (x) oblicza liczbę liczb pierwszych nieprzekraczającą x i od stuleci fascynuje matematyków. Na początku XVIII wieku Adrien-Marie Legendre podał wzór za pomocą funkcji pomocniczej phi (x, a), która zlicza liczby nie większe niż x, które nie są dotknięte przesiewaniem pierwszych liczb pierwszych; na przykład, phi (50,3) = 14 dla liczb 1, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47 i 49. Funkcję phi można obliczyć jako phi (x, a) = phi (x, a-1) - phi (x/P (a), a-1), gdzie phi (x, 1) to liczba nieparzystych liczb całkowitych nieprzekraczająca x i P (a) jest a-tą liczbą pierwszą (licząc od P (1) = 2).

function phi(x, a) 
    if (phi(x, a) is in cache) 
    return phi(x, a) from cache 
    if (a == 1) 
    return (x + 1) // 2 
    t := phi(x, a-1) - phi(x // p[a], a-1) 
    insert phi(x, a) = t in cache 
    return t 

Tablica p przechowuje a-prim dla małych a, obliczanych przez przesiewanie. Pamięć podręczna jest ważna; bez niego czas pracy byłby wykładniczy. Biorąc pod uwagę phi, podstawową formułą obliczeniową Legendre'a jest pi (x) = phi (x, a) + a - 1, gdzie a = pi (floor (sqrt (x))). Legendre użył swojej formuły do ​​obliczenia pi (10^6), ale zgłosił 78526 zamiast poprawnej odpowiedzi 78498, która, mimo że błędna, była zadziwiająco bliska skomplikowanego ręcznego obliczenia.

W 1950 Derrick H. Lehmer dało ulepszony algorytm do zliczania liczby pierwsze:

function pi(x) 
    if (x < limit) return count(primes(x)) 
    a := pi(root(x, 4)) # fourth root of x 
    b := pi(root(x, 2)) # square root of x 
    c := pi(root(x, 3)) # cube root of x 
    sum := phi(x,a) + (b+a-2) * (b-a+1)/2 
    for i from a+1 to b 
    w := n/p[i] 
    lim := pi(sqrt(w)) 
    sum := sum - pi(w) 
    if (i <= c) 
     for j from i to lim 
     sum := sum - pi(w/p[j]) + j - 1 
    return sum 

Na przykład, PI (10^12) = 37607912018. Mimo tych algorytmów, oraz ich współczesnych odmian i bardzo szybkich komputerach, jest ogromnie żmudne obliczanie dużych wartości pi; pi (10^24) = 18435599767349200867866.

Aby użyć tego algorytmu do obliczenia n-tej liczby pierwszej, następstwo twierdzenia o liczbie pierwszej ogranicza n-ty prime P (n) pomiędzy n log n i n (log n + log log n) dla n> 5, więc obliczyć pi na granicach i użyć bisekcji, aby określić n-ty wstęp, przestawić się na przesiewanie, gdy granice są blisko.

Omawiam liczby pierwsze w kilku pozycjach na my blog.

+0

Z pierwszego fragmentu kodu wynika, że ​​phi (x, a) = t, ale tutaj zapisałeś phi (x, a-1) = t (Gdyby to ostatnie było prawdą, wtedy byłby o wiele szybszy algorytm dla tego). Sam bym to edytował, ale mamy głupie ograniczenie edycji musi być więcej niż 6 znaków. –

+0

@StrategyThinker: Dzięki za poprawkę. Naprawiony. – user448810

+0

Ostatnio obliczono pi (10^25) i pi (10^26). Zobacz [strona 40 tutaj] (http://dalspace.library.dal.ca/handle/10222/60524). – qwr

2

Wikipedia może pomóc. Artykuł na temat prime counting zawiera kilka wskazówek. Na początek polecam algorytm Meissel w sekcji "Algorytmy do oceny π (x)", który jest jednym z najprostszych algorytmów, który nie generuje wszystkich liczb pierwszych.

Również pomocna jest książka autorstwa Pomerance i Crandalla "Prime numbers a computational perspective". Ta książka ma szczegółowy i dość przystępny opis podstawowych metod liczenia. Pamiętaj jednak, że temat z natury jest nieco zbyt zaawansowany dla większości czytelników.