You are on page 1of 3

Ćwiczenie nr 8 z Algorytmów i Struktur Danych – algorytm siłowy

(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:

void sito(int *tab, unsigned int n)


{
for(int i=2; i<=n; i++){ //zerowanie tablicy
tab[i] = 0;

for (int i=2; i*i<=n; i++) // i<=sqrt(n)


// i*i <= n
{
if(!tab[i]) //jeśli liczba jest pierwsza (wartość 0)
for (int j = i*i ; j<=n; j+=i) //to wykreślamy jej wielokrotności
tab[j] = 1; //ustawiając wartość na 1
}
}
cout<<"Liczby pierwsze to:"<<endl;
for(int i=2;i<=n;i++)
if(!tab[i])
cout<<i<<" ";
}
2. Badanie czy dana liczba jest liczbą pierwszą.

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(√𝒏).

bool sprawdz (int n){


for (int i=2; i<sqrt(n);i++)
if (n%i==0) return false ;
return true;
}

3. Łamanie kluczy bezpieczeństwa ( sieci bezprzewodowych, systemów kryptograficznych)

You might also like