>> Home >> Algoritmy >> Java: Eratosthenovo síto

 

Java: Eratosthenovo síto

 

Eratosthenovo síto je algoritmus pro výběr prvočísel z dané množiny. Tento algoritmus je poměrně snadný a lehce pochopitelný. Je pojmenován po řeckém matematikovi Eratosthenovi.

Tento algoritmus se nazývá sítem, protože se množina čísel takzvaně prosívá. Nejprve se všechny hodnoty nastaví na „true“, tedy jako prvočísla a následně se z nich odebírají složená čísla.

Jednoduchý příklad:

Dejme tomu, že chceme vypsat všechna prvočísla do čísla 10. Začneme samozřejmě logicky od čísla 2, protože číslo jedna není prvočíslem.

Nastavíme si tedy nejprve všechna od čísla 2 na prvočísla – označíme si je tučne (jako true).


2, 3, 4, 5, 6, 7, 8, 9, 10


Nyní vezmeme první prvočíslo (2) a nastavíme všechny jeho násobky, jako čísla složená (false).

2, 3, 4, 5, 6, 7, 8, 9, 10

V tuto chvíli uděláme to samé s dalším prvočíslem, které je v řadě (3).

2, 3, 4, 5, 6, 7, 8, 9, 10

Nyní bychom pokračovali dalším číslem, které je označeno jako prvočíslo, což by v tuto chvíli bylo číslo 5. To ale nemusíme, protože nám to již stačí a můžeme již jen vypsat výsledek.

2, 3, 5, 7

Pro lepší pochopení může posloužit tato demonstrativní animace.



A tady je zdrojový kod pro jazyk Java:


//vytvoříme proměnou
int max_cislo;
//vytvoření pole typu boolean s počtem prvků maximalního čísla
boolean[] pole = new boolean[max_cislo+1];

 

Toto pole musíme naplnit hodnotami true. Tím všechny čísla nastavíme na prvočísla.

for(int i = 2;i < pole.length;i++) {
    pole[i]=true;
}


V tuto chvíli stačí napsat cykly, které budou procházet pole a nastavovat hodnoty false u složených čísel. Stačí, když budeme procházet první polovinu čícel. Na funcionalitě algoritmu to nic nemění, je to logicky správně a především to spoří výpočetní čas.

 for(int i = 2;i*i < pole.length;i++) {
            //kdyz je cislo na pozici true - prvočíslem
            if(pole[i] == true) {
                //spust cyklus, ktery nastavi vsechny nasobky cisla "i" na false
                for(int j = 2;j*i < pole.length;j++) {
                    pole[j*i] = false;
             }
       }
}


Po tomto kroku máme již připravené pole s prvočísly – stačí již provést výpis. Způsob výpisu si může nastavit jakkoliv chce. Já prvočísla pouze oddělil mezerou.

//cyklus ktery vypise prvocisla z naseho pole
for(int i = 2;i < pole.length;i++) {
            if(pole[i] == true) {
                System.out.print(i+" ");
    }
}




Zde si ještě můžete stáhnout celou třídu s tímto algoritmem - erathostenovo_sito.java.

Další informace a implementace algoritmu do různých jazyků naleznete na wikipedii.

 

pridej.cz Přidat.eu záložku

 

Diskuze k článku


 

  1. Mang napsal(a):
    2008-11-14 15:19:23

    Good job

  2. werixon napsal(a):
    2009-09-13 15:38:35

    Jen mi neni jasne, proc se do pole "pole" uklada pocet prvku max +1. Muzete mi to vysvetlit?

  3. Pavel Novák napsal(a):
    2009-09-17 12:15:52

    Ahoj, musíš přidat o prvek víc, protože musíč počítat taky s nulou, která ti zabere jednu pozici. Musíš koukat na to, že pozice v poli je číslovaná logicky od nuly. A v tomhle případě bereme, že x-tá pozice v poli je skutečné číslo x.

  4. werixon napsal(a):
    2009-09-29 23:28:12

    Ahoj, sry, ze jsem poprve nepozdravil! Diky za vysvetleni, uz to chapu. Nak mi to hned nedoklaplo. :-D

 

Přidat nový komentář