Liczenie sumy liczb pierwszych w wielu watkach.

2014-02-05 00:55
0

Witam.
Probuje napisac program, ktory wylicza sume liczb pierwszych ponizej 2 000 000. Jednak ze wzgledu, ze trwalo to bardzo dlugo to chcialem zrobic to w wielu watkach. Kazdy watek ma liczyc czesc sumy. Jednak jak po uruchomieniu programu uruchamia sie tylko jeden watek, a eclipse otwiera mi klase Thread z zaznaczona linjka "throw new IllegalThreadStateException();" nie bardzo wiem o co mu biega bo kompilator nie zglasza zadnych bledow, program niby dalej dziala, ale nic sie nie dzieje. Prosilbym o pomoc z tym zagadnieniem :) Ponizej zamieszczam kod poszczegolnych klas.
Jest to moj pierwszy program wielowatkowy wiec prosze o wyrozumialosc. :)

PrimeSum - klasa, ktora uruchamia watki i udostepnia metody z ktorych watek moze sobie pobrac zakres dzialania.

public class PrimeSum {
    private int begin = 2;
    double sum = 2d;

    PrimeSum() {
        PrimeSumThread thread = new PrimeSumThread(this);
        for(int i = 0; i <= 100; i++) {
            thread.start();
        }
    }

    synchronized void sumThread(double prime) {
        sum += prime;
        System.out.println(sum);
    }
    synchronized int getBegin() {
        int temp = begin;
        if(begin == 2)
            begin = 0;
        begin += 20000;
        return temp;
    }
    synchronized int getEnd() {
        int temp = begin-1;
        return temp;
    }
}

PrimeSumThread - no, a to juz sama klasa watku. :)


public class PrimeSumThread extends Thread{
    PrimeSum pr;

    PrimeSumThread(PrimeSum pr) {
        this.pr = pr;
    }
    public void run() {
        System.out.println("Rozpoczecie watku: " + this.getName());
        int begin = pr.getBegin();
        int end = pr.getEnd();
        System.out.println(begin + " " + end);
        double sum = 0;
        IsPrime p = new IsPrime();
        for(int i = begin; i < end;i++){
            if(p.isPrime(i))
                sum += i;
        }
        pr.sumThread(sum);
        System.out.println("Konczenie watku: " + this.getName());
    }

}

Pozostało 580 znaków

2014-02-05 01:40
0

Nie wiem co Ty kombinujesz, ale najprościej jak się da liczy mi 0.03s:
http://ideone.com/PSVoAm


░█░█░█░█░█░█░█░█░█░█░█░
zero za dużo wpisałem czyli 20 000 000 liczy. Popraw sobie jak potrzeba :P - krwq 2014-02-05 23:26

Pozostało 580 znaków

2014-02-05 03:20
0

@krwq: czy Twój algorytm na pewno daje dobre wyniki?

Wziąłem sobie pierwszą lepszą implementację sita i suma wychodzi mniejsza:

http://ideone.com/R44fCd

edytowany 3x, ostatnio: Spine, 2014-02-05 16:44

Pozostało 580 znaków

2014-02-05 07:03
0

Wynik @krwq'a jest błędny. W javie, na komputerze domowym, mam czas tworzenia sita 43 ms, czas sumowania 6 ms.
http://ideone.com/DECJ9C - łączny czas poniżej 30 ms.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 3x, ostatnio: bogdans, 2014-02-05 07:48
No i widać, że Cambridge, UK nie umywa się do polskiej edukacji :P - Spine 2014-02-05 07:34
Tradycyjny brytyjski izolacjonizm spowodował, że nawet liczby pierwsze mają mniejsze. - bogdans 2014-02-05 07:52
Ale z arytmetyką już gorzej, 43ms + 6ms = 30ms - _13th_Dragon 2014-02-05 08:48
Napisał, że na domowym komputerze ma takie czasy. Na ideone jest inny czas. To zrozumiałe :) - Spine 2014-02-05 09:04
Ofiary polskiej edukacji radzą sobie za to gorzej z porównywaniem liczb, wynik @krwq'a jest większy, on sumuje do 20 000 000. - bogdans 2014-02-05 09:48
kurde myślałem, że jak edytuje to zmienia id, a nie na tym samym :P - krwq 2014-02-05 23:25

Pozostało 580 znaków

2014-02-05 09:38
0

A po co tablica lczb pierwszych ? ;]
Moj program sprawdza czy liczba jest pierwsza i ja dodaje.
Co to jest sit, sita, czy jak to nazywacie ? ;P

Zalezy mi zeby ta suma byla liczona w wielu watkach jednoczesnie. :)

Zapomnialem dodac klase IsPrime :)
Moze macie jakis lepszy sposob na sprawdzenie czy liczba jest pierwsza bo przy wiekszych liczbach trwa to wiecznosc. :)


public class IsPrime {

    IsPrime(){}

    public Boolean isPrime(int number) {
        for(int i = 2; i < number; i++) {
            if(number%i == 0)
                return false;
        }
        return true;
    }

}
edytowany 1x, ostatnio: mefmund, 2014-02-05 09:40
2014-02-05 09:43
2

Wtf?

    public Boolean isPrime(int number) {
        for(int i = 2; i < number; i++) {
            if(number%i == 0)
                return false;
        }
        return true;
    }

Obowiązkowa modyfikacja:

    public Boolean isPrime(int number) {
        for(int i = 2; i <= Math.sqrt(number); i++) {
            if(number%i == 0)
                return false;
        }
        return true;
    }

A sito to szybszy sposób na znajdowanie liczb pierwszych z podanego zakresu.
W którym kodzie dopatrzyłeś się tablicy liczb pierwszych?
Brakuje jeszcze klasy z metodą main.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 5x, ostatnio: bogdans, 2014-02-05 09:59

Pozostało 580 znaków

2014-02-05 10:20
0

Tablice, ktora zobaczylem to sito Eratostenesa. ;]
Ma ktos moze pomysl, czemu petla z klasy PrimeSum, ktora powinna rozpoczac 100 watkow rozpoczyna tylko jeden i na tym program przestaje kontynuowac prace ? :)

public class Problem10 {

    public static void main(String[] args) {
        new PrimeSum();
    }

}
edytowany 1x, ostatnio: mefmund, 2014-02-05 19:00
„to sito”, nie „te sito”, a już na pewno nie „to te sito”, od biedy „to to sito”. - Azarien 2014-02-05 10:27

Pozostało 580 znaków

2014-02-05 10:26

Próbujesz uruchamiać jeden wątek 100 razy.

    PrimeSum() {
        PrimeSumThread thread = new PrimeSumThread(this);
        for(int i = 0; i <= 100; i++) {
            thread.start();
        }
    }

Przenieś tworzenie wątków do pętli.
Po poprawkach (tworzenie wątków wewnątrz pętli, metoda isPrime), program kończy się szybko - poniżej sekundy, ale daje błędny wynik 161 644 312 565. Znajdź błąd samodzielnie.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 2x, ostatnio: bogdans, 2014-02-05 10:36

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0