import scala.actors.Actor._
import scala.actors.Actor
case class Start(von : Long, bis : Long, max : Long)
case class Work()
class PrimeAct(von : Long, bis : Long) extends Actor {
def isPrime(n:Long) : Boolean = {
var i : Long = 2
if (n <= 1)
false
else {
while ( n % i != 0 && i * i <= n)
i += 1
i * i > n
}
}
def count(von : Long, bis : Long) : Long = {
var anz : Long = 0
var i : Long = von
while (i <= bis){
if (isPrime(i))
anz += 1
i += 1
}
anz
}
def act() {
react {
case work : Work =>
sender ! count(von,bis)
}
}
}
class Coordinate extends Actor {
var done : Boolean = false
var actCount : Int = 0
var count : Long = 0
def splitWork(von : Long, bis : Long, max : Long) {
if (bis - von <= max) {
val counter = new PrimeAct(von,bis).start()
counter ! Work()
actCount += 1
}
else {
val counter = new PrimeAct(von, von + max - 1).start()
counter ! Work()
actCount += 1
splitWork(von + max, bis, max)
}
}
def act() {
while(!done) {
receive {
case start : Start =>
splitWork(start.von, start.bis, start.max)
println("Es werden " + actCount + " Actors zur Berechnung verwendet.")
case msg : Long =>
count += msg
actCount -= 1
done = actCount == 0
}
}
println("Anzahl Primzahlen: " + count)
exit()
}
}
def main(args : Array[String]){
val coord = new Coordinate().start()
try {
coord ! Start(args(0).toLong,args(1).toLong,args(2).toLong);
}
catch {
case ex =>
println("Falsche Parameter. Nehme Standardwerte (1, 1000, 500).")
coord ! new Start(1,1000,500);
}
}
scala primes 1 2000000 2000000 //Die Primzahlen innerhalb der ersten 2 000 000 Zahlen werden gezählt mit einem Actor
scala primes 1 2000000 1000000 //Die Primzahlen innerhalb der ersten 2 000 000 Zahlen werden gezählt mit zwei Actors
scala primes 1 2000000 200000 //Die Primzahlen innerhalb der ersten 2 000 000 Zahlen werden gezählt mit zehn Actors