Pierwszą liczbą Ludic jest 1. W celu wyznaczenia kolejnych liczb Lucia należy wziąć zbiór liczb naturalnych bez 1, pobrać pierwszy element k na liście, a następnie wykreślić co k-tą liczbę zaczynając od pierwszej liczby. Proces ten jest powtarzany.
Pierwsze 15 wyrazów liczb Ludic to: 1, 2, 3, 5, 7, 11, 13, 17, 23, 25, 29, 37, 41, 43, 47,..
Wyznaczmy pierwsze 5 liczb Ludic. Pierwszą liczbę przyjmujemy jako 1. Kolejne operacje zostały przedstawione w tabelce.
Liczba Ludic | Zbiór |
---|---|
1 | { |
2 | { |
3 | { |
5 | { |
7 | { |
Pierwszymi pięcioma liczbami Ludic są: 1, 2, 3, 5, 7...
Napisz program, który wczyta pewną wartość b, a następnie wypisze wszystkie liczby Ludic z zakresu [1, b]. Przetestuj działanie napisanej funkcji.
Podczas wyznaczania liczb Ludica zostanie użyta tylko jedna lista liczb. Dodatkowo w pamięci będzie przetrzymywany indeks p. Wszystkie liczby o indeksie mniejszym od p będą liczbami, które są już znalezionymi liczbami Ludica, a liczby o indeksach o wartości co najmniej p to lista liczb z których należy wykreślać wartości. Algorytm kończy działanie, gdy p jest równa liczbie elementów na liście.
Poniższy przykład prezentuje działanie algorytmu, który wyszuka wartości Ludica w przedziale [1, 10]. Pomiędzy wartości została wstawiona kreska |, która symbolizuje podział wyznaczany przez wartość p.
p | Liczba Ludic | Zbiór |
---|---|---|
1 | 2 | {1 | 2, 3, |
2 | 3 | {1, 2 | 3, 5, 7, |
3 | 5 | {1, 2, 3 | 5, 7} |
4 | 7 | {1, 2, 3, 5 | 7} |
5 | - | {1, 2, 3, 5, 7 |} |
W przedziale [1, 10] znaleziono następujące liczby Ludica: {1, 2, 3, 5, 7}.
Jeśli znaleziona liczba Ludica to a to następna liczba do wykreślenia to będzie 2a. Na liście może nie być tyle elementów, aby indeks 2a istniał. Oznacza to, że obliczenia można przerwać już w momencie znalezienia takiej liczby Ludica, która nie wykreśli, ani jednej liczby. W przedstawionym przykładzie pozwoliłoby to zakończyć działanie już po znalezieniu wartości 5.
Poniższa funkcja liczbyLudica() implementuje przedstawiony wcześniej algorytm wraz z optymalizacją. Przyjmuje jeden argument b i zwraca listę liczb Ludica z zakresu [1, b].
(2. - 4.) Utwórz listę liczb z zakresu. (5.) Pomijamy wykreślanie liczb dla wartości 1 i (6.) dopóki istnieje szansa, że następna liczba Ludica k wykreśli jakąkolwiek liczbę to: (7.) obliczamy pierwszy element do wykreślenia i (8. - 11.) wykreślamy wszystkie wielokrotności tej liczby z zakresu. (10.) Tutaj należy pamiętać, że chociaż następna wielokrotność jest k pozycji dalej to po (9.) usunieciu elementu trzeba przesunięcie zmniejsza się o 1. Po wykreśleniu wszystkich elementów: (12.) zwiększamy indeks p, aby p-ta liczba została uznana za liczbę Ludica. Na koniec (14.) zwracana jest lista z odpowiednio wykreślonymi wartościami.
W celu przetestowania napisanego programu można posłużyć się poniższym fragmentem kodu. Wczytuje on od użytkownika wartość b, pobiera listę liczb Ludica i ją wypisuje.