Liczby Samotne to takie liczby naturalne, których minimalna odległość do liczby pierwszej ustanawia nowy rekord. Oznacza to, że żadna poprzednia liczba nie miała tak wysokiego rekordu jak wybrana.
Najmniejszą liczbą samotną jest 0. Jej odległość od najbliższej liczby pierwszej 2 wynosi 2.Kolejną liczbą jest 23, która znajduje się pomiędzy 19, a 29. Tutaj warto zwrócić uwagę na to, że 23 sama jest liczbą pierwszą, ale nie ma to znaczenia podczas liczenia odległości do najbliższych liczb pierwszych.
Liczby Samotne można ustawić w następujący ciąg: 0, 23, 53, 120, 211, 1340, 1341, 1342, 1343, 1344, 2179...
Podczas wyszukiwania liczb Samotnych dużą rolę odgrywa skuteczność wykrywana liczb Pierwszych. Do rozpoznania czy liczba jest Pierwsza wystarczy standardowa funkcja, które opis jest w tym artykule.
Dodatkowo przydatna okaże się funkcja nastepnaPierwsza(), która będzie wyszukiwać najbliższą liczbę Pierwszą większą od przekazanej jako argument.
Implementacja funkcji liczbySamotne() przyjmuje jako argument górny zakres obszaru przeszukiwań max, a jako wynik otrzymuje się listę liczb Samotnych z zakresu [0, max].
Funkcja na początku tworzy nową listę na które od razu dopisywane jest 0, a następnie deklaruje ostatnią różnicę o wartości 2 oraz kolejne liczby pierwsze. Następnie w pętli dla każdej liczby będzie sprawdzana jej odległość do dwóćh sąsiednich liczb Pierwszych. W zamyśle liczba i musi znajdować się w przedziale [p1, p2]. Jeśli wykroczy poza ten zakres to generowana jest kolejna trójka liczba pierwszych. Następnie trzeba stwierdzić czy rozpatrujemy liczbę pomiędzy Pierwszymi czy Pierwszą. W pierszym przypadku wybieramy mniejszą odległość pomiędzy |i - p1| oraz |i - p2|. Jednak jeśli i to liczba Pierwsza to wynosi p2 i wtedy należy wybrać mniejszą odległość pomiędzy |p1 - p2| oraz |p2 - p3|. Ostatni warunek sprawdza czy nwoa różnica q jest większa od aktualnej. Jeśli tak to został ustanowiony nowy rekord. Aktualizujemy więc różnicę, a wartość i dopisujemy na listę.
W celu przetestowania kodu można skorzystać z poniższego fragmentu programu: