Professional Documents
Culture Documents
(brut force)
(opracowanie dr inż. Józef Ciosmak)
1. Sito Eratostenesa to algorytm generujący liczby pierwsze w przedziale (2,n). Liczby 0 oraz 1 nie
są liczbami pierwszymi. Pozostałe liczby to liczby złożone.
Algorytm wynika z założenia, ze liczba złożona jest wielokrotnością co najmniej jeden liczby
pierwszej.
np. 10-> 2 i 5
9->3
12-> 2,3,4,6
24-> 2,3, 4,6,8,12
….
Algorytm polega na „odsiewaniu” liczb. Rozpoczynamy od 2 – usuwamy wszystkie
wielokrotności liczby 2 z podanego ciągu i ustawiamy 2 jako liczbę pierwszą. Następnie
wybieramy liczbę 3 – usuwamy wszystkie wielokrotności liczby 3 z podanego ciągu
i ustawiamy 3 jako drugą liczbę pierwszą. Kontynuujemy działanie w przedziale liczb (2,n).
Lista kroków:
1. Wczytaj wartości do n.
2. Przypisz elementom tablicy T wartość „1”.
3. Pierwsza zmienna i=2 (pierwsza liczba pierwsza)
4. Znajdź wszystkie wielokrotności liczby i i odznacz je jako złożone - zmień dany element tablicy
z „1” na „0”.
5. Przejdź do kolejnej liczby nieoznaczonej jako złożona większej od i - w przedziale (i+1,n)
dokonaj przeszukania wg kroku 4. Inaczej krok 6.
6. Wypisz wszystkie liczby pierwsze z przedziału (2,n) – czyli indeksy tych elementów tablicy T,
których wartości jest równa 1.
i 2 3 4 5 6 7 8 9 10
T[i] 1 1 1 1 1 1 1 1 1
i 2 3 4 5 6 7 8 9 10
T[i] 1 1 1->0 1 1->0 1 1->0 1 1->0
i 2 3 4 5 6 7 8 9 10
T[i] 1 1 0 1 1->0 1 0 1->0 0
i 2 3 4 5 6 7 8 9 10
T[i] 1 1 0 1 0 1 0 0 0
Wynikiem jest tablica T[2…10] w której T[i] =1, to i jest liczbą pierwszą, zaś T[i] =0 nie jest liczbą
pierwszą.
void pierwsza( int *T, int n){
int i,m;
for (i=2;i<=n;i++)
T[i]=1;
i=2;
while(i<=n){
m=2*i;
while(m<=n){
T[m]=0;
m=m+1;
}
do
i++;
while (T[i]==0&&i<=n);
}
}
Inna propozycja funkcji:
Liczbę naturalną n większą od 1 nazywamy liczbą pierwszą, jeśli posiada ona tylko dwa dzielniki –
tj. 1 oraz n. Złożoność obliczeniowa klasy O(n) funkcji.
Funkcja:
bool sprawdz (int n){
for (int i=2; i<n;i++)
if (n%i==0) return false ;
return true;
}
Nie ma potrzeby sprawdzania wszystkich liczb – załóżmy że istnieje liczba x większa od sqrt(n), która
jest dzielnikiem liczby n. Stąd wynika, że musi istnieć liczba y, będąca dzielnikiem liczby n, taka że
n=x*y. Liczba y musiałaby być mniejsza od sqrt(n), co oznacza że zostałaby znaleziona już w przedziale
(2, sqrt(n)). Stąd złożoność obliczeniowa O(√𝒏).