Sito Eratostenesa

Sito Eratostenesa
DB
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:51
0

Mam za zadanie stworzenie klasy SitoEratostenesa, ma ona posiadać konstruktor SitoEratostenesa(int n), który tworzy tablice boolowska odpowiedniego rozmiaru i oblicza na niej Sito Eratostenesa dla liczb od 2 do n.

Jak zaimplementować publiczną metodę boolean prime (int n), która ma zwracać true jeśli m jest pierwsza i false jeśli m nie jest pierwsza. Mam tutaj zapewne skorzystać z konstruktora SitoEratostenesa?

Kopiuj
public class SitoEratostenesa
{	

    
     public SitoEratostenesa(int n)
	{
        
        boolean[] numbersTable = new boolean[n+1];
        for(int i = 2; i*i <= n; i++)
        {
            if (numbersTable[i] == true)
                continue;
            for (int j = 2 * i ; j <= n; j += i)
                numbersTable[j] = true;
 
        }
	}
		
		public static boolean prime(int m)
	{
	
	
	
	}
				public static void main(String[] args)
				{
			
				}
	

}

Olamagato
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Polska, Warszawa
  • Postów:1058
0

W temacie http://4programmers.net/Forum/Java/186553-liczby_pierwsze_-_java
W przedostatnim poście wrzuciłem całe źródło klasycznego sita.


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?
DB
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:51
0

a mógłbyś bardziej wyjaśnić to zadanie, które wrzuciłeś?

Olamagato
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Polska, Warszawa
  • Postów:1058
0

Tworzy sito, które potrzebujesz i pozwala sprawdzić czy dowolna liczba int jest pierwsza (isPrime()), a także jaka jest największa liczba pierwsza mniejsza lub równa n (getLargestPrime(int number)). Tablica boolowska jest zaszyta w standardowym obiekcie BitSet. To najprostsza implementacja, której jedyną optymalizacją jest liczenie sita od wartości ostatniego liczenia. Reszta informacji w komentarzach.
Cała implementacja jest w metodzie void przeliczSito(final int number). Ledwo 80 wierszy kodu.


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?
edytowany 1x, ostatnio: Olamagato
DB
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:51
0

teraz już zaczynam rozumieć powoli kod, ale jeśli mam do stworzenia konstruktor który tworzy tablice boolowska to czy mogę użyć gotowej struktury z obiektu BitSet?

Olamagato
Formalnie konstruktor tworzy tablicę boolowską ponieważ tworzy cały podobiekt BitSet. Tyle, że ta tablica nie jest wtedy jeszcze wypełniona (poskreślana).
Olamagato
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Polska, Warszawa
  • Postów:1058
0

Należy wtedy w samym konstruktorze (na jego końcu) wrzucić wywołanie przeliczSito(n), gdzie n jest parametrem konstruktora, wtedy późniejsze wywołania isPrime oraz getLargestPrime sprowadzą się jedynie do wyszukania odpowiedniego bita w tablicy BitSet (chyba, że później żądana liczba przekroczy tą podaną w konstruktorze - wtedy będzie jeszcze trochę obliczeń).
Nie wrzuciłem tego tam ponieważ tak powoli działający konstruktor stwarza bardzo długi stan zawieszenia między wywołaniem new, a stworzeniem obiektu. Wtedy nie wiadomo czy długi czas oczekiwania na obiekt jest spowodowany problemem braku pamięci na obiekt, czy obliczeniami. W efekcie łączny czas wywołania konstruktora oraz jednej z metod isPrime lub getLargestPrime nie zmieni się, ale ogromna większość zużytego czasu przeniesie się do konstruktora.

Jednak najczęściej lepiej jest aby długotrwałe obliczenia były tam gdzie wszyscy się tego spodziewają, czyli wywołaniu metody sprawdzającej czy liczba jest pierwsza lub wyszukującej największą liczbę pierwszą ograniczoną od góry. Wtedy konstruktor zajmuje się tylko utworzeniem obiektu, a metody właściwymi obliczeniami i uzyskaniem wyniku.


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?
edytowany 1x, ostatnio: Olamagato
DB
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:51
0

a możesz wrzucić przykładowy taki kod?

Olamagato
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Polska, Warszawa
  • Postów:1058
0

Przecież opisałem wszystko. Prościej chyba się nie da.

Kopiuj
        public FreePrimes(final int maxNumber)
        {
                this.podzielna = new BitSet(maxNumber);
                init();
                przeliczSito(maxNumber);
        }

Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.