package narzedzia ;

/*************************************************************
 * Klasa <b>LPier</b> jest klasą usługową - zawiera tylko
 * definicje metod statycznych dotyczących badania pierwszości
 * liczb całkowitych.
 * @author Paweł Rzechonek
 * @version 1.3
 *************************************************************/
public class LPier
{
    /**
    <b>POTEGA2</b> to logarytm rozmiaru sita Eratostenesa.
    */
    private static final int POTEGA2 = 16 ;
    /**
    <b>ZAKRES</b> to rozmiar sita Eratostenesa.
    Rozmiar ten jest potęgą liczby 2.
    */
    private static final int ZAKRES = 1<<POTEGA2 ;
    /**
    <b>najmnDzielPier</b> to sito Eratostenesa.
    Dla każdej liczby pamiętany jest jej najmniejszy podzielnik pierwszy.
    Jeżeli liczba jest pierwsza, to jej podzielnik jest równy jej samej.
    */
    protected static final int[] najmnDzielPier = new int[ZAKRES] ;
    // statyczny blok inicjalizujący zawartość sita Eratostenesa
    static
    {
        najmnDzielPier[0] = -1 ;
        najmnDzielPier[1] = -1 ;
        najmnDzielPier[2] = 2 ;
        for (int i=3 ; i<ZAKRES ; i++)
            if ((i&1)==0) najmnDzielPier[i] = 2 ;
            else
            {
                najmnDzielPier[i] = i ;
                for (int j=3 ;j*j<=i ; j+=2)
                    if (najmnDzielPier[j]==j&&i%j==0)
                    {
                        najmnDzielPier[i] = j ;
                        break ;
                    }
            }
    }

    /**
    Funkcja <b>czyPierwsza</b> sprawdza, czy podana liczba jest pierwsza.
    @param liczba Liczba całkowita.
    @return Funkja zwraca wartość logiczną, odpowiadając na pytanie
    "czy podana liczba jest pierwsza".
    */
    public static boolean czyPierwsza (int liczba)
    {
        if (liczba<2) return false ;
        if (liczba==2) return true ;
        if ((liczba&1)==0) return false ;
        if (liczba<ZAKRES) return najmnDzielPier[liczba]==liczba ;
        for (int i=3 ; i*i<=liczba ; i+=2)
            if (najmnDzielPier[i]==i&&liczba%i==0) return false ;
        return true ;
    }
}
